fix(stack): N-33 抬栈收口 defaultTask/timeSyncTask 栈余量(2 FAIL -> 0 FAIL)

既有债收口(非新引入):B7 定值持久化把 defaultTask 静态最坏链推到
3016 B、timeSyncTask 推到 1264 B,两者跌破 stack_report 判据
(余量 >= max(1024 B ISR, 配置 x 30%))。本轮只抬栈,不动调用链。

前基线(stack_report,9 任务):
- defaultTask  cfg 4096 B / 静态 3016 B / 余 1080 B (26%)  FAIL
- timeSyncTask cfg 2048 B / 静态 1264 B / 余  784 B (38%)  FAIL
- 其余 7 任务 PASS(net 2112/1728、ftp 1456/2640、ui 1336/15048、
  test 736/7456、adc 1320/1240、iec104 1456/1104、protect 872/1176)

改动:
- defaultTask 1024 -> 1280 words(4096 -> 5120 B):余 2104 B / 41%
- timeSyncTask 512 -> 640 words(2048 -> 2560 B):余 1296 B / 50%
- 后基线:9 任务 0 FAIL(stack_report 退出码 0)

堆开销(任务栈来自 FreeRTOS 堆,.map 静态数字不变):
- defaultTask +1024 B、timeSyncTask +512 B,合计 +1536 B
- 台架背书基线 heap free=17936 / min_ever=10000 B(B6),抬后
  min_ever 预计 ~8464 B,仍远高于 3072 B 告警线

防丢失(CubeMX 存活 L1 纪律):
- STM32F407-Demo.ioc 的 FREERTOS.Tasks01 同步改 1024 -> 1280
  (.ioc 是 CubeMX 生成任务栈值的事实源,未跑重生成)
- Src/freertos.c 生成区 .stack_size 与 .ioc 保持一致
- USER CODE BEGIN Variables 核算注释块补 N-33 依据(栈值理由唯一落点)
- .cubemx_survival_baseline.json 经 --write 重建(仅 ioc-task-stacks 一行)

task-table 生成区随栈变更再生成(README.md + AGENTS.md 的
TASK_TABLE 锚点区各 2 行,锚点区外无任何改动)。

验证:@build 0 错误 0 警告(Program Size 与改前逐字节一致);
ci_local 全绿(L0 + L0.5,826/826 断言);stack_report 前后各跑一次。
台架 @test 与串口 [STACK] 水位复测在提交后单独跑。
This commit is contained in:
2026-10-12 17:47:15 +08:00
parent 4262bf6146
commit 51bc325b57
5 changed files with 18 additions and 10 deletions
+12 -4
View File
@@ -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 */