CubeMX 生成 ADC1(9 通道)+ 复原重生成定制,FreeRTOS 加固迁 L1、钩子落 USER CODE 4/5,门禁豁免生成文件空白改写

This commit is contained in:
2026-10-10 00:53:20 +08:00
parent 718d399f70
commit 5eed2151de
25 changed files with 10250 additions and 551 deletions
+52 -13
View File
@@ -147,22 +147,33 @@ CHECKS = [
"须在 USER CODE BEGIN 0 区内(生成区内的标准保护位)。",
),
# ---------------- P1:FreeRTOS 加固 ----------------
# ⚠ 2026-10-09 升级:这两项原先靠 FreeRTOSConfig.h 里**自造**的
# `USER CODE BEGIN FREE_RTOS_CONFIG_HARDENING` 区——模板不认这个区名,
# 重生成连标记带内容一起消失(实测两次)。现已改为 **L1 写进 .ioc**:
# GUI = FreeRTOS 页 → "Config parameters" 标签 → "Hook function related
# definitions" 组 → CHECK_FOR_STACK_OVERFLOW=2 / USE_MALLOC_FAILED_HOOK=1,
# 由 CubeMX 模板自己生成到 FreeRTOSConfig.h,永不被打回。
dict(
id="stack-overflow-check",
kind="protected",
path="Inc/FreeRTOSConfig.h",
region="FREE_RTOS_CONFIG_HARDENING",
must_contain=["configCHECK_FOR_STACK_OVERFLOW"],
hint="栈溢出机械检测必须开启(模式 2)。关闭后溢出静默腐蚀堆相邻块。",
kind="ioc",
key="FREERTOS.configCHECK_FOR_STACK_OVERFLOW",
want="2",
hint="栈溢出机械检测(模式 2)必须在 .ioc 里(GUI: FreeRTOS → Config parameters → "
"Hook function related definitions)。关闭后溢出静默腐蚀堆相邻块。",
),
dict(
id="malloc-failed-hook",
kind="protected",
path="Inc/FreeRTOSConfig.h",
region="FREE_RTOS_CONFIG_HARDENING",
must_contain=["configUSE_MALLOC_FAILED_HOOK"],
hint="堆分配失败钩子必须开启(1)。",
kind="ioc",
key="FREERTOS.configUSE_MALLOC_FAILED_HOOK",
want="1",
hint="堆分配失败钩子必须在 .ioc 里(同上 GUI 位置)。",
),
# ⚠ 2026-10-09 连带坑与最终落点:在 GUI 里启用这两个钩子后,CubeMX 会在 freertos.c
# 生成 `USER CODE BEGIN 4 / 5` 区(默认内容是空桩)。若把我们的实现留在
# `Application` 区、又留着生成桩 → **同名函数两处定义 = 编译错**。
# 最终落点(比"每次删桩"更稳):**整个钩子函数写进 4 / 5 区**——区名由 CubeMX
# 生成、且其存在由 `.ioc` 启用钩子保证,重生成时 CubeMX 只保留区内容、不再补桩。
# 配套 helper `hook_ptr_ok()` 必须在钩子之前定义,故放 `USER CODE BEGIN PD` 区。
dict(
id="assert-not-deadloop",
kind="protected",
@@ -185,9 +196,26 @@ CHECKS = [
id="stack-overflow-hook-impl",
kind="protected",
path="Src/freertos.c",
region="Application",
must_contain=["vApplicationStackOverflowHook"],
hint="栈溢出钩子实现(打印任务名后复位)。",
region="4",
must_contain=["vApplicationStackOverflowHook", "STACK OVERFLOW", "NVIC_SystemReset"],
hint="栈溢出钩子实现(裸 UART 打任务名后复位)须**整体**写在 `USER CODE BEGIN 4` 区内。",
),
dict(
id="malloc-failed-hook-impl",
kind="protected",
path="Src/freertos.c",
region="5",
must_contain=["vApplicationMallocFailedHook", "MALLOC FAILED"],
hint="堆分配失败钩子实现(只告警不复位)须**整体**写在 `USER CODE BEGIN 5` 区内。",
),
dict(
id="stack-overflow-hook-helper",
kind="protected",
path="Src/freertos.c",
region="PD",
must_contain=["hook_ptr_ok"],
hint="任务名指针范围校验 helper 须在钩子之前定义(现放 `USER CODE BEGIN PD` 区);"
"缺了它,钩子会因不可信 TCB 指针二次崩溃(2026-09-24 实测 HardFault)。",
),
# ---------------- 看门狗模块 ----------------
dict(
@@ -250,6 +278,17 @@ CHECKS = [
hint="任务栈大小必须写在 .ioc(FREERTOS.Tasks01)里——写入 .ioc 的栈值"
"会被 CubeMX 直接生成到 freertos.c,是最彻底的防丢失手段。",
),
# ---------------- ADC1(2026-10-09 首次启用) ----------------
dict(
id="adc1-hal-enabled",
kind="generated",
path="Inc/stm32f4xx_hal_conf.h",
must_contain=["#define HAL_ADC_MODULE_ENABLED"],
hint="HAL_ADC_MODULE_ENABLED 须为**生效**状态(非注释),否则 adc.c 不参与编译。",
),
# 注:ADC 时钟分频**不设防护**(2026-10-09 决定)。CubeMX 面板里 DIV2 已被约束禁用
# (FadcConstraint Max=36000000;APB2=84 MHz → DIV2=42 MHz 超限,选不到),
# .ioc 虽不保存 ADC1.ClockPrescaler 键,重生成也只会回落到约束允许的值。
]