- 将原本在 calibrate_cogging_tick 中的大函数拆分为多个职责单一的函数 - 新增 start_cogging_calibration、cogging_settling_tick、cogging_sampling_tick、 cogging_stopping_tick、cogging_done_tick 等状态处理函数 - 添加 process_cogging_run_data、start_next_cogging_run、build_cogging_tables、 print_cogging_table、print_cogging_c_array 等辅助函数 - 移动全局 FOC 控制器单例注释到更合适位置 - 添加齿槽转矩校准参数常量定义和详细注释 - 添加防御性编程处理默认状态分支,避免状态机卡死 - 提高代码可读性和维护性 feat(tasks): 添加任务头文件到项目配置 - 在 Robot_V2.cproject.yml 中添加 tasks.h 和 tasks.cpp 文件引用 docs(ADC): 添加ADC转换常量说明注释 - 在 ADC.cpp 中添加关于ADC换算常量的详细注释 - 说明全局采样器单例的初始化和使用方式
6.0 KiB
6.0 KiB
静态检查告警审查说明
本文件用于记录人工确认后的静态检查告警处理结论。原则:
- 不为消除低风险 warning 引入会改变实时行为的代码。
- 裸机系统级单例、编译期常量、ISR/主循环共享状态分别分类说明。
- 对涉及实时路径的并发项,优先记录访问边界和偏离理由;只有经过实机验证后再做逻辑修复。
SUP-GLB-001:文件作用域对象
编译期常量
以下 constexpr 对象为编译期常量,非可变全局状态,无运行期写入、并发访问或动态初始化顺序风险:
device/ADC.cpp:ADC_SCALE,TEMP_FACTOR,VCC_FACTOR,CURRENT_FACTORdevice/Can.cpp:CANXsys/health.cpp:PROTECT_TIMEsys/config.h: 版本号、Flash 地址、协议 ID、滤波/PID 参数、数学常量、Timer 参数等constexpr配置项
处理结论:按静态检查误报/偏离处理。
系统级硬件/模块单例
以下对象对应裸机固件中的唯一硬件资源或唯一管理器:
Algorithm/FOC.cpp:FOC_Controller FOCdevice/ADC.cpp:sampler samplerdevice/Can.cpp:CAN_transmiter CAN0_transmiterdevice/ang_sensor.cpp:angle_sensor KTH7823sys/health.cpp:ThermalController thermalControllersys/initial.cpp:VersionManager Version
访问边界:
- 初始化顺序由
main::hardware_init()显式控制,例如KTH7823.init()、sampler.init()、CAN0_transmiter.init()、FOC.init()。 VersionManager Version构造仅复制constexpr版本号常量,不依赖外设初始化。- 运行期主要由主循环任务访问;CAN 命令路径会更新 FOC 目标值和参数。
处理结论:接受系统级单例设计,保留文件作用域对象,并通过注释说明初始化顺序和访问边界。
ISR/主循环共享状态
main.cpp: TaskScheduler scheduler
TIMER2_IRQHandler()置位任务标志。- main 循环短关中断后读取快照并清除已处理任务位。
处理结论:已有短临界区保护,接受。
device/Can.cpp: CAN RX/TX 队列索引
涉及:
rx_queue_head,rx_queue_tail,rx_queue_counttx_queue_head,tx_queue_tail,tx_queue_count
访问边界:
- RX/TX 队列被主循环、CAN 中断、DMA 完成中断共同访问。
- 队列 push/pop/peek/disable 通过
CAN_EnterCritical()/CAN_ExitCritical()保护。 CAN_ExitCritical()使用__set_PRIMASK(primask)恢复进入前中断状态,而不是直接__enable_irq(),避免误打开外层已关闭的中断。
处理结论:已有临界区保护,接受。
device/ADC.cpp: injected 电流采样缓存
涉及:
adc_current_value[3]adc_current_frame_ready
访问边界:
ADC0_1_IRQHandler()写入 U/V/W injected 同步采样值,并置位adc_current_frame_ready。sampler::update_current()在主循环任务中看到 ready 后读取三相采样并更新滤波缓存,随后清 ready。- 该路径属于高频电机采样/控制链路。此前尝试在读取侧加入 PRIMASK 快照后,实机出现上电连续重启;回滚后恢复正常。
处理结论:当前不再为消除 warning 增加临界区逻辑,避免改变高频实时路径时序。保留现有 volatile 共享标志设计,作为实机已验证的稳定实现;如后续需要修正,应单独建立实验分支并做示波/日志验证。
sys/systick.cpp: DWT CPU 占用率统计变量
涉及:
task_enter_cyccntbusy_cycles_accumsample_secondscpu_usagedwt_initialized
访问边界:
busy_task_enter()/busy_task_exit()在主循环任务侧记录和累加忙碌周期。SysTick_Handler()每 1 秒读取并清零统计值,更新cpu_usage。- 此路径仅用于诊断 CPU 使用率,不参与控制闭环。
- 此前尝试在
busy_task_exit()加入 PRIMASK 临界区后,与 ADC 临界区改动同轮导致实机上电连续重启;已回滚并恢复正常。
处理结论:当前不再为该诊断统计项增加临界区,避免影响高频任务时序。允许 1 秒窗口内存在极小统计误差,作为诊断值可接受。
device/ang_sensor.cpp: SPI DMA 完成标志
涉及:
spi_dma_tx_completespi_dma_rx_complete
访问边界:
- SPI 传输前清零标志。
- DMA ISR 完成后置位。
- 轮询函数等待标志或超时。
处理结论:典型 ISR/轮询共享 volatile 标志,接受。
device/Timer.cpp: total_us100_counter
访问边界:
- 仅在
TIMER2_IRQHandler()内作为 100us 调度索引写入和使用。
处理结论:虽然为文件作用域变量,但无跨上下文并发写风险,接受。后续可考虑改为 ISR 内 static,但当前不为 warning 改运行逻辑。
sys/health.cpp: 电压管理状态
涉及:
voltage_statelast_vbus_slow
访问边界:
- 仅
power_manage()慢速任务访问。 - 文件内
static封装。
处理结论:模块私有状态机变量,接受。
SUP-CMP-001:浮点比较
normalizeAngle360() 边界判断
代码形态:
while (angle >= 360.0f) angle -= 360.0f;
while (angle < 0.0f) angle += 360.0f;
结论:该比较用于角度归一化边界判断,目标区间严格定义为 [0, 360),不是浮点相等性判断,也不是传感器阈值判定。不需要容差。
printf / snprintf 类检查
- FOC 齿槽校准打印位于
#if FOC_DEBUG,正式配置FOC_DEBUG=0时不参与编译。 VersionManager::versionToString()已从snprintf()改为固定格式的轻量手写拼接,避免格式化库引入。
AUTO-MET-001:圈复杂度
已拆分以下函数,降低单函数圈复杂度:
FOC_Controller::calibrate_cogging_tick():拆分为状态派发和各状态处理函数。CAN_transmiter::communication_check():拆分为周期发送、接收分发、特殊消息、节点消息等处理函数。do_task():拆分为高频采样/电机控制、低频维护、CAN 任务。
处理结论:拆分后原目标函数复杂度已显著下降;实编仍需在 Keil/CMSIS/cbuild 环境验证。