Commit Graph

327 Commits

Author SHA1 Message Date
wandering1 0b0cd0048b 补两份主机单测说明文档:卷锁(fail-open)与时间同步(N-17)
- 卷锁单元测试说明.md:33 断言点。钉死 fail-open 不变量(互斥量创建失败时
  vol_lock_wait 必须返回 1 且绝不阻塞——defaultTask 是喂狗点)、幂等、超时透传、
  判空 release;并说明"白盒置 s_lock=NULL"的取舍与桩只验调用契约的边界。
- 时间同步单元测试说明.md:80 断言点。钉死分片喂狗延时、监听退避、时间包重组
  (半包/粘连/EOF/真错/预算耗尽/tick 回绕)、任务主循环;含 setjmp/longjmp 跳出
  for(;;) 的手法,以及"C 暂定定义静默合并同名 static 变量"这一无告警缺陷的记录。
- test/host/README.md:补齐 7 套主机单测的清单、运行方式与钩子(原表缺
  phasor / adc_input / vol_lock / time_sync 四套),并修正 cfg_file 断言数。
- docs/README.md:主机侧单测(L0.5)表登记两份新文档,并同步修正 cfg_file 断言数。
2026-10-10 18:06:43 +08:00
wandering1 317e97fca6 docs(algo): App/algo/README.md 补齐为详版(分层/数据流/接口/测试/扩展)
- 该文件此前仅 27 行(仅"现有模块"表 + 约定 + 相关文档),本次补齐为 168 行
  详版:文件清单、1 ms 数据流图、逐文件 API 表与要点、关键约定、静态足迹、
  构建与测试(含两个主机单测钩子)、新增算法模块的固定动作。
- 内容已逐项对照当前源码核验:相量实例 5 行 / 环容量 2×20 点 / 9 个语义通道 /
  Rank 映射(CH0..CH7 + CH14)/ 所引文档、脚本与 skill 均存在。
- 与 L1/L2 现状一致:adc_input(L1)、sample_ring + phasor(L2)三模块。
2026-10-10 18:04:51 +08:00
wandering1 a2f5d1397a 主机单测:新增卷锁与时间同步两套用例(33+80 项)并登记钩子
- vol_lock(App/fs/vol_lock.c):33 用例。核心不变量是 fail-open——
  互斥量创建失败时 vol_lock_wait() 必须返回 1 且绝不阻塞,因为调用者
  defaultTask 是看门狗喂狗点;板端该路径只在内存耗尽时才可能走到。
- time_sync(App/sync/time_sync.c):80 用例。本模块是 N-17 看门狗风险的
  全部逻辑贡献者,用例钉死分片喂狗节奏、监听退避、报文重组(半包/粘连/
  EOF/真错/预算耗尽/tick 回绕)、重听门控;用 longjmp 跳出 for(;;) 任务循环。
- 两套均为纯逻辑主机侧测试,MSVC 离线编译真实源文件(#include 纳入)。
- 新增钩子 vol-lock-unit-test、time-sync-unit-test(7f/7g)。
- 全量主机单测:watchdog 39 + sys_clock 100 + cfg_file 149 + phasor 57
  + adc_input 70 + vol_lock 33 + time_sync 80 = 528 项,全绿。
2026-10-10 18:03:31 +08:00
wandering1 3715f8a34c 补两份主机单测说明文档:ADC 输入层(L1)与相量层(L2)
按仓库惯例(每个主机侧单测配一份 docs/测试说明/*单元测试说明.md 并在
docs/README.md 注册)补齐上一提交新落地的两个套件。

- docs/测试说明/ADC输入层单元测试说明.md:70 用例逐条列出(init 复位 /
  语义映射表 / map_check / ADC1 顺序扫描与 Rank 到通道判据 / raw 守卫与
  补码 / poll 契约 / rc 与 errs 观测);含桩表与"反向路径不可达"说明。
- docs/测试说明/相量层单元测试说明.md:57 用例(系数表 / 幅值相位 /
  直流与谐波抑制 / 任意次谐波提取 / 频偏 / 采样环 / 实例层 / 滑动窗 /
  双区交换 / phasor_zero 与 init 清零);含 sqrt2/N 系数约定与"暴力重算"
  取舍说明,并记录 L2-2 实例数(规划 4 vs 实现 5)待对齐。
- docs/README.md:主机侧单元测试(L0.5)表新增两行。

doc-links / mojibake / EOF 等钩子全绿。
2026-10-10 17:53:48 +08:00
wandering1 63c262fe2c 相量层单测:补 phasor_zero/init 清零用例(L1/L2 函数覆盖 20/20)
函数级覆盖审计发现 phasor_zero() 仅被 phasor_init() 间接执行、其效果
无可观测断言(init 同时把 s_ready 清 0,公开 API 看不到清零)。补直接
白盒用例:

- TC-PH-030 直接调 phasor_zero,四字段(含 fAm/fAmSQ)全清零
- TC-PH-031/032/033 先把双区写脏,init 后双区全零 + 使用区复位 +
  就绪标志清(get -> -2)
- TC-PH-034 init 幂等

审计结果:App/algo 三个源共 20 个函数,0 个未覆盖。
相量层单测 57/57 PASSED(原 52)。
2026-10-10 17:48:13 +08:00
wandering1 696a1a49a9 主机单测:新增 ADC 输入层(L1)用例 70 项并登记 L1/L2 单测钩子
新增 App/algo/adc_input.c 的主机侧单测(L1),补齐 L1/L2 算法层
"每个函数都可离线验证"的最后一处空白。

- test/host/adc_input/{adc_input_test.c,run_unit_test.py,stub/}:
  70 个用例,覆盖 6 个公开函数 + map_check + stm32_scan。
  关键判据 = "通道号 <-> Rank 顺序 <-> 语义"三者映射:给每个 Rank
  注入互不相同的码值,逐通道钉死映射(板端无信号源,无法验此项)。
  另钉死 HAL 启动失败 / 轮询超时 / 参数错 / 无有效数据等分支。
- .pre-commit-config.yaml:登记 phasor-unit-test(7d)与
  adc-input-unit-test(7e)两个主机侧单测钩子。

主机侧全套:adc_input 70/70、phasor 52/52,均 0 失败、无 /W4 告警。
2026-10-10 17:46:45 +08:00
wandering1 3762c03bb4 L2 相量层:采样环缓冲 + 全周傅氏 + 主机单测(台架间歇复位待查)
新增(均已通过主机侧单测与构建,**台架存在未定位的间歇性回归,见下**):
- App/algo/sample_ring.c/h:按语义通道的采样环缓冲(2 周波 = 40 点),
  整帧压入 + 帧计数,供 L2 按窗取数。
- App/algo/phasor.c/h:全周傅氏相量层,覆盖规划 §3.2 的 L2-1/2/3/6/7——
  系数表按 docs/算法/傅氏算法详解.md §2.3 预乘 √2/N(fAmSQ 直接即有效值);
  5 个数据驱动实例(IA/UA/UN 基波 + IA 二/五次谐波);暴力滑动窗;
  计算区/使用区双区原子切换。
- test/host/phasor/:主机侧单测(52/52 PASSED,无需桩)——系数表逐项复核、
  幅值/有效值/相位、直流与谐波抑制、任意次谐波提取、频率敏感性(±2Hz≤3%)、
  环缓冲时序与回绕、实例层与双区交换。
- 集成:adc_task 每拍压帧 + 重算(v2.4);app_main 调 phasor_init();
  Keil 工程挂 phasor.c/sample_ring.c(App/algo 已在 IncludePath)。

验证:
- 主机单测 52/52 PASSED。
- @build 0 错误 0 警告;内存快照已刷新(RW_IRAM1 89,320→90,936 B)。
- 台架:L2 链路数据正常(ring=10001、skip=0、回读一致、相量日志可见),
  但 10 次运行中 3 次出现 UI 任务看门狗停喂(mask=0x67 缺 TASK_WD_UI)
  → IWDG 复位;改动前基线 6 次运行 0 次。属**未定位的间歇性回归**。

未完成:定位并修复该间歇性复位;L2 文档状态与登记簿条目尚未按结论更新。
2026-10-10 17:39:37 +08:00
wandering1 66186e1dae chore: 清理 .gitignore 合并残留(死忽略项 + .venv 重复)
CI / L0 静态门禁 (pre-commit) (push) Has been cancelled
CI / L0.5 主机侧单测 (MSVC) (push) Has been cancelled
合并 v2-on-ui 时 master 侧的两条忽略项成为残留:

- tools/serial_tool/state/ —— 该目录在 v2-on-ui 已删除,忽略规则失效
- .venv/ 重复 —— 与 v2-on-ui 的 "# Python venv (unified env, ...)" 重复

删掉这 6 行后 master 的 .gitignore 与 v2-on-ui 完全一致(均 138 行)。
*.dep / *.suo 的重复是历史遗留(合并前即存在),本次未动。
2026-10-10 16:55:12 +08:00
wandering1 f81747f7e3 Merge branch 'v2-on-ui' into master
CI / L0 静态门禁 (pre-commit) (push) Has been cancelled
CI / L0.5 主机侧单测 (MSVC) (push) Has been cancelled
把 v2-on-ui 开发主线(250 个提交)合并进 master:涵盖 B0 产品定义、
B1 ADC 采集链路、1 kHz TIM6 采样节拍、L1-3/L1-4 语义通道映射、
@build/@download 收敛到 .dsh/skills/ 下的 skill(删除 build.bat /
download.bat / reset.bat)等。

master 侧 3 个提交(.gitignore 忽略项 + simulator/sim_config.ini)
已保留,无冲突。
2026-10-10 16:46:28 +08:00
wandering1 5009a844a9 收敛 reset.bat 到 stlink-flash skill 并删除该批处理
CI / L0 静态门禁 (pre-commit) (push) Has been cancelled
CI / L0.5 主机侧单测 (MSVC) (push) Has been cancelled
stlink_flash.py 新增 hard 子命令(-c SWD RM=Hrst -HardRst PULSE=100),
RM= 被 CLI 拒绝时自动降级为系统复位并打印 RESET_NOTE;至此 reset.bat 的
全部子命令(复位/hard/halt/run/list/flash/cmp)均已由 skill 覆盖。

删除 MDK-ARM/reset.bat(git rm)。@build/@download 两条旧批处理入口至此
全部收敛到 .dsh/skills/ 下的 skill,一个能力一个实现。

同步更新引用:AGENTS.md、README、MDK-ARM/README、7 篇 docs、4 个 skill
(stlink-flash/serial-boot-test/new-machine-setup 及 config.example.json)。

真机验证:hard 子命令 RM= 被拒 → RESET_NOTE → 回退系统复位 → STLINK_RC=0。
2026-10-10 16:41:46 +08:00
wandering1 5defabcabb build: 删除 MDK-ARM/download.bat,烧录收敛到 stlink-flash skill
- test/run_all_suites.py 是唯一执行它的地方:DOWNLOAD_BAT 改为 STLINK_FLASH
  (.dsh/skills/stlink-flash/scripts/stlink_flash.py);直烧改
  [py, STLINK_FLASH, "flash"](原先把 .bat 包给命令行解释器执行);
  --flash-cmd 改由同一常量拼出,不再硬编码 .bat 路径
- 机制变化(须知晓):原 download.bat 走 UV4 -f(CMSIS-DAP),现走
  ST-LINK_CLI -P <hex> -Rst -Run —— 与 .serialtest/config.json 的
  flash_cmd、AGENTS.md 烧录铁律、回读 -CmpFile 要求同源;6.5s/1MB
  也快于 UV4 路径
- AGENTS.md / 环境与部署 3 篇 / ST-LINK_CLI 复位说明(原文写"正式流程仍以
  download.bat 为准",已反转)/ 自动化测试流程 / 串口助手设计说明 /
  链路延迟 / m2_data / README / MDK-ARM/README:引用改指 skill
- .gitignore:download_log.txt 条目保留并注明 legacy(他机残留物不变
  untracked);build 日志注释同步
- 保留 MDK-ARM/reset.bat:其 hard/halt/run 子命令是 skill 没有的
- 刻意未改:docs/问题记录/项目审查与优化建议报告.md 的 P2-15(史实)
- 验证:run_all_suites.py --dry-run 解析出 skill 路径;doc-links 123 通过
2026-10-10 16:28:58 +08:00
wandering1 4f71947934 chore: .gitignore 构建日志注释改指 keil_build.py
build.bat 已删除(c77c582),该注释里的 "regenerated by build.bat"
随之失效。
2026-10-10 16:24:46 +08:00
wandering1 c77c5824f9 build: 删除 MDK-ARM/build.bat,@build 完全收敛到 keil-build skill
- test/run_all_suites.py 是唯一真正执行它的地方:BUILD_BAT 常量改为
  KEIL_BUILD(.dsh/skills/keil-build/scripts/keil_build.py);两处构建点
  改传 --timeout(脚本内超时先于 _run 超时触发,超时得 rc=1 + BUILD_FAIL
  文案,而不是被 _run 杀掉)
- AGENTS.md / keil-build SKILL.md / new-machine-setup SKILL.md:删除
  "等价原生入口"口径,改为注明该文件已于 2026-10-10 删除
- 环境与部署 3 篇 / 项目架构总览 / README / MDK-ARM/README /
  download.bat 注释 / check_mem_numbers.py 提示串:移除 build.bat 引用
- 刻意未改:docs/问题记录/项目审查与优化建议报告.md 的 P2-14 / N-18
  (历史审计条目;doc-links 不校验裸文件名,保留不影响门禁)
- 验证:keil_build.py --timeout 300 -> BUILD_OK / rc=0;
  run_all_suites.py --dry-run 正确解析 skill 路径;doc-links 123 文档通过
2026-10-10 16:23:54 +08:00
wandering1 7a54fdbc73 docs(build): @build 统一为 keil-build skill,build.bat 降为等价原生入口
- AGENTS.md 构建条:@build = keil-build skill(写明 UV4 解析链、退出码
  0/1/2/3、日志路径);MDK-ARM/build.bat 明确为等价原生入口,并列出
  它相对 skill 缺的三项(无超时保护 / UV4 只认 DTU_KEIL_UV4 / 失败 dump 整份日志)
- keil-build SKILL.md「本仓库」段同步:skill 即 @build 口径
- 3 个 skill(new-source-file / ui-verify / new-machine-setup)与 8 篇
  docs、README、MDK-ARM/README、环境与部署 3 篇:命令示例与 @build
  标识统一改指 skill
- scripts/stack_report.py 的构建提示串改指 skill
- 环境与部署:DTU_KEIL_UV4 使用方补 keil_build.py;反向测试期望的报错
  文案对齐 skill 实际输出(BUILD_ENV_ERROR: ... is set but not a file)
- 刻意未改:docs/问题记录/项目审查与优化建议报告.md 的 P2-14/N-18
  历史审计条目(属史实记录);test/run_all_suites.py 的 BUILD_BAT
  常量(是代码、非文档,改动需另做验证)
2026-10-10 16:19:14 +08:00
wandering1 43c958cac1 docs(agents): AGENTS.md 按项目现状更新(L1 层/钩子清单/栈数字)
- 提交门禁钩子清单 4 -> 18 个:补齐 test-cppcheck / no-mojibake /
  coding-standard / doc-links / task-table / mem-numbers /
  cubemx-survival / 三个主机侧单测 / test-suite-switch
- 提交信息补"正文每行 <=80 字符"(gitlint 默认 body-max-line-length 未关)
- ADC 取数条补 L1 采集层消费者入口 adc_input_poll/adc_input_raw
- E-59 闸门 adcTask 栈数字 504 B/75% -> 560 B/72%(2026-10-10 实测)
- 任务数 6 -> 7(新增 adcTask),栈表脚注同步
- 新 .c 注册补"新目录还须加 uvprojx IncludePath"(本次踩坑)
- 架构要点新增 App/algo/(L1/L2 落点)一条
- requirements.txt 注释指向已删的 tools/serial_tool -> .dsh 串口 skill
2026-10-10 16:11:20 +08:00
wandering1 d59c2198eb feat(adc): L1 采集层落地——STM32 ADC1 扫描 + 语义通道映射
新增 App/algo/adc_input.c/h(L1 采集与预处理层,落实 L1-3/L1-4):
- L1-4 语义通道映射表 k_adc_map[]:UA/UN/IA → TPAFE buf[6]/[5]/[2];
  UB/UC/IB/IC/IN/TEMP → STM32 ADC1 CH14/3/6/1/2/5。消费侧一律经
  adc_input_raw() 按语义取数,不写死下标(V0.2 改版只改表内容)。
- L1-3 STM32 ADC1 9 通道软件触发顺序扫描:HAL_ADC_Start + 逐通道
  PollForConversion/GetValue(EOC_SINGLE_CONV + 无 DMA,可逐通道轮询)。
- adc_input_poll() 统一"TPAFE 原子快照 + STM32 扫描";
  adc_input_init() 做映射自检(STM32 映射通道必落在扫描序列内,否则
  返回 -1),挡住"映射到不扫描的通道 → 恒读陈旧值"的静默错。

集成:
- adc_task.c 取数改走 L1 层(首帧日志补全 8 路 + 温度;心跳增
  adc1_rc/adc1_err 观测 STM32 侧健康度)。
- app_main.c 在 tpafe5160_init() 之后调 adc_input_init(),失败记
  SYSLOG_SELFTEST("ADC map fault")。
- Keil 工程挂 adc_input.c 并加 ../App/algo 包含路径。
- 文档同步:继电保护规划 §1.2/§3.1(L1-3/L1-4 改 ✅)、ADC通道映射说明
  §7/§8/§9、产品需求 §5.9/§9、架构总览 §7、AGENTS.md、App/README.md、
  App/task/README.md、新增 App/algo/README.md、boot_log_data 清单。

验证:
- @build 0 错 0 警;镜像无源文件新于 hex。
- 台架 @test PASS:ADC input layer init OK、adc1_rc=0/adc1_err=0
  (30 s ≈27 万次转换零超时)、seq 仍 1000.0 Hz、adc 栈峰值
  528→584 B(余 71%)、回读一致、零 [ERR]/HardFault。
  证据 docs/测试说明/boot_log_data/20261010_prod_adc_l1_boot_log.txt
- 内存快照已刷新(Flash 269,404→270,712 B)。
2026-10-10 16:06:31 +08:00
wandering1 b80f59cc5d fix(bench): ST-LINK_CLI 子进程加 stdin=DEVNULL,闭环不再挂死
- stlink_flash.py::run_cli 与 run_boot_test.py::_run_cmd 调 subprocess.run
  时未给 stdin=DEVNULL:ST-LINK_CLI 编程完成后停在 "run application to
  exit" 等 stdin,stdin 是未关闭管道即永久挂起(编程其实已成功、板子已
  复位运行)→ 闭环误判 flash rc=-1(180s 超时)
- 归档 ADC 1kHz 台架证据 boot_log_data/20261010_prod_adc_tim6_boot_log.txt
  并在 README 清单登记
- 同步 ADC采样节拍设计说明(状态→通过台架验收、新增 §7.1 实测)
  与 继电保护功能复现规划 L1-1
2026-10-10 15:46:21 +08:00
wandering1 970e574433 feat(adc): 1 kHz 采样节拍改由 TIM6 硬件定时器触发
- CubeMX 加 TIM6(PSC=83 / ARR=999 / ARR 预装载 / NVIC 抢占优先级 6)
- Src/main.c 回调加 TIM6 分支触发 CONVST(USER CODE 区)
- app_main.c 用 HAL_TIM_Base_Start_IT(&htim6) 替换单次触发
- adc_task.c 退化为纯消费者(1 ms 轮询仅作消费节奏)
- @build 0 错 0 警;台架 @test 验收待做
- 同步 ADC采样节拍设计说明 / 继电保护复现规划 / AGENTS / TPAFE README
2026-10-10 15:24:02 +08:00
wandering1 f0300761ae 串口采集/测试去重:删 tools/serial_tool 与 test/host run_boot_test/verify_log 副本,引用改指 .dsh/skills 串口 skill 2026-10-10 15:13:23 +08:00
wandering1 da66c500ea fix(console): gate adcTask logs on console-writer readiness
B1 on-board closed loop surfaced a byte-level console interleave: before
the console writer (defaultTask) registers, con_append() routes to
dbg_console_write_raw() -> con_tx_bounded(), which is register-level
polling with no mutual exclusion. adcTask logged every 1 ms, so its
first-frame line collided with defaultTask's [NAND_FTL] init line and
the required marker spanned two interleaved lines -> false FAIL.

- console_log: add dbg_console_writer_ready() (returns s_con_writer_up)
- adc_task: gate first-frame and 10 s stats logs on writer readiness;
  defer the first-frame report until the writer is up
- docs: close B1/P1-1 in the registry; flip stale "remaining @test"
  notes; correct the console doc's obsolete "drop-only, no interleave"
  claim (that held for HAL gState, not register-level raw send)

Bench (run_boot_test.py): VERDICT PASS, readback OK. adcTask
frames/seq +10000 per 10 s = 1000 Hz, idle=0, frst_err=0; stack
496/2048 (75%). @build 0/0.
2026-10-10 14:53:36 +08:00
wandering1 7c4b724057 新增 cubemx-regen、board-test-suite、new-machine-setup、mem-budget 四个项目级 skill 2026-10-10 14:41:30 +08:00
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 dee6233d50 重建保护规划文档:恢复 §1.5/§1.6/§5,清除外部回写损坏
外部工具于 14:04 把本文档回写为旧稿:§1.5/§1.6/§5 丢失、
§10 混入 66 组下划线标签、表格被填充对齐;该旧稿被 aac5f99
一并提交,成为该文件的首次入库内容。

本次按权威来源重建:§1.5 B0 产品定义、§1.6 B0-c 本期范围
(定论 = 骨架全做 + 有效通道子集闭环)、补齐 §5 定值参数模型;
清除全部下划线标签、表格压回仓库紧凑风格;同步 §1.3/§3.3/
§6.4/§7.1/§7.2/§7.3/§9 R1/§10.3。
2026-10-10 14:12:08 +08:00
wandering1 aac5f99fe9 移除 OpenCode 配置与命令,技能与串口单一配置源迁移至 .dsh/skills 与 .serialtest,同步更新全部文档引用 2026-10-10 14:05:36 +08:00
wandering1 e89fe54a97 重写看门狗设计说明为现状说明:删立项前旧描述、补FTL心跳路由与取证机制、修掩码与复位归因 2026-10-10 10:57:31 +08:00
wandering1 0779d3a075 栈整改不抬栈:删旧档迁移、FIL静态化、日志行缓冲按模块收紧、钩子脱离HAL,defaultTask链5312→2776B 2026-10-10 10:17:00 +08:00
wandering1 5c978465c9 TPAFE驱动闭环E-44/E-45/E-58取数契约,固化E-59门禁,adc_task挂进Keil工程 2026-10-10 03:46:50 +08:00
wandering1 66b6cdf425 登记 N-18:8 路电气量分属两片转换器属 V0.1 硬件缺陷,V0.2 改版须全接 TPAFE,撤销旧有意分配口径 2026-10-10 03:24:10 +08:00
wandering1 61a6061950 串口助手补残行封顶与会话边界复位、截头按行对齐、open 保持 dtr/rts;判定加命中行/顺序/耗时/JSON 与产物清理 2026-10-10 03:17:16 +08:00
wandering1 fccf99bc90 测试闭环补固件身份戳、烧录回读校验与启动锚点计数,并修cmd引号解析与flash-cmd预检缺陷 2026-10-10 02:54:33 +08:00
wandering1 b37fdea21b 修复串口助手6处采集缺陷:wait-idle no_data与首字节门、log先过滤后截尾、HTTP独占绑定修正、超时不再误拉daemon、配置BOM容错 2026-10-10 02:33:44 +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 63ee090fd1 行尾策略写死进 .gitattributes(统一 LF、bat 强制 CRLF、二进制显式标注),根治重生成后的行尾幻影改动 2026-10-10 01:15:16 +08:00
wandering1 53bd9af02e 对齐 CubeMX 输出:提交第三方与生成文件的文件末尾空行(85 文件,零逻辑变化) 2026-10-10 01:05:15 +08:00
wandering1 5eed2151de CubeMX 生成 ADC1(9 通道)+ 复原重生成定制,FreeRTOS 加固迁 L1、钩子落 USER CODE 4/5,门禁豁免生成文件空白改写 2026-10-10 00:53:20 +08:00
wandering1 718d399f70 net_drain_chip_rx 补实测注释:scratch 静态化反亏,勿再"优化"
ARMCC 把 256B 分块 scratch 与同函数内不重叠的 192B 日志缓冲叠放
实测静态化只省 ~16B 栈、反增 256B BSS,已回退并留注释防重复尝试
2026-10-09 17:17:48 +08:00
wandering1 6f3891a6b9 ADC 通道映射表建档(V0.1 语义固化)+ .ioc 启用 ADC1 九通道
新增 docs/硬件平台/ADC通道映射说明.md:17 路语义↔网名↔通道号权威映射
语义:UA/UB/UC/UN=AIN1~4、IA/IB/IC/IN=AIN8~11、V_ZL2=温度,其余备用
勘误:PC4=ADC12_IN14(非 IN12);PB0=ADC12_IN8(V0.0 B5 定性有误)
勘误:PC5=ADC12_IN15;网名 ADC17 承载 UB,不是 V_ZL2
.ioc:PA0~PA7/PC4 → ADC1_IN0..7/IN14,Rank1~9 + 144 cycles + 软件触发
.ioc 键名与取值逐条比对 CubeMX 自带 DB(aditf2_v1_1_Cube)后写入
尚未 Generate Code:adc.c 与 HAL adc 驱动未入库,生成后需注册 uvprojx
2026-10-09 17:17:32 +08:00
wandering1 ed463716f6 netTask 栈 1024→960:按静态最坏链核算并同步 .ioc/README/审计基线
静态最坏链 2664B(日志主导:链上 5 帧各含 192B __con_line + 尾部 696B)
3840B 配置下余量 1176B(30.6%),过 stack_report 规则
net_drain_chip_rx scratch 静态化实测仅省 16B 栈、反增 256B BSS,已回退
.ioc FREERTOS.Tasks01 同步 960(L1 记账,重生成不丢)
2026-10-09 17:14:52 +08:00
wandering1 9734c2526a 新增产品需求设计文档:完整产品需求基线
基于项目全量内容编写 docs/产品需求/产品需求设计文档.md,作为面向
产品的需求基线,覆盖:
- 产品概述:定位、形态与部署、设计目标与原则、产品范围
- 系统架构:六层分层、六任务模型、就绪屏障、启动时序、线程间通信
- 硬件规格:主控/内存、V0.1 外设引脚、存储器件、版本差异、平台约束
- 功能需求:网络/存储/时间/配置/日志/UI/看门狗/LED(已实现)+
  ADC/RS-485(待实现)
- 接口规范:端口、RemoDispBus、对时、FTP、配置格式、串口、对外 API
- 非功能需求:可靠性、性能指标、内存预算、测试门禁、双端、权限
- UI 规格:屏幕/菜单树 42 节点/内容页/密码/字体
- 待实现项与路线图(阶段 B/C/D)、验收判据(构建/自检/现场/台架)

同步在 docs/README.md 新增 §3 产品需求、§2 阅读顺序置顶、§1 目录树
登记产品需求/,后续章节号顺延。
2026-10-06 02:48:54 +08:00
wandering1 ad0fd53389 阶段 D 收口:P3 卫生六项 + S-2 boot_log 存档流程 + 登记簿销项
阶段 D(验证与卫生)离线可完成项收口;台架依赖项 D2/D5/D6 保留登记。

- D4 P3 卫生六项:
  - P3-1 cfg_file.c s_encode:STR 型 len==0 回绕(p_key->len - 1u)直接拒绝
  - P3-2 cfg_file_store_mcu.c:原子写临时名由 p_path 同目录推导(s_build_tmp_path)
  - P3-4 rs485.c:模块描述订正为实际实现(HAL_Delay(1),非 DWT µs)
  - P3-6 ch395f_get_socket_status:补 p_status NULL 检查
  - P3-8 build.md:退出码契约订正为 0/1/2 三档
  - P3-11 adc_task/rs485_task:注明"预留桩(未启用)"
- D3 S-2:新增 docs/测试说明/boot_log_data/(快照存档目录 + 流程),
  并在 测试开发标准流程.md §7.3 登记沉淀约定
- 登记簿销项:删 P3-1/2/4/6/8/11、S-2;阶段 D 表移除 D3/D4;
  §1 计数更新(P3 6→0、登记簿 10→9);§3 章节重排
  (登记簿→§3.2、专项→§3.3);清理 App/cfg/README.md 等对已销编号的引用
- 同步刷新内存快照:Flash 266,632 B / ROM 合计 267,372 B

验证:@build 0 错 0 警;cfg_file 主机单测 149/149;
pre-commit --all-files 17/17 通过。
2026-10-05 10:15:53 +08:00
wandering1 de1b50efe9 修复 P1-7:MAC 写入顺序改为 INIT_CH395 之前
- 手册 §9.2.1:SET_MAC(步骤①) 必须先于 INIT_CH395(步骤⑤);SET_MAC 写
  芯片 EEPROM,INIT 从中加载 MAC——原顺序反了则本次上电 MAC 不生效
  (回落芯片内置/上次值),UI 显示与设备在线身份不符
- net_socket.c net_init():SET_MAC 移到 ch395f_init() 之前(对齐步骤①)
- ch395f.c:四个 SET(MAC/IP/GWIP/MASK)限定条件注释由"芯片已初始化"
  订正为"必须在 ch395f_init() 之前调用"
- net_socket.h / BSD_Socket_API_函数调用关系.md:同步顺序描述
- CH395F_Trap_Records.md:新增 Trap 24 沉淀根因与修复
- 待处理内容.md:P1-7 销项(§1/§2 阶段 A/§3.1/§4);阶段 A 清空后重编号
- 验证:Keil 构建 0 错 0 警;pre-commit 17/17 全通过
2026-10-04 23:07:00 +08:00
wandering1 72c0bd2f7c docs(待处理): 删除已闭环条目并重组登记簿结构
- 删除已完成内容:§1 的 P0/P2 行、§3.1 的 P1-8 已闭环 stub、
  §3.2 的 P2 销项索引表与"已销项 P2"列表、§3.3 的"已销项 P3"列表、
  §4 的 P0-1 已闭环说明段
- 重组:§3 重编号(P3→3.2、登记簿→3.3、测试与架构专项→3.4,
  子节 3.4.1~3.4.4);§8 维护约定的章节引用同步
- 同步清理失效编号引用(P2-12/P1-8);实机测试实施指南溯源表
  的 P1-8 上游改为"原台账项,已闭环"
- pre-commit 全通过(doc-links 等)
2026-10-04 22:32:42 +08:00
wandering1 e0b02d397c 修复 P2 全部 10 项:错误传播/竞态/门控/文档失真
待办池 docs/待处理内容.md §3.2 的 10 个 P2 全部闭环;逐项落代码 + 注释说明。

P2-1  cfg_file: 受管键行超 CFG_LINE_TEST_MAX 拒绝保存(防重复键行)
P2-2  ch395f: DMA 失败传播状态 + 锁存通道故障 + 读不拷不可信数据
P2-7  net_select: LISTENING 不再恒判可读(消除 select 忙轮询地雷)
P2-8  time_sync: 核实 L3 pending 改写已闭环(net_recv_to 分片 + 总预算)
P2-9  sys_log: 挂载改幂等 + 卷锁,defaultTask 2s 重试建 /log
P2-10 sys_log: s_read_raw 纳入卷锁 try(读者/写者 unlink 互斥)
P2-11 net_task: RECONFIG 改 osEventFlagsWait 原子取走 + 清除
P2-12 app_cfg: APP_*_ENABLE 如实标注为未接线占位,删“开关”说法
P2-13 freertos: 产品构建 vTaskDelete(testTask) 回收 8KB CCM 栈
P2-15 download.bat: 先删旧日志 + 增“未产出日志”判定

P2-13 用 USER CODE 区回收而非生成区 #if 门控:生成区改动会被 CubeMX
重生成覆盖,本方案重生成不丢。P2-12 因产品定义 B0 未定、APP_NET_ENABLE
无单一接线点,按修复建议备选(删“开关”说法)处理。

验证:@build 0 错 0 警;主机单测 watchdog 39/39 + sys_clock 100/100 +
cfg_file 149/149(新增 TC-CFG-044);pre-commit --all-files 17/17。
2026-10-04 08:30:30 +08:00
wandering1 13eeba944b docs: P0-1 真机 @test 收口(§4.1 待验证清空)
对 docs/待处理内容.md §4.1「待验证」唯一未闭环项 P0-1 做真机验证并收口:

- @build 0/0(增量;已确认无 C 源文件新于镜像)
- @test VERDICT PASS(rc=0):[CFG] load: OK (523B, heap free 8840B)
  + Forbidden FAIL/ERROR/HardFault/[ERR] 零命中
  + selftest: no fault record(先清掉 2026-10-02/03 注入窗口遗留 67 条)
- ST-LINK 全片回读 No difference found(0x08000000~0x08040F9B)

文档收口:
- 待处理内容.md:§4.1 清空 → §4 改「待确认」;§1 P0 行改为已闭环
- 配置文件设计说明.md:增 2026-10-04 复跑记录行(证据沉淀)
- 项目审查与优化建议报告.md:三处「真机确认待执行」改为已 PASS
- 实机测试实施指南.md:A1 行补 2026-10-04 记录

pre-commit 17/17 Passed。
2026-10-04 08:04:34 +08:00
wandering1 75c234b0c2 docs: 项目审查报告移入 问题记录/,删除空的 审查记录/ 目录
让评审报告与 待处理内容.md 的分工更直观:
- git mv 项目审查与优化建议报告.md → docs/问题记录/(与 Trap 台账、
  错误码传播审计同处"专项审计"目录);rmdir 空的 docs/审查记录/。
- docs/README.md:§8 标题改为「评审报告 · 环境与部署 · 外部资料」,
  §8.1 改为「评审报告」,目录树删 审查记录/、补 问题记录/ 说明,
  按角色导航改为 §8.1/§8.3,补 2026-10-04 变更记录。
- 根 README.md 目录树同步。
- docs/文档规范.md §1.1 现有目录列表、§6 归属表同步。
- 看门狗设计说明.md / 待处理内容.md 的路径引用重定向。

pre-commit 17/17 Passed。
2026-10-04 02:34:40 +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 7f393956cc 测试与架构改进建议:删除已落地条目,只保留待办
- 12/14 条建议已落地,按"只保留待办"约定重写本文件
- 保留:S12 断言宏、S1-c 可选单测、A-4 采集链路测试约束
- 保留:A-5 残余(CI 体积门禁盲区)
- 保留:错误码通道四要素(设计基线,供后续驱动接入沿用)
- 删除:S1-a/S1-b、S2~S11、S13、S14;T-1~T-5;A-1~A-3/A-6/A-7
- 删除:评价表/盘点表、路线图、总结、变更记录
- 同步修正 6 个外部文档对本文件章节的死引用
- 新增"编号约定":S/T/A 编号不随条目删除而回收
2026-10-04 02:12:41 +08:00
wandering1 5955ac010d 测试与架构改进建议 2026-10-04 状态更新:S1~S14 落地复核与体系计数刷新
- 全量复核 S1~S14 落地情况并就地标注:已落地 12 条,待做 S12
- 体系计数刷新:L0.5 模块 1→3(看门狗/sys_clock/cfg_file)
- L0 钩子 15→18、板端套件 4→5、CI 已补产物存档与汇总行
- §0.1/§0.3/§1.1/§1.2/§1.3 T-1~T-5 同步更新
- §2.2~§2.8、§3.1~§3.7、§4.1~§4.7、§5.1/§5.2、§6 同步更新
- 修正交叉引用整体错位:T-3/T-4/T-5 与 A-1/A-3/A-5/A-6/A-7 各偏一节
- §2.6 同步 2026-10-04 重采数据:min_ever=4,728 B
- 上游 S-1 升级为 defaultTask 3664/4096(余量约 10%)
- 变更记录补 2026-10-03 台架窗口条目(S4/S5/S7/S9/S11)
2026-10-04 02:05:39 +08:00
wandering1 1098fbd952 错误码传播审计:订正计数与索引——未闭环 25→17、已闭环 33→41,同步 E-34/E-04/GD5F族/E-60 闭环;§0 结论速览、§2 索引、§3 分类计数、§4 矩阵与文末订正记录 2026-10-04 01:59:44 +08:00