67d26ac37a
第二次重生成验证了审计机制,并证伪了上一轮的一处假设: - 审计脚本 check_cubemx_survival.py 准确检出全部 5 处覆盖(16 项中 5 FAIL), 机制有效;Src/main.c 复位原因锁存(USER CODE BEGIN Init 区)完好, 是"USER CODE 区有效"的正向证据。 - 关键发现:CubeMX 本次换了一代中断函数模板(旧 HardFault_Handler / HardFault_Report 自造区 → 新函数体内 HardFault_IRQn 0 / W1_HardFault_IRQn 0), "生成区之外的自造标记区"同样不被保留,旧假设被证伪。 恢复方案(第二次升级): - stm32f4xx_it.c:报告实现迁入 USER CODE BEGIN 0(区名从未变过的标准保护位); Handler 本体改为生成区整函数替换,用 #define HardFault_Handler HardFault_Handler_Gen 把生成实体改名保留,链接器自动移除(.map 实证 Removing ... (2 bytes)),向量表指向手工 __asm 版(0x080001a1,18 字节)。 - iwdg.c:去掉 HAL_IWDG_Init() 调用,补 IWDG-DEFER-START-ANCHOR 锚点注释。 - FreeRTOSConfig.h:恢复 FREE_RTOS_CONFIG_HARDENING 块(两个加固宏)。 - freertos.c:补回两处任务栈中文注释(栈值未丢,.ioc 已同步)。 配套: - check_cubemx_survival.py:hardfault-handler 改 wholefile + 锚点检查; UNPROTECTED_LEGACY 清单更新。 - AGENTS.md:新增"CubeMX 换模板"与"ARMCC 内联汇编语法"两条铁律, 以及"uvprojx 被 Keil 自动改写不入库"条目。 - 看门狗设计说明.md:§10.1 补第二次重生成验证结论与模板换代发现, §10.2 L2/L3 全面改写(自造区名不可依赖)。 验证:@build 0 错误 0 警告;pre-commit 13 钩子全通过;审计 16 通过 / 2 警告 / 0 失败。
69 lines
2.7 KiB
C
69 lines
2.7 KiB
C
/* USER CODE BEGIN Header */
|
||
/**
|
||
******************************************************************************
|
||
* @file iwdg.c
|
||
* @brief This file provides code for the configuration
|
||
* of the IWDG instances.
|
||
******************************************************************************
|
||
* @attention
|
||
*
|
||
* Copyright (c) 2026 STMicroelectronics.
|
||
* All rights reserved.
|
||
*
|
||
* This software is licensed under terms that can be found in the LICENSE file
|
||
* in the root directory of this software component.
|
||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||
*
|
||
******************************************************************************
|
||
*/
|
||
/* USER CODE END Header */
|
||
/* Includes ------------------------------------------------------------------*/
|
||
#include "iwdg.h"
|
||
|
||
/* USER CODE BEGIN 0 */
|
||
|
||
/* USER CODE END 0 */
|
||
|
||
IWDG_HandleTypeDef hiwdg;
|
||
|
||
/* IWDG init function */
|
||
void MX_IWDG_Init(void)
|
||
{
|
||
|
||
/* USER CODE BEGIN IWDG_Init 0 */
|
||
|
||
/* USER CODE END IWDG_Init 0 */
|
||
|
||
/* USER CODE BEGIN IWDG_Init 1 */
|
||
|
||
/* USER CODE END IWDG_Init 1 */
|
||
hiwdg.Instance = IWDG;
|
||
hiwdg.Init.Prescaler = IWDG_PRESCALER_64;
|
||
hiwdg.Init.Reload = 1249;
|
||
/* IWDG-DEFER-START-ANCHOR — 本锚点与下方改动一体,重生成会一并消失,
|
||
* 供 scripts/check_cubemx_survival.py 检出(勿删):
|
||
*
|
||
* ⚠ 本行为生成区改动(生成区里**唯一**被手工改的一句,2026-09-29 起):
|
||
* 原为 `if (HAL_IWDG_Init(&hiwdg) != HAL_OK) { Error_Handler(); }`。
|
||
* 原因:HAL_IWDG_Init() 内部第一句即 __HAL_IWDG_START()(立即启动看门狗,
|
||
* 之后不可停、只能复位)。而本函数被 CubeMX 插在 main() 的 MX_*_Init 序列里,
|
||
* 早于 app_main_init()——那段含 NAND 初始化/RTC/ADC,耗时可达数秒且无喂狗点,
|
||
* 按 2.5s 超时最坏值(≈1.7s)必然复位 → **开机死循环**(2026-09-29 实测确认)。
|
||
* 故只填参数不启动;启动移交 task_wd_start()(App/util/task_watchdog.c),
|
||
* 由 defaultTask 在存储 bring-up 完成后调用——即"启动段不喂狗、主循环段才喂"
|
||
* (见 docs/子系统设计/看门狗设计说明.md §4.5 决策 C)。
|
||
*
|
||
* ⚠ 若 CubeMX 重生成覆盖此处,症状 = **开机即复位**(LED 不闪、日志停在早期)。
|
||
* 恢复方法:删掉 HAL_IWDG_Init 调用,改为本注释形态(含锚点)。
|
||
* 注:不可把下面两句赋值与这里的替换一起塞进 IWDG_Init 1 区——该区位于
|
||
* 两句赋值**之前**,HAL 调用在区外,仍会被覆盖。故此改动只能在生成区。 */
|
||
/* USER CODE BEGIN IWDG_Init 2 */
|
||
|
||
/* USER CODE END IWDG_Init 2 */
|
||
|
||
}
|
||
|
||
/* USER CODE BEGIN 1 */
|
||
|
||
/* USER CODE END 1 */
|