Files
DCU_APP/.trae/specs/fix-ecat-postaudit-risks/checklist.md
T
cbb b171767023 feat(ethercat): 添加EtherCAT从站功能支持并优化同步机制
- 添加CAN反馈和ID快照SPI命令文件
- 移除EXMC组件依赖,精简项目配置
- 添加RAM函数段链接脚本,优化Flash等待周期抖动
- 实现EscExmcBus类,提供16位并行总线访问LAN9252
- 实现EscLan9252驱动,支持寄存器和PDI内存访问
- 实现EthercatSlave类,采用三缓冲机制进行PDO数据交换
- 实现EthercatSync同步管理,支持SYNC0/SYNC1中断和定时器模式
- 添加ISR执行时间统计和诊断功能
- 分离周期路径和事件路径通知机制,避免RMW竞态
2026-06-29 01:51:02 +08:00

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 矛盾):删除未用接口,陷阱消除,闭环