4.0 KiB
4.0 KiB
STATIC_ANALYSIS_NOTES 复核修订版(2026-10-19)
原文件:仓库根目录
STATIC_ANALYSIS_NOTES.md(最后修改于 7c4aaa5,2026-09-01),本次保留未改。 复核基线:master86ca766(2026-10-13)。完整评审见 Motor_v2_专家评审_2026-10-19.html。
| 条目 | 原结论 | 当前状态 | 证据 / 说明 |
|---|---|---|---|
| SUP-GLB-001 编译期常量(ADC/health/config constexpr) | 误报/偏离 | 仍成立 | ADC.cpp:22-47;health.cpp:107;config.h 全部为 constexpr |
| 硬件单例 FOC / sampler / CAN0_transmiter / KTH7823 / thermalController / Version | 接受单例 | 仍成立 | FOC.cpp:28;ADC.cpp:60;Can.cpp:86;ang_sensor.cpp:39;health.cpp:104;initial.cpp:218 |
| TaskScheduler scheduler 短临界区 | 已保护,接受 | 仍成立 | main.cpp:68-72 关中断取快照并清位;taskFlags volatile(initial.h:75);两写入方同抢占级 |
| CAN RX/TX 队列临界区与 PRIMASK 恢复 | 已保护,接受 | 基本成立,但有遗漏 | Can.cpp:644-731、480;遗漏:主循环 CANFD_AsyncSend 直接写邮箱与 TX ISR 竞争(Can.cpp:1395/744,见M21) |
| ADC injected 电流缓存不加临界区 | 保留现状 | 风险仍在 | ADC.cpp:62-63、467-481 存在三相撕裂/丢 ready(M33);建议序号双读而非 PRIMASK |
| “加 PRIMASK 后实机连续重启”归因于时序 | 归因时序 | 归因不成立 | 10 周期级临界区不足以致复位;更可能是 update_current 提前返回分支(ADC.cpp:468)未恢复中断 + 与 systick 改动捆绑未隔离 + 50 ms 看门狗(IRC40K)余量小;无复位原因记录无法定位 |
| systick DWT CPU 占用统计 | 允许小误差 | 仍成立 | systick.cpp:75-79、193-206;仅诊断值 |
| ang_sensor SPI DMA 完成标志 | 接受 volatile 标志 | 已过时 | 已改为寄存器轮询 spi_rw_half_word_polling(ang_sensor.cpp:57-82),标志不存在;新问题:TRANS 等待无超时(:78) |
| Timer total_us100_counter | 仅 ISR 使用,接受 | 仍成立 | Timer.cpp:19、149-153;可改为 ISR 内 static |
| health voltage_state / last_vbus_slow | 模块私有,接受 | 仍成立(有残留) | health.cpp:112-113 文件内 static;last_vbus_slow 只写不读 |
| SUP-CMP-001 normalizeAngle360 浮点比较 | 无需容差 | 比较结论成立,但有新缺陷 | ang_sensor.h:103-111 输入 Inf/NaN 时死循环(M16) |
| printf:FOC 齿槽校准打印位于 FOC_DEBUG | 正式版不编译 | 已过时 | 9fbd9c3 已移除齿槽补偿;FOC_DEBUG 仅剩 motor.cpp:245 一处 |
| versionToString 去 snprintf | 已改 | 仍成立 | initial.cpp:302-346 |
| AUTO-MET-001 calibrate_cogging_tick 拆分 | 已拆分 | 已过时 | 函数随齿槽功能删除;Can.cpp:1186 bit4 改为保留位 |
| AUTO-MET-001 communication_check 拆分 | 已拆分 | 已落实 | Can.cpp:841-1115 |
| AUTO-MET-001 do_task 拆分 | 已拆分 | 已落实 | tasks.cpp:296-399 |
| “实编仍需在 Keil/CMSIS/cbuild 环境验证” | 待验证 | 仍未验证 | 本次评审为静态评审,未实编;cproject -O3 覆盖 build-types(M38)需一并处理 |
需要写回原记录的修订要点
- 删除/标注过时:齿槽校准相关两条(FOC_DEBUG 打印、calibrate_cogging_tick 拆分),9fbd9c3 已移除齿槽补偿。
- ang_sensor 已改为寄存器轮询,“SPI DMA 完成标志”条目应替换为“轮询超时”条目,并补 TRANS 等待超时。
- ADC 电流缓存:保留“不加长临界区”的原则,但撕裂风险真实存在,建议改用序号双读;“加 PRIMASK 导致重启”的归因应改为“未定位”,并在启动时记录复位原因后在独立分支复现。
- CAN 队列:补充“主循环 CANFD_AsyncSend 直接写邮箱与 TX ISR 竞争”的偏离说明或修复。
- normalizeAngle360:比较结论成立,但需补充非有限输入保护。
- health:
last_vbus_slow只写不读,可删除。 - 实编验证仍未完成;同时修正 cproject 中强制 -O3 覆盖 build-types 的问题。