diff --git a/.cubemx_survival_baseline.json b/.cubemx_survival_baseline.json index fa05f149..ae4e16f9 100644 --- a/.cubemx_survival_baseline.json +++ b/.cubemx_survival_baseline.json @@ -19,7 +19,7 @@ "hal-iwdg-enabled": "1a8ed6cff34f7ba6", "ioc-keepusercode": "b5bea41b6c623f7c", "ioc-iwdg-present": "d3a6e667048c95db", - "ioc-task-stacks": "3262f737d92dcbee", + "ioc-task-stacks": "58ee94dd2a093177", "adc1-hal-enabled": "1a8ed6cff34f7ba6", "adc1-calibration-call": "8d5f4b40fb218913", "adc1-calibration-impl": "d33bc4323e243248", diff --git a/AGENTS.md b/AGENTS.md index c46a9c43..86da624d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -52,12 +52,12 @@ | Task | 栈 (words) | 优先级 | |---|---|---| -| defaultTask | 1024 | Normal | +| defaultTask | 1280 | Normal | | netTask | 960 | Normal | | ftpTask | 1024 | Normal | | testTask | 2048 | BelowNormal | | uiTask | 4096 | BelowNormal | -| timeSyncTask | 512 | Normal | +| timeSyncTask | 640 | Normal | | adcTask | 640 | AboveNormal | | iec104Task | 640 | Normal | | protectTask | 512 | Normal | diff --git a/README.md b/README.md index 13436d06..1ba2a7f1 100644 --- a/README.md +++ b/README.md @@ -69,12 +69,12 @@ main.c | 任务 | 栈大小 | 优先级 | 职责 | |------|--------|--------|------| -| defaultTask | 1024 words | Normal | FTL + FatFS 挂载、配置引擎属主、syslog 唯一写者 | +| defaultTask | 1280 words | Normal | FTL + FatFS 挂载、配置引擎属主、syslog 唯一写者 | | netTask | 960 words | Normal | 网络初始化 + CH395F 轮询 | | ftpTask | 1024 words | Normal | FTP 服务(等待网络+存储就绪) | | testTask | 2048 words | BelowNormal | 硬件测试入口 | | uiTask | 4096 words | BelowNormal | LVGL UI 界面 | -| timeSyncTask | 512 words | Normal | 墙钟时间同步 | +| timeSyncTask | 640 words | Normal | 墙钟时间同步 | | adcTask | 640 words | AboveNormal | TPAFE5160 采样(TIM3 1kHz 事件驱动 + 原子快照 + STM32 ADC DMA) | | iec104Task | 640 words | Normal | | | protectTask | 512 words | Normal | | diff --git a/STM32F407-Demo.ioc b/STM32F407-Demo.ioc index 54b08b4c..8bc3cd4b 100644 --- a/STM32F407-Demo.ioc +++ b/STM32F407-Demo.ioc @@ -119,7 +119,7 @@ FREERTOS.Events01=sys_evt,Dynamic,NULL FREERTOS.FootprintOK=true FREERTOS.IPParameters=Tasks01,configENABLE_FPU,FootprintOK,configTOTAL_HEAP_SIZE,Queues01,Events01,configCHECK_FOR_STACK_OVERFLOW,configUSE_MALLOC_FAILED_HOOK FREERTOS.Queues01=netMsgQueue,8,net_msg_t,0,Dynamic,NULL,NULL -FREERTOS.Tasks01=defaultTask,24,1024,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;netTask,24,960,StartNetTask,Default,NULL,Dynamic,NULL,NULL;ftpTask,24,1024,StartFtpTask,As weak,NULL,Dynamic,NULL,NULL;testTask,16,2048,start_test_task,As weak,NULL,Dynamic,NULL,NULL;uiTask,16,4096,StartUiTask,Default,NULL,Dynamic,NULL,NULL +FREERTOS.Tasks01=defaultTask,24,1280,StartDefaultTask,Default,NULL,Dynamic,NULL,NULL;netTask,24,960,StartNetTask,Default,NULL,Dynamic,NULL,NULL;ftpTask,24,1024,StartFtpTask,As weak,NULL,Dynamic,NULL,NULL;testTask,16,2048,start_test_task,As weak,NULL,Dynamic,NULL,NULL;uiTask,16,4096,StartUiTask,Default,NULL,Dynamic,NULL,NULL FREERTOS.configCHECK_FOR_STACK_OVERFLOW=2 FREERTOS.configENABLE_FPU=1 FREERTOS.configTOTAL_HEAP_SIZE=57344 diff --git a/Src/freertos.c b/Src/freertos.c index 31d2fbe1..4c6aba7c 100644 --- a/Src/freertos.c +++ b/Src/freertos.c @@ -94,7 +94,7 @@ static int hook_ptr_ok(const void *p) * 底线规则:余量 ≥ max(1024 B ISR, 30%)。完整核算见 docs/内存管理/RAM使用分析与优化方案.md, * 全表(含 ftpTask 1024 / uiTask 4096 的现值)见 AGENTS.md 任务表。 * - * defaultTask 1024 words:扛 mount+mkfs+FAT 探针+cfg 加载+syslog 写+配置引擎 + * defaultTask 1280 words:扛 mount+mkfs+FAT 探针+cfg 加载+syslog 写+配置引擎 * (全深层 FatFS I/O)。原 512,2KB 实测峰值溢出——开启 * configCHECK_FOR_STACK_OVERFLOW=2 后被钩子抓到(2026-09-21)。 * 2026-10-10 栈整改(**未抬栈**,靠削链达标):静态最坏链 5312 → 2776 B、 @@ -104,6 +104,10 @@ static int hook_ptr_ok(const void *p) * + 时间戳缓冲并入行缓冲(每个日志调用点原内联 192+32 B);④ 断言/故障钩子 * 脱离 HAL 发送回退 + 缓冲静态化(configASSERT 在 FreeRTOS 内部可达 → * 钩子在**每个**任务的最坏链尾)。详见 docs/内存管理/RAM使用分析与优化方案.md + * N-33(2026-10-12):B7 定值持久化把静态最坏链推到 **3016 B**(storage_bring_up → + * cfg 写 → f_rename → sync_fs → dhara GC → 控制台回显尾),1024 words 时余 + * 1080 B < 30% 线(4096×30% = 1228 B)→ 抬至 **1280 words**(5120 B),余 + * 2104 B / 41%;堆开销 +1024 B。栈值事实源仍是 `.ioc` 的 `FREERTOS.Tasks01`。 * netTask 960 words:静态最坏链 1872 B(2026-10-10 整改后;整改前 2664 B: * 发送停滞→断连→重监听→SPI 故障→日志尾,日志主导);3840 B 配置余量 1968 B * (51%),过 stack_report 规则。运行时水位仅 ~0.9 KB(错误尾未 @@ -111,10 +115,14 @@ static int hook_ptr_ok(const void *p) * (ARMCC 已叠放不重叠局部量)反增 256 B BSS,已回退——见 net_socket.c 注释。 * testTask 2048 words:存储套件 deep call chain + 局部缓冲,原 1024(4 KB)实测溢出 * (2026-09-20)。仅启用测试套件时创建。 - * timeSyncTask 512 words:本区下方手工定义(不在 `.ioc` 的 Tasks01 里 → 重生成会丢, + * timeSyncTask 640 words:本区下方手工定义(不在 `.ioc` 的 Tasks01 里 → 重生成会丢, * 靠审计 WARN 提示),建监听 → net_bind → CH395F → 日志尾。2026-10-10 整改后 * 静态最坏链 1024 B(整改前 1736 B)、实测峰值 616 B;⚠ 余量 1024 B **正好** * 等于 ISR 底线 → 本任务链上再加任何调用(或新日志行)都必须先抬栈。 + * N-33(2026-10-12):链已加深到 **1264 B**(同一控制台回显尾:`dbg_console_drain` + * → `MX_USART1_UART_Init` → `Error_Handler` → 回显 Cycle),512 words 时余 + * 784 B < 1024 B ISR 底线 → 抬至 **640 words**(2.5 KB),余 1296 B / 50%; + * 堆开销 +512 B。 * adcTask 640 words:本区下方手工定义(同上,不在 `.ioc` 里)。B1(2026-10-10) * ADC 采集消费者;L2 相量(2026-10-11)+ L1-6 有效性校验(同日)后链上为 * adc_input_poll + sample_ring/phasor + adc_health_report(DBG_ERROR + @@ -133,7 +141,7 @@ static int hook_ptr_ok(const void *p) osThreadId_t timeSyncTaskHandle; const osThreadAttr_t timeSyncTask_attributes = { .name = "timeSyncTask", - .stack_size = 512 * 4, + .stack_size = 640 * 4, .priority = (osPriority_t) osPriorityNormal, }; /* B1(2026-10-10):ADC 采集消费者(TIM6 1 kHz 采样节拍 + 原子快照 + 帧统计)。 @@ -176,7 +184,7 @@ const osThreadAttr_t protectTask_attributes = { osThreadId_t defaultTaskHandle; const osThreadAttr_t defaultTask_attributes = { .name = "defaultTask", - .stack_size = 1024 * 4, + .stack_size = 1280 * 4, .priority = (osPriority_t) osPriorityNormal, }; /* Definitions for netTask */