diff --git a/Src/freertos.c b/Src/freertos.c index ba97a248..177ed359 100644 --- a/Src/freertos.c +++ b/Src/freertos.c @@ -266,8 +266,10 @@ void StartDefaultTask(void *argument) DBG_INFO("[FS] mount/cfg skipped (STORAGE suite owns storage)"); #endif - /* 配置 poll 周期计数(每 4 次循环 = 2s 轮询一次,与引擎文档/模拟器一致) */ + /* 配置 poll 周期计数(每 40 次循环 = 2s 轮询一次,与引擎文档/模拟器一致。 + * 循环基准 50ms:控制台"待发"事件即时唤醒,无事件时 50ms 兜底,日志时延 <=50ms) */ uint32_t cfg_poll_cnt = 0u; + uint32_t led_tick = HAL_GetTick(); /* 注册控制台写者:本任务此后是串口唯一发送者(其余任务只写环形缓冲)。 * 见 Src/usart.c "控制台单写者日志"——消除并发写造成的日志逐字符交错, @@ -275,12 +277,12 @@ void StartDefaultTask(void *argument) dbg_console_writer_attach(); for (;;) { - /* 等待"保存网络配置"或"控制台待发":任一即醒;无事件 500ms 后返回 - * (取代原 osDelay(500):循环节奏不变,保存/日志响应零空转) */ + /* 等待"保存网络配置"或"控制台待发":任一即醒;无事件 50ms 后返回 + * (日志时延 = 事件唤醒,实测无丢失;50ms 兜底仅防事件位异常) */ if (sys_evtHandle != NULL) { (void)osEventFlagsWait(sys_evtHandle, SYS_EVT_CFG_SAVE | SYS_EVT_CONSOLE_TX, - osFlagsWaitAny, 500u); + osFlagsWaitAny, 50u); } /* 控制台唯一发送点:把环形缓冲中的日志按块发出(无待发时立即返回) */ dbg_console_drain(); @@ -289,7 +291,7 @@ void StartDefaultTask(void *argument) net_cfg_save_run(); #endif /* 配置文件变更轮询(2s 周期;沉降去抖在引擎内) */ - if ((cfg_poll_cnt++ & 3u) == 0u) { + if ((cfg_poll_cnt++ % 40u) == 0u) { #if !defined(TEST_SUITE_STORAGE) /* E-31 自愈:启动期挂载失败时,每 2s 重跑完整 bring-up—— * 瞬态毛刺(如 dhara resume 扫描的瞬时 SPI 故障)通常第二次 @@ -311,9 +313,14 @@ void StartDefaultTask(void *argument) cfg_file_poll(); #endif } - HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); - HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); - HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); + /* LED 心跳:500ms 翻转一次(与旧 500ms 循环节奏等效;循环基准改 50ms 后 + * 不能再每轮翻转,否则变成 10Hz 闪烁) */ + if ((HAL_GetTick() - led_tick) >= 500u) { + led_tick = HAL_GetTick(); + HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin); + HAL_GPIO_TogglePin(LED2_GPIO_Port, LED2_Pin); + HAL_GPIO_TogglePin(LED3_GPIO_Port, LED3_Pin); + } #if !defined(TEST_SUITE_STORAGE) /* 排空运行期日志(上电/重启分类与自检故障落盘) */ syslog_drain();