diff --git a/firmware/esp32-csi-node/main/edge_processing.c b/firmware/esp32-csi-node/main/edge_processing.c index 9f88ddb2..ea67738c 100644 --- a/firmware/esp32-csi-node/main/edge_processing.c +++ b/firmware/esp32-csi-node/main/edge_processing.c @@ -849,6 +849,8 @@ static void process_frame(const edge_ring_slot_t *slot) /* --- Step 11: Multi-person vitals --- */ update_multi_person_vitals(slot->iq_data, n_subcarriers, sample_rate); + /* Yield after multi-person DSP so IDLE1 can feed Core 1 watchdog (#683). */ + if (s_cfg.tier >= 2) vTaskDelay(1); /* --- Step 12: Delta compression --- */ if (s_cfg.tier >= 2) { @@ -894,6 +896,8 @@ static void process_frame(const edge_ring_slot_t *slot) wasm_runtime_on_frame(phases, amplitudes, variances, n_subcarriers, (const edge_vitals_pkt_t *)&s_latest_pkt); + /* Yield after WASM dispatch to feed Core 1 watchdog (#683). */ + vTaskDelay(1); } } diff --git a/firmware/esp32-csi-node/release_bins/bootloader.bin b/firmware/esp32-csi-node/release_bins/bootloader.bin index 5dd2df2e..caeb13be 100644 Binary files a/firmware/esp32-csi-node/release_bins/bootloader.bin and b/firmware/esp32-csi-node/release_bins/bootloader.bin differ diff --git a/firmware/esp32-csi-node/release_bins/esp32-csi-node-4mb.bin b/firmware/esp32-csi-node/release_bins/esp32-csi-node-4mb.bin index 70f4a050..4ff7245c 100644 Binary files a/firmware/esp32-csi-node/release_bins/esp32-csi-node-4mb.bin and b/firmware/esp32-csi-node/release_bins/esp32-csi-node-4mb.bin differ diff --git a/firmware/esp32-csi-node/release_bins/esp32-csi-node.bin b/firmware/esp32-csi-node/release_bins/esp32-csi-node.bin index a7be017b..150988d9 100644 Binary files a/firmware/esp32-csi-node/release_bins/esp32-csi-node.bin and b/firmware/esp32-csi-node/release_bins/esp32-csi-node.bin differ diff --git a/firmware/esp32-csi-node/release_bins/partition-table-4mb.bin b/firmware/esp32-csi-node/release_bins/partition-table-4mb.bin index ad0d4b78..d6a05b65 100644 Binary files a/firmware/esp32-csi-node/release_bins/partition-table-4mb.bin and b/firmware/esp32-csi-node/release_bins/partition-table-4mb.bin differ diff --git a/firmware/esp32-csi-node/release_bins/version.txt b/firmware/esp32-csi-node/release_bins/version.txt index f5ae7e6d..bb8d5b7a 100644 --- a/firmware/esp32-csi-node/release_bins/version.txt +++ b/firmware/esp32-csi-node/release_bins/version.txt @@ -1,3 +1,3 @@ -0.6.5 -git-sha: d72e06fc8 -built: 2026-05-20 +0.6.6 +git-sha: cbcb389cb (pre-commit) +built: 2026-05-21 diff --git a/firmware/esp32-csi-node/version.txt b/firmware/esp32-csi-node/version.txt index e0ea44c1..bf21f525 100644 --- a/firmware/esp32-csi-node/version.txt +++ b/firmware/esp32-csi-node/version.txt @@ -1 +1 @@ -0.6.5 \ No newline at end of file +0.6.6 \ No newline at end of file diff --git a/scripts/fix-markers.json b/scripts/fix-markers.json index aad41148..ba6466f1 100644 --- a/scripts/fix-markers.json +++ b/scripts/fix-markers.json @@ -222,6 +222,17 @@ "forbid": ["/csi_collector_init.*node_id\\s*=\\s*1[^0-9]/"], "rationale": "release_bins/ shipped v0.4.3.1 binaries that lacked csi_collector_set_node_id() — every provisioned node reported node_id=1 over UDP regardless of NVS value, making a 4-node deployment look like a single node. main.c must call csi_collector_set_node_id(g_nvs_config.node_id) immediately after nvs_config_load() and before wifi_init_sta(). Reverting silently breaks multi-node deployments with no build-time error.", "ref": "https://github.com/ruvnet/RuView/issues/679" + }, + { + "id": "RuView#683", + "title": "ESP32-S3 edge tier>=2: vTaskDelay(1) after multi-person vitals and WASM dispatch prevents IDLE1 starvation / WDT storm", + "files": ["firmware/esp32-csi-node/main/edge_processing.c"], + "require": [ + "if (s_cfg.tier >= 2) vTaskDelay(1);", + "Yield after WASM dispatch to feed Core 1 watchdog (#683)" + ], + "rationale": "At edge tier>=2 on N16R8 PSRAM boards, process_frame() runs update_multi_person_vitals() (4 persons × 256 history samples) plus wasm_runtime_on_frame() back-to-back. The vTaskDelay(1) in edge_task() only fires AFTER process_frame() fully returns — if process_frame() takes >5 s (common on PSRAM-backed boards under sustained 30 pps CSI load), IDLE1 on Core 1 never runs and the Task Watchdog Timer fires. The fix adds two vTaskDelay(1) calls inside process_frame(), gated on tier>=2, at the multi-person vitals boundary and after WASM dispatch. Removing them re-opens the WDT storm on N16R8 hardware.", + "ref": "https://github.com/ruvnet/RuView/issues/683" } ] }