- 添加CAN反馈和ID快照SPI命令文件 - 移除EXMC组件依赖,精简项目配置 - 添加RAM函数段链接脚本,优化Flash等待周期抖动 - 实现EscExmcBus类,提供16位并行总线访问LAN9252 - 实现EscLan9252驱动,支持寄存器和PDI内存访问 - 实现EthercatSlave类,采用三缓冲机制进行PDO数据交换 - 实现EthercatSync同步管理,支持SYNC0/SYNC1中断和定时器模式 - 添加ISR执行时间统计和诊断功能 - 分离周期路径和事件路径通知机制,避免RMW竞态
4.1 KiB
4.1 KiB
Verification Checklist
阶段 H1:safe* 接口收窄为 INIT-ONLY(高危 H1)
comm/esc_lan9252.cpp中safeReadReg实现内无__disable_irq()/__set_PRIMASK()/__get_PRIMASK()调用comm/esc_lan9252.cpp中safeWriteReg实现内无 PRIMASK/disable_irq 调用comm/esc_lan9252.cpp中safeReadPdi实现内无 PRIMASK/disable_irq 调用comm/esc_lan9252.cpp中safeWritePdi实现内无 PRIMASK/disable_irq 调用- 四个 safe* 函数改为直接调用对应无锁版本(
readReg/writeReg/readPdi/writePdi) comm/esc_lan9252.h中四个 safe* 接口注释含"INIT-ONLY"字样与"禁止运行期调用"说明comm/ethercat_slave.cpp中process()注释无"使用 safeReadReg/safeWriteReg"诱导语comm/ethercat_slave.cpp中process()注释含"运行期 PDO 交换仅通过三缓冲;ESC 寄存器访问仅限 init"说明- grep 全项目,
safeReadReg/safeWriteReg/safeReadPdi/safeWritePdi的调用点仅在 init 阶段代码(EthercatSlave::init()或更早),无主循环运行期调用
阶段 M1:SYNC0 ISR 入口包装 RAM 化(中危 M1)
comm/ethercat_sync.cpp中EXTI0_IRQHandler标记__attribute__((section(".ramfunc"), noinline))comm/ethercat_sync.cpp中onSync0Exti标记__attribute__((section(".ramfunc"), noinline))onSync0Exti内无exti_interrupt_flag_clear(EXTI_0)库函数调用onSync0Exti内无exti_interrupt_flag_get(EXTI_0)库函数调用(若有,改为直接读EXTI_PD位)onSync0Exti标志位清零改为直接写EXTI_PD寄存器位EXTI1_IRQHandler/onEscIrqExti未改动(仍可用库函数)EXTI2_IRQHandler/onSync1Exti未改动periodicIsr/readPdi/writePdi/read16/write16仍保持上一轮的 .ramfunc 标注(无回归)
阶段 M2:NVIC 优先级分组最早设置(中危 M2)
sys/initial.cpp的AppInitializer::init()开头(任何外设 init 之前)有nvic_priority_group_set(CONFIG_NVIC_PRIORITY_GROUP)调用device/timer.cpp的SchedulerTimer::init()内无nvic_priority_group_set调用(已移除)sys/config.h中CONFIG_NVIC_PRIORITY_GROUP已定义(应为NVIC_PRIGROUP_PRE4_SUB0)- 全项目 grep
nvic_priority_group_set,确认仅在initial.cpp调用一次(无 timer.cpp 残留,无其他重复) AppInitializer::init()调用顺序中,nvic_priority_group_set在CanFd::init()/AppSpiCommandBus.init()/SchedulerTimer::init()/EthercatSync::init()之前
阶段 M3:删除 readBlock/writeBlock(中危 M3)
comm/esc_exmc_bus.cpp中无readBlock函数实现comm/esc_exmc_bus.cpp中无writeBlock函数实现comm/esc_exmc_bus.h中无readBlock成员声明comm/esc_exmc_bus.h中无writeBlock成员声明- 全项目 grep
readBlock,无任何匹配(含注释) - 全项目 grep
writeBlock,无任何匹配(含注释)
编译验证与一致性检查
- 全量编译通过,无 error(⚠️ 待编译环境修复 EXMC pack 阻塞后验证)
- 静态审查:全项目 grep
__disable_irq/__set_PRIMASK,确认comm/esc_lan9252.cpp的 safe* 实现中无残留 - 静态审查:全项目 grep
exti_interrupt_flag_clear(EXTI_0),确认comm/ethercat_sync.cpp中无残留 - 静态审查:全项目 grep
readBlock/writeBlock,确认无残留 - 静态审查:全项目 grep
nvic_priority_group_set,确认仅在initial.cpp一处 - 若可编译:map 文件确认
EXTI0_IRQHandler/onSync0Exti符号地址位于 SRAM(.ramfunc 段)(⚠️ 待编译环境修复后验证)
风险闭环确认
- 高危 H1(safe* PRIMASK 陷阱):safe* 去 PRIMASK + 收窄 INIT-ONLY + process 注释修正,主循环运行期无 ESC 直接访问通道,闭环
- 中危 M1(SYNC0 入口包装未 RAM 化):EXTI0_IRQHandler/onSync0Exti 入 .ramfunc + 标志位清零去库函数,SYNC0 全程 RAM 执行,闭环
- 中危 M2(NVIC 分组设置过晚):分组设置前移到 init() 开头,SPI/CAN 优先级正确编码,闭环
- 中危 M3(readBlock/writeBlock 矛盾):删除未用接口,陷阱消除,闭环