Files
wandering1 36a3c3449c refactor(task): 19 处任务句柄裸 extern 收拢为 task_handles.h 引用契约
推荐清单第 3 步(结构债 S-2 剩余面),用户批准"按你推荐做"。

新建 `App/task/task_handles.h`——**只有声明、没有 `.c`**:头文件不需要双端注册,
且 `../App/task` 本来就在 uvprojx 的 `<IncludePath>` 里,所以这一步零构建面。

- `App/task/default_task.c:52-69` 的 18 行局部 extern(9 个句柄 + 9 个 attributes)
  删除,改 include;栈水位观测用的任务清单表本体仍留在该文件
- `App/task/adc_task.c:125` 的 1 行同法收口
- `Src/main.c` 函数内的 `extern volatile uint32_t g_rcc_csr_latched;` 移进
  `App/app/app_main.h`(`main.c` 本来就 include 它),USER CODE 区内只留"读
  RCC_CSR → 写 RMVF 清除"两句,顺序约束的原注释保留

为什么值得做:原先每加一个任务都得记得往 `default_task.c` 再抄两行 extern,抄
漏一行 = 读别人的栈(静默,无报错)。现在只有一个改动点;而且 CubeMX 若把句柄
改名,报错会落在链接期而不是静默通过。

**镜像逐项体积不变**:`Code=213,188 RO-data=18,580 RW-data=1,184
ZI-data=131,504`,`@build` 0 错 0 警告 → 行为中性。

`check_cubemx_survival.py` 对这次有意的 USER CODE 区改动报"漂移",已按其文档流程
`--write` 重建基线(`.cubemx_survival_baseline.json` 仅 1 个指纹变化;顺手把该脚本
写文件带来的 CRLF 归一回 LF,符合 `* text=auto eol=lf`),`--check` 复跑通过、易失
清单 29 项全部到位。

报告 §0.4/§9 的 S-2 口径同时改成**精确分类**:该修的手写跨模块裸 extern **24 处,
今天已消 22 处,只剩 2 处**(`ch395f.c:177` 的 `g_spi1_dma_done` 与 `net_socket.c:77`
的 `netMsgQueueHandle`);`stm32f4xx_it.c:241-256` 那 16 条是 CubeMX「External
variables」生成块(删了会被重生成写回来,**不算债**),`:183/195/207/220` 那 4 条
是手写在 `__asm` Handler 里引用汇编标签(ARMCC `__asm` 取不到 C 数据符号,
**合法例外**)。上一版写的"25 处"把这三类混在一起了,一并更正。另更正 §0.4 的
S-1 一格:不是"运行时属主纪律被破"(UI 只投递 `net_cfg_save_request()`,写盘在
defaultTask),也不是"进不了主机侧单测"(模拟器已跑整条链),要修的只是静态分层
方向。

门禁:`@build` 0/0;`cubemx-survival --check` 通过;`check_doc_links.py --all
--sections-strict` 146 文档 0 问题;`check_ids.py --strict` 增量拦截通过、可判定
82.83%;`mem-numbers` 0。字节卫生:新增头文件与各改动文件 BOM 无 / CR 0 /
U+FFFD 0。未推送。
2026-10-22 19:09:20 +08:00

56 lines
2.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* 模块名称:Task Handles(内核任务句柄与属性块的集中声明)
* 模块功能:把散落在各 .c 里的跨文件裸 extern 收拢成一份有名字的契约,供栈水位观测、
* 看门狗位图、按句柄取剩余栈等消费方引用
* 适用平台:STM32F407ZGTx
* 作者:王建锋
* 创建日期:2026-10-22
* 修改记录:
* v1.0 2026-10-22 王建锋 从 App/task/default_task.c 的 18 行局部 extern 收拢而来。
* 唯一定义处仍是 Src/freertos.c(CubeMX 生成的任务表),本文件
* 只是引用契约:新增/改名任务必须同步这里,否则报错落在链接期
* 而不是静默——这是有意的(原先每加一个任务就往 default_task.c
* 再抄两行 extern,抄漏一行就是读别人的栈)。
*/
#ifndef TASK_HANDLES_H
#define TASK_HANDLES_H
#include "cmsis_os.h" /* osThreadId_t / osThreadAttr_t */
#ifdef __cplusplus
extern "C" {
#endif
/*
* 以下符号全部定义于 Src/freertos.c(CubeMX 任务表,只写 USER CODE 区,不可外移)。
* p_attr->stack_size 是「配置栈大小」的唯一起点;实测最坏链与余量台账见
* docs/内存管理/RAM使用分析与优化方案.md 的 2.3 与 4.0.6 小节(此处不重复数字)。
* testTask 仅在启用板级测试套件时创建,未创建时句柄为 NULL(消费方须判空)。
*/
extern osThreadId_t defaultTaskHandle;
extern osThreadId_t netTaskHandle;
extern osThreadId_t ftpTaskHandle;
extern osThreadId_t testTaskHandle;
extern osThreadId_t uiTaskHandle;
extern osThreadId_t timeSyncTaskHandle;
extern osThreadId_t adcTaskHandle;
extern osThreadId_t iec104TaskHandle;
extern osThreadId_t protectTaskHandle;
extern const osThreadAttr_t defaultTask_attributes;
extern const osThreadAttr_t netTask_attributes;
extern const osThreadAttr_t ftpTask_attributes;
extern const osThreadAttr_t testTask_attributes;
extern const osThreadAttr_t uiTask_attributes;
extern const osThreadAttr_t timeSyncTask_attributes;
extern const osThreadAttr_t adcTask_attributes;
extern const osThreadAttr_t iec104Task_attributes;
extern const osThreadAttr_t protectTask_attributes;
#ifdef __cplusplus
}
#endif
#endif /* TASK_HANDLES_H */