修复IWDG超时未配置与dhara resume回滚:看门狗误复位与复位后写入全部丢失,台架全量自检PASS
This commit is contained in:
+25
-1
@@ -15,6 +15,10 @@
|
||||
* v1.0 2026-09-25 王建锋 自 Src/freertos.c 迁出 StartDefaultTask 任务体及
|
||||
* stack_probe_poll / storage_bring_up / 保存通知回调
|
||||
* (CubeMX 生成文件只留任务创建接线与崩溃钩子)
|
||||
* v1.1 2026-10-02 王建锋 存储 bring-up 首行创建卷锁(vol_lock_init,幂等):
|
||||
* FTP 文件操作与 syslog/配置的卷访问自此串行化
|
||||
* (2026-10-02 台架:并发 FTL 写 → journal 竞争 →
|
||||
* 本任务主循环喂狗点饥饿 → IWDG 误复位)
|
||||
*/
|
||||
|
||||
#include "default_task.h"
|
||||
@@ -31,6 +35,7 @@
|
||||
#include "sys_events.h"
|
||||
#include "dbg_log.h"
|
||||
#include "task_watchdog.h"
|
||||
#include "vol_lock.h"
|
||||
|
||||
/* 任务句柄与属性块(CubeMX 生成全局,定义于 Src/freertos.c):
|
||||
* 栈水位观测需 6 任务句柄 + 属性块 stack_size(配置栈大小的唯一定义处) */
|
||||
@@ -96,6 +101,8 @@ static FRESULT storage_bring_up(FATFS *fs);
|
||||
void default_task_func(void *argument) {
|
||||
(void)argument;
|
||||
|
||||
task_wd_bind(TASK_WD_DEFAULT); /* FTL 心跳路由:登记本任务句柄(入口一次) */
|
||||
|
||||
/* 系统启动期挂载 NAND 上的 FatFS 卷,供 FTP 及其它模块访问。
|
||||
* f_mount(forced=1) 会触发 disk_initialize() → nand_ftl_init()
|
||||
* (dhara_map_resume)。此前默认构建从未挂载,导致 FTP 的
|
||||
@@ -159,26 +166,34 @@ void default_task_func(void *argument) {
|
||||
task_wd_start();
|
||||
|
||||
for (;;) {
|
||||
/* round 8 取证:进段打点——每步前记录段号到 .noinit 槽(复位不丢)。
|
||||
* 误复位后开机 `PREVRUN seg=N` 即"上一轮主循环死在哪个调用点"
|
||||
* (round 7 结论 = poller 自身停摆,见 实机测试规划.md §0.5.4)。 */
|
||||
task_wd_seg(TASK_WD_SEG_POLL);
|
||||
/* 心跳抽样与喂狗判定(内部节流至 100ms;全员到位才喂,否则累计停喂) */
|
||||
task_wd_poll();
|
||||
/* 本任务自己的心跳 */
|
||||
task_wd_beat(TASK_WD_DEFAULT);
|
||||
/* 等待"保存网络配置"或"控制台待发":任一即醒;无事件 50ms 后返回
|
||||
* (日志时延 = 事件唤醒,实测无丢失;50ms 兜底仅防事件位异常) */
|
||||
task_wd_seg(TASK_WD_SEG_EVTWAIT);
|
||||
if (sys_evtHandle != NULL) {
|
||||
(void)osEventFlagsWait(sys_evtHandle,
|
||||
SYS_EVT_CFG_SAVE | SYS_EVT_CONSOLE_TX,
|
||||
osFlagsWaitAny, 50u);
|
||||
}
|
||||
/* 控制台唯一发送点:把环形缓冲中的日志按块发出(无待发时立即返回) */
|
||||
task_wd_seg(TASK_WD_SEG_DRAIN);
|
||||
dbg_console_drain();
|
||||
/* 执行待处理保存(配置引擎属主:写盘 + 成功后立即应用);无请求 = 空操作 */
|
||||
#if !defined(TEST_SUITE_STORAGE)
|
||||
task_wd_seg(TASK_WD_SEG_CFGSAVE);
|
||||
net_cfg_save_run();
|
||||
#endif
|
||||
/* 配置文件变更轮询(2s 周期;沉降去抖在引擎内) */
|
||||
if ((cfg_poll_cnt++ % 40u) == 0u) {
|
||||
#if !defined(TEST_SUITE_STORAGE)
|
||||
task_wd_seg(TASK_WD_SEG_CFGPOLL);
|
||||
/* E-31 自愈:启动期挂载失败时,每 2s 重跑完整 bring-up——
|
||||
* 瞬态毛刺(如 dhara resume 扫描的瞬时 SPI 故障)通常第二次
|
||||
* 即恢复;成功后由 storage_bring_up 补跑启动时跳过的
|
||||
@@ -201,6 +216,7 @@ void default_task_func(void *argument) {
|
||||
}
|
||||
/* LED 心跳:500ms 翻转一次(与旧 500ms 循环节奏等效;循环基准改 50ms 后
|
||||
* 不能再每轮翻转,否则变成 10Hz 闪烁) */
|
||||
task_wd_seg(TASK_WD_SEG_LED);
|
||||
if ((HAL_GetTick() - led_tick) >= 500u) {
|
||||
led_tick = HAL_GetTick();
|
||||
HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
|
||||
@@ -209,9 +225,11 @@ void default_task_func(void *argument) {
|
||||
}
|
||||
#if !defined(TEST_SUITE_STORAGE)
|
||||
/* 排空运行期日志(上电/重启分类与自检故障落盘) */
|
||||
task_wd_seg(TASK_WD_SEG_SYSLOG);
|
||||
syslog_drain();
|
||||
#endif
|
||||
/* 栈水位观测:首次 5s 后报告,此后每 2s 采样、出现更深峰值才打印 */
|
||||
task_wd_seg(TASK_WD_SEG_STACK);
|
||||
stack_probe_poll();
|
||||
}
|
||||
}
|
||||
@@ -322,7 +340,13 @@ static void stack_probe_poll(void) {
|
||||
*/
|
||||
#if !defined(TEST_SUITE_STORAGE)
|
||||
static FRESULT storage_bring_up(FATFS *fs) {
|
||||
FRESULT fr = f_mount(fs, "", 1);
|
||||
FRESULT fr;
|
||||
|
||||
/* 卷锁创建(幂等):必须早于本卷任何跨任务使用者——ftpTask 的 lftpd 文件
|
||||
* 操作受 STORAGE_READY 屏障门控,屏障在本函数末尾才置位,时序天然安全 */
|
||||
(void)vol_lock_init();
|
||||
|
||||
fr = f_mount(fs, "", 1);
|
||||
|
||||
if (fr == FR_NO_FILESYSTEM) {
|
||||
/* 卷为空(如恢复/坏块重建后清空):自动格式化建卷
|
||||
|
||||
Reference in New Issue
Block a user