wandering1
|
883c9dd0cc
|
feat(adc): B1 实现 ADC 采集链路(adcTask + 看门狗)
B1(ADC 采集链路)落地,消化 P1-1:
- adc_task.c:空桩 -> 真实消费者。每 1ms 触发一次 CONVST,
用 tpafe5160_snapshot() 原子取数(AGENTS 铁律)+ 帧统计 +
每 10s 心跳日志。只取数,不做保护运算。
- Src/freertos.c:手工创建 adcTask(512 words / Normal,落
USER CODE 保护区,同 timeSyncTask 先例)。
- task_watchdog:新增 TASK_WD_ADC;required_mask 产品 0x37 ->
0x77、ENABLE_HW_LAYER_TESTS 0x35 -> 0x75。
- default_task.c:栈水位探针增列 adcTask(extern + 表项)。
- 脚本:stack_report.py 增 ROOTS/RUNTIME_ALIAS;gen_task_table
增 adcTask(README/AGENTS 任务表已 --write)。
- 单测:watchdog_test.c beat_all/掩码断言同步(39 断言全绿)。
- 文档:待处理内容/看门狗设计/RAM 方案/继保规划 同步。
验证:@build 0 错 0 警;stack_report 静态最坏链 504B(余 75%);
pre-commit 全绿。剩 @test 实机闭环。
|
2026-10-10 14:33:32 +08:00 |
|
wandering1
|
e89fe54a97
|
重写看门狗设计说明为现状说明:删立项前旧描述、补FTL心跳路由与取证机制、修掩码与复位归因
|
2026-10-10 10:57:31 +08:00 |
|
wandering1
|
29df7bf8fb
|
4 个 Fault Handler 迁入 USER CODE BEGIN 0(L3→L2):生成区恢复 CubeMX 原样,重生成零 diff
CI / L0 静态门禁 (pre-commit) (push) Has been cancelled
CI / L0.5 主机侧单测 (MSVC) (push) Has been cancelled
|
2026-10-10 02:02:58 +08:00 |
|
wandering1
|
e2e1d0fd42
|
IWDG 延后启动改走宏改名(L3→L2):生成调用变空操作,重生成后不再需要手工删
|
2026-10-10 01:30:47 +08:00 |
|
wandering1
|
5eed2151de
|
CubeMX 生成 ADC1(9 通道)+ 复原重生成定制,FreeRTOS 加固迁 L1、钩子落 USER CODE 4/5,门禁豁免生成文件空白改写
|
2026-10-10 00:53:20 +08:00 |
|
wandering1
|
f4fea70749
|
docs: 合并 4 份待办文档为统一登记簿 待处理内容.md
合并 docs/待处理内容.md(N/S/T-x)、审查记录/项目审计改进清单.md(P-x)、
审查记录/下一步任务规划.md(阶段与基线)、审查记录/测试与架构改进建议.md
(S1x/A-x)为单一《待处理内容(统一待办登记簿)》。
- 结构:编号空间与来源 / 未闭环一览 / 任务排序(阶段 A~D)/
逐条详述 / 待验证与待确认 / 设计基线 / 诊断基线 / 内存预算 / 维护约定。
- 编号沿用且不回收;E-xx 仍由 错误码传播审计.md 独立维护。
- 删除 3 份被合并文档;重定向下游引用:README、AGENTS、审查报告、
实机测试实施指南、Net 层架构、NET/cfg 模块 README、脚本注释。
- 同步订正计数:P1=2(+1 收尾) / P2=10 / P3=6。
pre-commit 17/17 Passed。
|
2026-10-04 02:28:52 +08:00 |
|
wandering1
|
029437be89
|
台架执行《实机测试实施指南》步骤 3~7 并闭环
步骤 3/4(IWDG V2/V4/V5 + 堆低水位 S11):
- V2 任务饿死 stall 后 ≤2.5s IWDG 复位;V4 关中断死循环 ~4.9s 稳定复位;
V5 30min 120×FTP 全 PASS、零 IWDG 复位。堆告警全程未触发(min_ever=4728B)。
- task_watchdog.c:stall 证据写盘会经 nand_ftl_wd_feed 喂狗 → 增 s_stall_evidenced
每次 stall 仅取一次证据,避免"取证据"本身阻止复位。
- default_task.c:堆低水位告警(HEAP_LOW_WATER_B=3072)。
步骤 5(GD5F 错误通道 S9):gd5f2gq5ue.c/.h + nand_ftl.c 错误码统一为 int32_t 并
全量检查返回值;套件回归 16/16 PASSED。
- test/run_all_suites.py:--forbidden 改为按套件覆盖(GD5F 用 "HardFault;assert")——
TC-GD5F-704 故意触发 [ERR] 回落轮询,统一默认值会误判 FAIL。
步骤 6(网络稳定性):7.1 正常路径 ✅(V5 证据);7.2 N-2 丢弃可观测性代码已具备、
49s 静默在 V5 未复现(降级低风险观察项);7.3 N-3 待 PC peer。
步骤 7(工程卫生):
- S5:新增 test-cppcheck 钩子(仅 warning,排除模拟器桩)。
- S4:新增 scripts/check_test_traceability.py(默认仅告警)。
- 待核实项 TEST_SUITE_SELECTED 实机核实 = 死代码(无使用点);RTC 套件实际正常执行,
真缺口 = 缺套件级汇总行 → sd2506_test_task.c 补 === RTC Tests: N/M PASSED === 并
修正 Phase 级汇总累计问题;test_config.h 补齐 RTC 并注释"当前无引用"。
验证:产品 @build 0/0;pre-commit --all-files 17/17 Passed;
run_all_suites.py --suites RTC → PASS。
文档:实机测试实施指南 / SD2506_Test_Guide / 待处理内容 / 测试与架构改进建议 同步。
|
2026-10-04 00:35:06 +08:00 |
|
wandering1
|
554b2e88da
|
方案文档改造为机制说明:删除规划/盘点/阶段/风险/任务拆分章节,保留变量清单/解析语义/配置方法/验收判据,外部引用同步重编号
|
2026-10-02 23:21:25 +08:00 |
|
wandering1
|
33a4aa4945
|
本地工具路径DTU_*环境变量改造落地:10处调用点去硬编码+变量优先解析,本机全链路验证通过,文档同步收口,requirements补pre-commit
|
2026-10-02 22:14:49 +08:00 |
|
wandering1
|
f3befaed08
|
CI:补产物存档与结果汇总,明示体积门禁盲区(S3+S14)
CI / L0 静态门禁 (pre-commit) (push) Successful in 58s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 19s
|
2026-10-02 11:55:31 +08:00 |
|
wandering1
|
e90486524d
|
CI:Gitea Actions 落地 L0+L0.5(补 T-6)
新增 .gitea/workflows/ci.yml:push/PR 触发两个 Windows job——
l0-gates 跑 pre-commit --all-files(无 Keil .map 时自适应跳过 mem-numbers),
l05-host-unit-tests 遍历 test/host/**/run_unit_test.py(缺 MSVC 则告警降级跳过)。
刻意不跑 @build(需 Keil 授权);L1/L2/L3 需真机+ST-LINK,不上 CI。
新增 scripts/ci_local.py:本地跑与 CI 等价的门禁(自动选用装了 pre-commit
的解释器;.map 自适应;退出码 0/1/2 与 CI 对齐),供提交前自查与 runner 就绪前过渡。
文档同步:测试开发标准流程 §9(CI 章节)/§1/§4.1、待处理内容 T-6 销项、
项目部署环境要求 §2.11(runner 前置)、pre-commit 使用说明 §1、scripts/README.md、AGENTS.md。
验证:scripts/ci_local.py rc=0(L0 14 钩子全过 + L0.5 39/39)。
|
2026-10-01 10:19:38 +08:00 |
|
wandering1
|
2055de0303
|
测试:落地测试架构改进 T-1~T-5(套件开关门禁/汇总行校验/通用 harness/公共断言宏/多套件编排)
背景:L0.5 主机侧单测落地后复审测试架构,给出 6 条改进意见(P0~P3),
登记进 docs/待处理内容.md「测试与验证基础设施」后逐条实施。
- T-1(P0) 测试套件开关门禁:新增 scripts/check_test_suite.py + pre-commit 钩子
test-suite-switch,默认要求产品构建(全部 TEST_SUITE_* 注释),跑套件回归用
--allow-test-build / ALLOW_TEST_BUILD=1 显式放行。顺带把 test_config.h 中长期
开启的 TEST_SUITE_CH395F 改回注释(仓库此前躺着的是测试固件)。
- T-2(P1) verify_log.py 增加 --require-suite-summary:要求
"=== <名称>: N/M PASSED (failed=0) ===" 且 N>0,堵住"套件没跑到汇总行/
断言数为 0 仍判 PASS"的盲区;run_boot_test.py 同名参数透传。不传参向后兼容。
- T-3(P1) 抽取通用 harness test/host/common/unit_test_harness.py(工具链探测/
INCLUDE-LIB 拼接/wd4819/GBK 解码/退出码契约);watchdog 运行器 170→55 行,只声明 TestBuild。
- T-4(P2) 新增 test/board/test_common.h 集中断言内核(TEST_CHECK_IMPL/TEST_REPORT_IMPL),
4 套件各用一行宏绑定自身统计变量(保持 g_xxx_stats 独立、防跨套件串数)。
刻意不 include dbg_log.h——否则冻结 DBG_TAG 默认值触发 #47-D 重定义警告。
- T-5(P2) 新增 test/run_all_suites.py 多套件回归编排,try/finally 无条件还原套件开关。
验证:@build 产品构建 0 错 0 警;4 套件逐一构建均 0/0;看门狗单测 39/39 PASS;
pre-commit 14 钩子全通过;编排脚本 dry-run/开关切换/异常还原均实测通过。
|
2026-10-01 07:28:57 +08:00 |
|
wandering1
|
2d414f8aa9
|
查证 SHCSR 的 Fault 使能位无法在 CubeMX 配置,补入文档与审计提示
用户问 fault_handler_enable() 能否通过 CubeMX 配置。查 CubeMX 安装目录的
模板源码后确认:不能。三重证据:
1. tpl_main_c.ftl 的 MX_NVIC_Init() 用 [#if vector.systemHandler=="false"]
才生成 HAL_NVIC_EnableIRQ;而 NVIC-STM32F417_Modes.xml 里
MemoryManagement/BusFault/UsageFault_IRQn 都标 Y(=systemHandler),
故 CubeMX 对这三个永不生成使能代码(只生成优先级,且仅当优先级 != 0)。
2. 全部模板中 SHCSR 只出现 1 次(tpl_main_c.ftl:2269),且是 MPU 清理时的
SCB->SHCSR &= ~SCB_SHCSR_MEMFAULTENA_Msk(禁用),无任何 |= 置位。
3. MPU 路径也堵死:.ioc 的 Mcu.IP 列表无 MPU,且 HAL_MPU_Enable 只置
MEMFAULTENA 一位,BUSFAULTENA/USGFAULTENA 仍拿不到。
实测印证:Src/stm32f4xx_hal_msp.c 的 HAL_MspInit() 里只有
HAL_NVIC_SetPriority(PendSV_IRQn, 15, 0),三个 Fault 一行代码都没生成。
结论:只能手工写。但函数体在 USER CODE BEGIN 1 区(L2),重生成不会丢,
另有审计项 fault-handler-enable 兜底 -- 故这不是风险,只是无法享受 L1。
顺带记录一个易踩的误解:.ioc 里 NVIC.MemoryManagement_IRQn=true 的第 1 段
只是"向量在 NVIC 表里可见/已配优先级",与 SHCSR 使能位无关,
不要以为勾了 NVIC 面板的 Enabled 就等于使能了故障。
改动:
- 看门狗设计说明.md:§10.2 新增"为什么 fault_handler_enable() 写不进 .ioc"
(三路径对照表 + 实测印证 + 结论);四个 Fault 采集小节加警示;
L1 表格补该行;变更记录新增 2026-10-01 条。
- AGENTS.md:新增"SHCSR 的 Fault 使能位无法在 CubeMX 配置"铁律条目。
- scripts/check_cubemx_survival.py:fault-handler-enable 的 hint 补上
"无法 CubeMX 配置"及其原因,便于日后重生成后看提示就能回忆。
验证:pre-commit 13 钩子全通过;审计 18 通过 / 1 警告 / 0 失败。本次仅改
文档与脚本注释,未动代码,无需重编译。
|
2026-10-01 06:20:50 +08:00 |
|
wandering1
|
8a18e388c7
|
四个 Fault 全部采集现场:MemManage/BusFault/UsageFault 由空死循环升级
原状:HardFault 已有崩溃采集,但 MemManage / BusFault / UsageFault 仍是空
while(1) —— 这三类故障发生时日志完全静默,且因 SHCSR 默认未使能,实际会
被升级成 HardFault,报告出笼统的 "HARDFAULT"、看不出根因。
改动:
- Src/stm32f4xx_it.c:三个 Handler 升级为手工 __asm 版(取 MSP/PSP 帧指针)
-> B 到 per-fault C 入口 fault_entry_{mem,bus,usage} -> hard_fault_report()。
hard_fault_report 增加 tag 参数,日志统一为
"[ERR] <TAG> PC=.. LR=.. xPSR=.. R0-R3=.. CFSR=.. HFSR=..[/BFAR][/MMFAR]"。
生成实体经 #define X X_Gen 改名保留,链接器各移除 2 字节(.map 已验)。
三个各带独立锚点 MEMFAULT/BUSFAULT/USAGEFAULT-ANCHOR。
- 新增 fault_handler_enable()(USER CODE BEGIN 1 区):使能 SHCSR 的
MEMFAULTENA/BUSFAULTENA/USGFAULTENA。声明入 Inc/stm32f4xx_it.h,调用在
app_main_init() 第一行(纯寄存器写,不依赖日志/时钟)。
- 刻意不启用 CCR.UNALIGN_TRP / CCR.DIV_0_TRP:会把普通 bug 升级成死机,
对本项目弊大于利(说明写进函数注释)。
实现约束(本轮踩坑):ARMCC 的 __asm 块取不到 C 的数据符号(ADR r1, xxx_tag
报 A1516E: Bad symbol,去 static 也无效),也无法给 C 函数传字符串参数,
故故障名必须由 C 侧 per-fault 入口带上。
配套:
- check_cubemx_survival.py:新增 fault-handlers-3 / fault-handler-enable 两项,
UNPROTECTED_LEGACY 清掉三个 Fault(WARN 2->1),清单 16 -> 18 项。
- AGENTS.md:新增"4 个 Fault 全部采集"条目;ARMCC 汇编条目补 A1516E 第 3 坑;
校验标记补 [ERR](四个 Fault 日志都以它开头 -> 一律判 FAIL,刻意)。
- 看门狗设计说明.md:§6.1 补 4 条 Fault 标记与 @test 禁项关系;
§10.2 L3 清单与四个 Fault 采集小节;§11 结论表与变更记录。
- 待处理内容.md:新增 N-03d(已完成),N-03c 补第二次重生成结论。
验证:@build 0 错误 0 警告(Flash +156 B,RAM 无变化);pre-commit 13 钩子
全通过;审计 18 通过 / 1 警告 / 0 失败。
|
2026-09-29 09:16:19 +08:00 |
|
wandering1
|
67d26ac37a
|
修正 CubeMX 重生成防丢失机制:审计脚本实测有效,恢复 5 处被覆盖定制
第二次重生成验证了审计机制,并证伪了上一轮的一处假设:
- 审计脚本 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 失败。
|
2026-09-29 07:52:39 +08:00 |
|
wandering1
|
7a18d2ce28
|
加 CubeMX 重生成存活审计:防标记区外定制被静默覆盖
背景:.ioc 的 KeepUserCode 只保护 USER CODE 标记区,标记之外的手工改动
重生成即被覆盖,且多数不报编译错(2026-09-29 实测一次覆盖 4 处,含
HardFault_Handler 崩溃采集被打回空 while(1)、两个 FreeRTOS 加固宏被删)。
新增 scripts/check_cubemx_survival.py:
- 16 项易失清单(IWDG 延后启动 / 崩溃采集 / 栈溢出检测 / 堆失败钩子 /
断言改造 / 看门狗模块与工程挂载 / 复位原因锁存 / HAL 驱动与使能 /
.ioc 关键项),断言前剥掉 C 注释防误报
- 哈希基线漂移检测(.cubemx_survival_baseline.json),--write 重建
- 标记区外存量以 WARN 提示(3 个 Fault 处理函数、栈注释)
已挂 pre-commit cubemx-survival 钩子(改动 .ioc / Src / Inc /
task_watchdog / .uvprojx 时触发)。
文档:看门狗设计说明 §10.2 新增"重生成不丢的三层手段"方法论
(L1 写 .ioc > L2 搬进 USER CODE 区(可自造标记区)> L3 审计兜底)
及 .ioc / USER CODE 区可用位置 / 存量清单三张对照表;AGENTS.md 平台约束
新增该规则;pre-commit 使用说明 §2.12 新增钩子详解。
门禁:build 0 错误 0 警告;pre-commit 全通过。
|
2026-09-29 07:30:00 +08:00 |
|
wandering1
|
22559365b9
|
整理 App 与 test 目录:按职责分子目录并同步全库引用
|
2026-09-26 12:52:39 +08:00 |
|
wandering1
|
39bd06adea
|
为自建代码目录补齐 README,建立目录级导航体系
- 新增 26 份目录 README:App/(+log,task,util,protocol)、Drivers/BSP/(+8子系统)、
Src/、Inc/、scripts/、tools/(+6子工具)、test/、MDK-ARM/、simulator/(+sim,tests)
- 每份含:定位、文件清单表、关键约束/陷阱、指向 docs 权威文档
- 第三方库与生成代码目录排除(CMSIS/HAL/Middlewares/Lib/SDL2)
- docs/文档规范.md 新增 §1.1b 代码目录 README 约定;根 README 目录结构加入说明
|
2026-09-26 12:25:36 +08:00 |
|
wandering1
|
a6cdebde62
|
文档体系重组与 D-7 一致性门禁落地,清理芯片手册孤儿图片
- D-6 目录规范化:docs 根目录散落文档归入 UI设计/子系统设计/架构设计/审查记录/
环境与部署/网络 等子目录,去掉目录名空格,重命名 嵌入式C语言代码规范_V1.0.md
- D-7 三档一致性门禁:新增 scripts/check_doc_links.py(链接存在性)、
scripts/gen_task_table.py(FreeRTOS 任务表数值)、scripts/check_mem_numbers.py
(内存/Flash 体积),均支持 --check/--write/--diff,pre-commit 钩子同步注册
- D-5 文档索引:新建 docs/README.md,新建 docs/文档规范.md 约束目录命名与链接写法
- D-1 芯片手册瘦身:删除 1069 张无引用孤儿图片(77.06 MB),
docs/芯片手册 120 MB → 41 MB,已引用图片零断链
- 同步 C 源码注释中的文档路径引用(D-6 重组后),构建 0 错误 0 警告
|
2026-09-26 00:51:53 +08:00 |
|
wandering1
|
bbdd059e25
|
修复就绪屏障位被消费致FTP永不监听;新增栈可观测(水位探针+静态调用图报告)并补FTP实测
|
2026-09-21 04:26:52 +08:00 |
|
wandering1
|
342269fbd0
|
新增内存使用分析文档(报告/规划/优化建议)与 SVG 布局图生成脚本
|
2026-09-13 17:05:55 +08:00 |
|
wandering1
|
7f0087d430
|
新增S10~S19代码规范检查并统一time_sync_task命名
check_coding_standard.py 新增 9 条机械检查(S14 并入 S6):
- S10 (3.3.1) 函数名全小写(HAL_ 厂商回调豁免)
- S11 (2.3.5) 禁止相对/绝对路径 include
- S12 (7.6) 禁止可变参数函数
- S13 (7.7) 禁止递归函数
- S15 (6.1.4) 文件作用域指针须初始化为 NULL
- S16 (3.2.2) 非 static 全局变量须 g_ 前缀
- S17 (2.2) 非 static 函数须在配对头文件声明
- S18 (6.3.1) 禁止 Yoda 条件(常量在右)
- S19 (4.4.2) 函数定义左大括号与右括号同行
S6 词表扩充 scanf/strtok
timeSyncTask 重命名为 time_sync_task(3 处代码引用)
更新 pre-commit 使用说明规则表
|
2026-09-01 17:38:43 +08:00 |
|
wandering1
|
bb76cfd779
|
修复规范矛盾并定案5项规则,保护宏统一XXX_H
规则定案:常量在右(a>5)、保护宏XXX_H(禁双下划线)、
头文件常量用#define、存储类前缀(g_/s_)优先、允许void返回值
全库32个.h头文件保护宏 __XXX_H → XXX_H 改名(字节级替换)
S1检查规则同步更新(拒绝双下划线),Inc/gpio.h 反向验证被正确拦截
规范示例矛盾修复:K&R括号、标准类型、变量初始化、命名常量、注释字段补全
|
2026-09-01 16:07:00 +08:00 |
|
wandering1
|
2b66f96d01
|
新增代码规范检查钩子(规范V1.0 可机械校验项)并修复存量违规
新增 scripts/check_coding_standard.py + coding-standard 钩子(S1~S9:
头文件保护宏、文件头注释、宏大写、_t 后缀、switch default、
禁 strcpy/sprintf/goto/Tab、函数注释)
修复存量违规:NET_* 字节序宏大写化、net_fd_set 等类型加 _t 后缀、
net_inet_ntoa 的 sprintf 改 snprintf、补 4 处函数注释与 ui_task.c 文件头
docs/代码规范/pre-commit使用说明.md:新增 2.8 节,修正失效文档路径
|
2026-09-01 15:41:25 +08:00 |
|
wandering1
|
2769bf33a0
|
引入 pre-commit 自动化代码审查(格式/静态分析/乱码/commit message)
|
2026-09-01 10:24:08 +08:00 |
|