wandering1
|
0f0ea03ff4
|
修复bootstrap注册崩溃:StartWhenAvailable属任务设置而非触发器
现场:用户以管理员跑 -SetEnv -StartNow 时脚本抛
SetValueInvocationException(触发器上没有 StartWhenAvailable 属性),
而它是在"已注销旧任务、尚未注册新任务"之间抛的,等于把 runner 任务删没了。
- StartWhenAvailable 改设到 settings(MSFT_TaskSettings 继承属性,
CIM 属性列表里看不见但可直接赋值,实测 StartWhenAvailable=True)
- 任务对象改由 New-WatchdogTaskPlan 统一构建,先构建、后注销旧任务
- Register-ScheduledTask 失败时显式告警"旧任务已删、CI 裸奔"并 exit 1
- 新增 -DryRun:免管理员即可全量校验 action/trigger/settings
- -Status 增补上次运行时间与返回码,并提示"非管理员看不见任务"
同时更正根因:旧计划任务其实一直存在(非管理员会话看不见,先前误判为
"从未注册"),但它跑的是单次 run_runner.cmd——daemon 属"正常退出"而非
"失败",计划任务的失败重启根本接不到,必须靠看门狗循环重拉。
|
2026-10-12 12:52:27 +08:00 |
|
wandering1
|
20ee35b76a
|
修复CI门禁三因:runner掉线致12个job零日志、L0探测回归全灭、gitlint在CI从不执行
1) runner 掉线:run 16~21 共 12 个 job 零日志。gitea-runner v4 的
daemon 无服务支持、首次 Declare 失败即退出进程,Gitea/机器重启
一次 CI 就静默停摆;叠加 cancel-in-progress 后症状是"任务凭空
消失"。新增 scripts/ci_runner_bootstrap.ps1:等 Gitea 就绪 +
崩溃自拉起看门狗 + 开机计划任务 + -SetEnv 写 MACHINE 级 DTU_*。
2) L0 自 33a4aa4 起在 runner 上必挂:Python 候选被收窄成 PATH python
(msys64,无 pre-commit) + 仓库 .venv(gitignore),cppcheck 目录兜底
亦被删,而机器级 DTU_* 从未设置。探测收进 ci_find_python.ps1
(两 job 共用、可离线自测、恢复机器级安装兜底)。
3) gitlint 声明 stages:[commit-msg],而 --all-files 只跑 pre-commit
stage → 17 个钩子定义 CI 只报 16 个且全绿。新增
ci_gitlint_range.ps1 逐条校验本次范围,ci_local.py 增 L0b 段。
另:GITHUB_ENV/PATH/OUTPUT 写入显式 -Encoding ascii(PS 5.1 的
Out-File -Append 默认 UTF-16LE,会把带 NUL 的行追加进 UTF-8 文件)
|
2026-10-12 12:39:27 +08:00 |
|
wandering1
|
c441131db6
|
环境文档小修:CMSIS pack 更正为非必装(keil.com 已下架)、串口配置源端口更正为 COM6
|
2026-10-02 22:56:48 +08:00 |
|
wandering1
|
401908c062
|
环境文档增补跨机验证清单:项目部署环境要求新增§2.12(变量配置+六步验证链+反向fail-fast测试+通过判定),方案文档待办项交叉引用
CI / L0 静态门禁 (pre-commit) (push) Failing after 25s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 29s
|
2026-10-02 22:29:49 +08:00 |
|
wandering1
|
33a4aa4945
|
本地工具路径DTU_*环境变量改造落地:10处调用点去硬编码+变量优先解析,本机全链路验证通过,文档同步收口,requirements补pre-commit
|
2026-10-02 22:14:49 +08:00 |
|
wandering1
|
b96d649e62
|
文档销项:登记ORE僵尸根治与卷锁待办,补存储架构resume锚点说明
CI / L0 静态门禁 (pre-commit) (push) Successful in 57s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 25s
|
2026-10-02 20:54:05 +08:00 |
|
wandering1
|
930215f81a
|
修复IWDG超时未配置与dhara resume回滚:看门狗误复位与复位后写入全部丢失,台架全量自检PASS
|
2026-10-02 20:48:30 +08:00 |
|
wandering1
|
d1a2eaab07
|
修复run_boot_test路径解析:脚本在test/host/,仓库根需上溯两级(原REPO_ROOT只到test/,端口配置与串口助手路径全部解析错误)
|
2026-10-02 15:08:02 +08:00 |
|
wandering1
|
4a4cd29342
|
S7:@test闭环增加自检结论联合判定(selftest.log缺失或空=PASS、有64B记录=FAIL;FTP匿名抓取+本地副本两种来源)
|
2026-10-02 15:06:36 +08:00 |
|
wandering1
|
b0851b2f70
|
修复L0.5单测harness工具链探测:VS2026实际安装目录为18,补入VS_ROOTS(本机3项主机侧单测由ENV失败转PASS)
|
2026-10-02 15:00:31 +08:00 |
|
wandering1
|
6aae6bd34e
|
docs: 新增实机测试规划(无 MCU 窗口的验证债执行面)
|
2026-10-02 14:05:03 +08:00 |
|
wandering1
|
d9425ddd23
|
测试:补启动段可观测性与模拟器差距清单,run_all_suites 加只编译模式(S10+S13+S6)
CI / L0 静态门禁 (pre-commit) (push) Successful in 1m10s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 25s
|
2026-10-02 13:57:25 +08:00 |
|
wandering1
|
fe963e7d91
|
测试:新增 cfg_file 主机侧单测并修复外科手术保存死码缺陷(S1-b+S2)
CI / L0 静态门禁 (pre-commit) (push) Successful in 49s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 17s
|
2026-10-02 13:00:54 +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
|
fac9d1c409
|
测试:新增 sys_clock 主机侧单测并修复 Zeller 星期缺陷
|
2026-10-02 11:40:35 +08:00 |
|
wandering1
|
9f52731ed8
|
文档:补 Runner 部署指南 §5.1.1/§5.1.2 与排障表(CI 首次全绿)
|
2026-10-02 01:54:14 +08:00 |
|
wandering1
|
1020f6d26c
|
文档:修正串口助手 state 运行时文件引用被 CI doc-links 误报
|
2026-10-02 01:49:35 +08:00 |
|
wandering1
|
3b81e9c801
|
CI:触发复验 pre-commit 全局安装(cfgv 修复后)
|
2026-10-02 01:41:19 +08:00 |
|
wandering1
|
df9a566982
|
CI:诊断 pre-commit 仅装于用户态导致 SYSTEM 不可见
CI / L0 静态门禁 (pre-commit) (push) Failing after 17s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 17s
第五次运行(run#5)L0 仍失败,但错误信息已指向真因:
自检步骤 3 个候选解释器(msys64 / .venv / anaconda3)全部探测失败。
根因(已实测定位):本机 pre-commit 装在
C:\Users\Administrator\AppData\Roaming\Python\Python312\site-packages
即 Administrator 的【用户态 user-site】。runner 以 SYSTEM 运行,其
%APPDATA% = C:\Windows\system32\config\systemprofile\AppData\Roaming,
根本看不到该目录 → 换任何 python.exe 路径都无效。
(已盘点本机全部 python:anaconda3 3.12.4 / workbuddy 3.13.12 /
msys64 3.14.5,以 -s 禁用 user-site 后 pre-commit 均为 rc=1。)
本次改动(workflow 侧,配合外部的全局安装):
- 探测改用 `& $py -s -m pre_commit --version`(-s 禁用 user-site),
只有 SYSTEM 真能用的解释器才被选中
- 后续 install / run 同步加 -s,保持判定一致
- 失败信息明确指向 user-site 不可见 + 给出修复脚本路径
(install_precommit_global.ps1,装到 anaconda3 全局 site-packages)
真正的修复需管理员执行该脚本(本会话无提权权限,pip --no-user
报 WinError 5 拒绝访问)。装好后 L0 即可通过。
|
2026-10-02 01:29:55 +08:00 |
|
wandering1
|
48b33921c0
|
CI:修正 python 探测被 NativeCommandError 中断
CI / L0 静态门禁 (pre-commit) (push) Failing after 17s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 16s
第四次运行(run#4)L0.5 已 PASS(status=1,MSVC 探测 + 39 单测全过),
L0 仍失败于自检步骤自身的一个 PS 5.1 行为:
& $c -m pre_commit --version *> $null
→ NativeCommandError,脚本中止
根因:$ErrorActionPreference='Stop' 下,原生命令写 stderr 会被 PS5.1
当成终止性错误(NativeCommandError),即使 *> $null 重定向也无法阻止;
于是第一个候选(msys64 python,无 pre-commit)就把整个 for 循环打断,
根本轮不到 anaconda3。
处置:探测每个候选时临时把 $ErrorActionPreference 降为 'Continue',
用 2>&1 | Out-Null 吞掉输出并取 $LASTEXITCODE,循环后恢复 'Stop'。
已在 WinPS 5.1 本地实测该探测逻辑:
msys64 rc=1 → .venv rc=1 → anaconda3 rc=0 选中,STEP OK。
|
2026-10-02 01:24:50 +08:00 |
|
wandering1
|
8e7b22184e
|
CI:按 SYSTEM 账户视角修正 Python / cppcheck 探测
CI / L0 静态门禁 (pre-commit) (push) Failing after 16s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 16s
第三次运行(run#3)已越过 PS 语法问题,环境自检真正执行,
暴露 runner 真实环境缺陷:
1. cppcheck 只在【用户级 PATH】,SYSTEM 账户看不到 →
报 runner missing cppcheck。已在自检步骤加回落到
C:\Program Files\Cppcheck 并写入 GITHUB_PATH。
2. 更隐蔽:SYSTEM 的 python 解析到 C:\msys64\ucrt64\bin\python.exe
(3.14.5),而该解释器【没有 pre-commit】(AGENTS.md 亦明令
不得用它跑依赖第三方库的脚本)。若不修,自检通过后 L0 会在
pre-commit 步骤炸。
处置:在自检步骤按 scripts/ci_local.py 同一探测序
(PATH python -> .venv -> anaconda3)挑出真正装了 pre-commit
的解释器,导出 PYTHON 环境变量供后续步骤使用。
L0.5 是独立 job(GITHUB_ENV 不跨 job),同法就地选一个可用
python(主机侧单测为纯标准库,任意 python3 均可,已用 msys64
python 实测 39/39 PASS)。
附带:run 块保持纯 ASCII(上次修正),全部 shell=powershell。
|
2026-10-02 01:21:10 +08:00 |
|
wandering1
|
e241fea801
|
CI:run 脚本改纯 ASCII(PS5.1 按 GBK 解码临时 ps1)
CI / L0 静态门禁 (pre-commit) (push) Failing after 17s
CI / L0.5 主机侧单测 (MSVC) (push) Successful in 16s
第二次 CI 运行(run#2)仍失败,但失败点前移:
pwsh 问题已修(环境自检步骤确实由 Windows PowerShell 5.1 执行)
新错误:TerminatorExpectedAtEndOfString @ 含中文那一行
根因:runner 把每个 run: 块写入临时 .ps1(无 BOM)交 PS5.1 执行,
PS5.1 按 GBK/CP936 解码 → UTF-8 中文字节与相邻引号错位 →
字符串缺少终止符(报错行号即含中文行,极易误判)。
与 AGENTS.md「字符串字面量必须纯 ASCII」同源。
处置:所有 run: 块内改为纯 ASCII(提示语改英文),中文仅保留在
YAML 的 name:/注释(Gitea 按 UTF-8 读、不喂 PowerShell,安全)。
workflow 头部补该坑说明。已用脚本核验 run: 块内零非 ASCII。
|
2026-10-02 01:17:24 +08:00 |
|
wandering1
|
09e45573c8
|
CI:修正 workflow 的 shell 为 powershell(pwsh 不存在)
CI / L0 静态门禁 (pre-commit) (push) Failing after 17s
CI / L0.5 主机侧单测 (MSVC) (push) Failing after 16s
首次 CI 运行(run#1)两个 job 均失败于同一处:
Cannot find: pwsh in PATH
根因:workflow 用 shell: pwsh(PowerShell 7,非 Windows 自带),
而 runner 所在机器只有 Windows PowerShell 5.1。
改为 shell: powershell(7 处)。已核验脚本无 PS7 独有语法
(无 ?? / ?: / && / || / -Parallel),PS 5.1 完全兼容。
workflow 头部补该坑说明,防止将来误改回 pwsh。
注:本次 CI 已验证 actions/checkout@v4 可从本实例正常拉取并
成功检出 v2-on-ui,action 拉取链路无需调整。
|
2026-10-02 01:11:45 +08:00 |
|
wandering1
|
3a90557078
|
文档:补 LastTaskResult 数值解读与健康判据
CI / L0 静态门禁 (pre-commit) (push) Failing after 22s
CI / L0.5 主机侧单测 (MSVC) (push) Failing after 16s
部署实测通过后补充:LastTaskResult 267009(0x41301) 是
SCHED_S_TASK_RUNNING(任务正在运行),并非错误,常驻任务常态值。
补 0/267011/267014 释义,并给出判断 runner 健康的三个真正指标
(进程存活 / declare successfully / Gitea 显示 Idle)。
|
2026-10-02 01:05:07 +08:00 |
|
wandering1
|
164fd3ec23
|
文档:修正 Runner 常驻方案为任务计划程序
实测确认 gitea-runner v4.0.1 的 daemon 是纯控制台程序,不含任何
Windows 服务管理代码(命令集仅 bug-report/cache-server/config/
daemon/exec/register,无 service.go),用 sc.exe 注册服务后
Start-Service 必然报错 1053。二进制内出现的 OpenSCManagerW/
CreateServiceW 等符号来自 Docker SDK,与服务安装无关。
- Gitea_Runner部署指南 §4 全节重写为任务计划程序方案:新增 §4.0
根因分析、§4.2 一键脚本 deploy_runner_task.ps1、§4.3 手动命令
(含 72h ExecutionTimeLimit 警示)、§4.5 清理遗留服务、§4.6 提权
- 排障表补错误 1053 / LastTaskResult 非 0 / 72 小时被杀 3 条
- 拓扑图、§5.1 PATH 运行账户、§7 日志位置、§10 TL;DR 同步更新
|
2026-10-02 01:01:11 +08:00 |
|
wandering1
|
018ee9527e
|
文档:补脚本编码坑(.ps1 需 UTF-8 BOM)
实测:无 BOM 的 UTF-8 .ps1 被 WinPS 5.1 按 GBK 解读,中文变乱码且撞坏引号配对,
报"源文本中包含无法识别的标记"/"字符串缺少终止符",报错行号无规律易误判为逻辑问题。
新增 §7.1:修法(重存为 UTF8BOM / 前缀 BOM 字节)+ 解析器语法校验命令;
排障表补该条目;三个配套脚本已统一加 BOM 并通过解析校验。
|
2026-10-02 00:45:34 +08:00 |
|
wandering1
|
c4768e98e3
|
文档:按 v4.0.1 实测修正 Gitea Runner 部署指南
实测发现 act_runner 已更名为 gitea-runner,发布页迁至 gitea.com/gitea/runner,
当前最新 v4.0.1,且 v4 移除了 daemon install/start/stop/status 子命令。
修正内容:
- §1 改为 gitea-runner v4.0.1 下载地址与文件名;新增 §1.3 命令集对照
- §3 修正 log 段(v4 无 file 键,改用 log.job.dir)+ config 子命令用法
- §4.2 常驻改用 sc.exe / New-Service(v4 无 daemon install)
- 新增 §4.5 提权硬约束(IsAdmin=False 时 New-Service 拒绝访问)
- 新增 §6.1 MySQL 直查核验 runner 在线状态
- 排障表补 4 条(accepts at most 0 arg / unknown config key / 拒绝访问 / WorkingDirectory)
- §10 TL;DR 与配套脚本清单同步
|
2026-10-02 00:39:51 +08:00 |
|
wandering1
|
c305a8dd20
|
文档:新增 Gitea Runner 部署指南(本机原生环境定制)
针对实测环境定制:Gitea 1.25.4 为 Windows 原生 gitea.exe(非 Docker)、
以服务运行、监听 0.0.0.0:3001、[actions] ENABLED=true 已开启。
覆盖 Runner 端全流程:下载 act_runner / register(--instance 用 127.0.0.1:3001 回环、
--labels "windows:host" 必须精确匹配 runs-on)/ config.yaml / daemon install 常驻 /
软件与 PATH 服务账号坑 / MSVC 标准路径约束 / 内网 action 零依赖改法 / 排障表。
附 check_env.ps1 一键环境自检脚本(落位 D:/Docker/act_runner/)。
关联更新:项目部署环境要求 §七 + 变更记录、测试开发标准流程 §9.4 + 关联文档表。
验证:check_doc_links --all 107 文档通过;本机工具链 Python/cppcheck/pre-commit/MSVC 四项全齐。
|
2026-10-02 00:29:45 +08:00 |
|
wandering1
|
52e6dcb009
|
文档:修正 CI 配置指南中 DEFAULT_ACTIONS_URL 说明
原 §1.2 示例把 DEFAULT_ACTIONS_URL 写成 https://gitea.com,易误导为该填自己的网址。
实际语义:它控制 action(如 actions/checkout@v4)的下载源——默认 github.com,
self = 从自己 Gitea 实例拉(需先把 action 镜像进实例),并非填实例域名。
新增 §1.2.1 专节(取值表 + 按网络环境选择 + 官方 FAQ 原文引用);
§4.3 同步修正(原文误写"gitea.com 代理"),并把零依赖 git 写法列为内网首选。
|
2026-10-02 00:12:15 +08:00 |
|
wandering1
|
1e01950b23
|
文档:新增 CI 配置指南(Gitea Actions 全流程)
新增 docs/环境与部署/CI配置指南.md:服务端 [actions] ENABLED 开关、
Windows runner(act_runner)注册(--labels "windows:host" 必须与 runs-on 对应)、
runner 软件环境与 PATH 要求(含 MSVC VS_ROOTS 路径约束)、workflow 位置与触发、
内网拉不到 actions/checkout 的三种处置、端到端验证清单、故障排查表、日常维护。
关联更新:项目部署环境要求 §七(相关文档 + 变更记录)、
测试开发标准流程 §9.4(指向配置指南)+ 关联文档表。
验证:check_doc_links --all 106 文档通过;scripts/ci_local.py rc=0(L0 + L0.5 全过)。
|
2026-10-01 23:59:28 +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
|
6b90fa0581
|
文档:补充主机侧单元测试(L0.5)的环境要求
新增 L0.5 主机侧单测需 MSVC(cl.exe)离线编译真实源码,此前环境
文档未覆盖该依赖。本次补齐环境侧全部引用点:
- 项目部署环境要求.md:
· §2.3 由"PC 模拟器环境"扩为"PC 侧编译环境(模拟器 + 主机侧单元
测试)",明确同一套 VS 的 cl.exe 同时服务两者,MSVC 由"仅模拟器
需要"升级为"提交门禁需要"
· §2.7 pre-commit 表补 watchdog-unit-test 钩子 + "未装 VS 会被拦截"
· 总览拓扑图加 MSVC 节点;第 3 步 / 第 10 步冒烟 / 搭建清单 /
§2.10 下载表(补 VS2022/2026)/ 速查表(补 cl.exe 缺失、
C1083 stdio.h 两条)/ 相关文档 / 变更记录同步
- 测试开发标准流程.md:
· §4.2 补 L0.5 环境要求表(cl.exe / SDK / 纯标准库 Python / 缺失时
退出码 2 且钩子拦截)+ "不调 vcvars64.bat(reg.exe 受限)"原因
· §4.1 工具清单标注该运行器需 VS
|
2026-10-01 07:03:53 +08:00 |
|
wandering1
|
73941da6b1
|
看门狗判定状态机增加主机侧单元测试(L0.5 层)
为 task_watchdog.c 的判定逻辑(位图取走清零 / 必需掩码 0x37 判定 /
miss_streak 连续 8 次停喂 / 100ms 抽样节流 / tick 回绕安全)补一层
主机侧纯逻辑单元测试,弥补此前只能靠真机或模拟器才能发现回归的空白。
架构(沿用项目既有"共享核心 + 平台后端"做法,参照 cfg_file_store):
- task_watchdog.h 末段新增"平台后端(内部)"声明 3 个钩子
(wd_platform_feed / _start / _tick_ms),MCU 端以 __weak 提供默认实现,
行为与重构前逐字一致(@build 0 错误 0 警告,Flash +20B)。
- 主机侧单测以同名强符号覆盖三钩子,即可离线注入/观测,无需碰 MCU 代码。
- 测试文件 #include 生产源文件本身,保证测的是真代码而非副本。
- 测试专用复位 task_wd_test_reset() 仅 TASK_WATCHDOG_UNIT_TEST 下编入,
MCU 构建零代码零符号。
测试(test/host/watchdog/,MSVC 离线编译,纯标准库驱动):
- 39 项断言全过(退出码 0);注入故障可复现退出码 1。
- run_unit_test.py 直接拼 INCLUDE/LIB 调 cl.exe,绕开本机被禁的 reg.exe。
- stub/ 三桩头覆盖 main.h / iwdg.h / dbg_log.h。
门禁:pre-commit 新增 watchdog-unit-test 本地钩子(L0.5 层),仅被测文件
或其测试变动时触发;测试开发标准流程.md 新增 L0.5 层说明。
顺带改善:task_watchdog.c 的节流基线 s_last_tick 由函数内 static 提为文件
static(可测性 + 模块状态归一)。
|
2026-10-01 06:57:01 +08:00 |
|
wandering1
|
0ac68605dd
|
看门狗 §3.2 流程图重绘为 SVG:任务置位→校验者判定→喂狗 + 时间轴
|
2026-10-01 06:35: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
|
7feeea6c56
|
实现独立看门狗:CubeMX 配置 IWDG + 任务心跳位图,恢复三处被覆盖定制
经 CubeMX 图形界面启用 IWDG(Prescaler=64 / Reload=1249,标称 2498ms /
最坏 1701ms),并落地心跳位图判定、各任务埋点、RCC_CSR 复位原因上报与
configASSERT 改造。重生成覆盖的既有定制已全部恢复。
P0(开机死循环):HAL_IWDG_Init() 内部立即启动看门狗,而 CubeMX 把
MX_IWDG_Init() 插在 app_main_init() 之前——该段 NAND/RTC/ADC 初始化耗时
数秒无喂狗点,按 2.5s 超时必然复位。改 Src/iwdg.c 为只填参数不启动,
启动移交 task_wd_start(),由 defaultTask 在存储 bring-up 完成后调用。
恢复的三处定制(重生成覆盖):
- Src/stm32f4xx_it.c:HardFault_Handler 崩溃现场采集被打回空 while(1)
- Inc/FreeRTOSConfig.h:栈溢出检测与堆失败钩子两个宏被整块删除
- Src/freertos.c:三处任务栈实测记录中文注释丢失(数值未丢)
新增:
- App/util/task_watchdog.{c,h}:心跳位图 + 抽样判定 + IWDG 延后启动
- time_sync.c 长等待切片:net_recv_to 单次可睡满 30s 预算,切成 200ms 片
- Src/main.c 复位原因锁存(读后即清 RMVF,防残留误判)
埋点:defaultTask(唯一喂狗者)/ netTask(含 PHY 等待循环)/ uiTask /
timeSyncTask。ftpTask 首期剔除掩码,待二期改 lftpd。
门禁:build 0 错误 0 警告;pre-commit 10 钩子全通过;Flash +2956B / RAM +40B。
|
2026-09-29 07:22:04 +08:00 |
|
wandering1
|
e18e9f2cfd
|
新增看门狗设计说明:IWDG 选型与任务心跳位图方案
|
2026-09-29 06:46:27 +08:00 |
|
wandering1
|
0ddf8c9aca
|
Net 层阻塞模型架构设计 §2 架构总览改用 SVG 矢量图
|
2026-09-29 06:00:48 +08:00 |
|
wandering1
|
0485e79da0
|
Net 阻塞模型文档改写为架构设计并迁入 docs/网络
|
2026-09-29 05:51:16 +08:00 |
|
wandering1
|
b46e6bffed
|
Net 阻塞模型调研文档退役:客观实施记录留存,二期基线迁入任务规划
|
2026-09-26 14:21:13 +08:00 |
|
wandering1
|
5c049daa7c
|
Net 阻塞模型文档销项修正 + 新增项目下一步任务规划
|
2026-09-26 14:15:56 +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
|
8d86fb1149
|
登记簿完成即销项:待处理内容.md 删4项已闭环条目并清理全库引用
- 删 N-1/N-5/N-6/N-8(结论已沉淀于 Trap21/22/23 与 E-03,先验证后删)
- 同步清理 3 处外部引用(错误码传播审计、CH395F_Trap_Records、Net层阻塞模型)
- 文件头说明改写为「完成即销项,不保留已消化行」
- AGENTS.md 新增登记簿销项规定
|
2026-09-26 12:12:14 +08:00 |
|
wandering1
|
e1ae58b52b
|
CH395F 手册图片从外部图床迁回本地,18 张图编入版本库
|
2026-09-26 11:39:59 +08:00 |
|
wandering1
|
b5a96c82b8
|
启用 Git LFS 托管 jpg 图片
|
2026-09-26 01:07:00 +08:00 |
|