- 添加CAN反馈和ID快照SPI命令文件 - 移除EXMC组件依赖,精简项目配置 - 添加RAM函数段链接脚本,优化Flash等待周期抖动 - 实现EscExmcBus类,提供16位并行总线访问LAN9252 - 实现EscLan9252驱动,支持寄存器和PDI内存访问 - 实现EthercatSlave类,采用三缓冲机制进行PDO数据交换 - 实现EthercatSync同步管理,支持SYNC0/SYNC1中断和定时器模式 - 添加ISR执行时间统计和诊断功能 - 分离周期路径和事件路径通知机制,避免RMW竞态
6.5 KiB
6.5 KiB
Verification Checklist
阶段 S1:输入/输出 PDO 的 PDI 偏移分离(严重 S1)
sys/config.h中新增CONFIG_ESC_PDI_INPUT_OFFSET与CONFIG_ESC_PDI_OUTPUT_OFFSET两个常量,且数值不同comm/ethercat_slave.cpp::periodicIsr()中readPdi()调用使用CONFIG_ESC_PDI_INPUT_OFFSETcomm/ethercat_slave.cpp::periodicIsr()中writePdi()调用使用CONFIG_ESC_PDI_OUTPUT_OFFSETperiodicIsr()中readPdi与writePdi的 offset 参数不再共用0x0000Ucomm/esc_lan9252.h中 PDI 接口注释说明 offset 语义为"SyncManager 内存区相对偏移,输入/输出必须分离"
阶段 S2:process() 框架级 PDO 桥接(严重 S2)
comm/ethercat_slave.h中EthercatSlave类含s_appInputs与s_appOutputs私有静态成员声明comm/ethercat_slave.h中EthercatSlave类 public 区含getApplicationInputs()与setApplicationOutputs(const PdoBuffer*)声明comm/ethercat_slave.cpp中s_appInputs/s_appOutputs已定义并初始化process()实现内调用getLatestInputs()拷贝到s_appInputsprocess()实现内调用setOutputs(&s_appOutputs)推入输出三缓冲getApplicationInputs()返回&s_appInputs(只读指针)setApplicationOutputs()含非空检查并将入参拷贝到s_appOutputsprocess()注释保留 TODO 说明应用对象字典映射待后续 spec
阶段 S3:ESC 就绪状态含 AL 状态守卫(严重 S3,仅守卫)
comm/ethercat_slave.h含s_alState私有静态成员声明与getAlState()公共接口声明comm/ethercat_slave.h含 AL 状态码常量定义(至少含AL_STATE_SAFEOP=0x04)comm/ethercat_slave.cpp中s_alState已定义并初始化EthercatSlave::init()在芯片 ID 匹配后读取 AL 状态寄存器(0x0130)保存到s_alStateisEscReady()返回值包含 AL 状态判断(s_alState >= AL_STATE_SAFEOP)isEscReady()在芯片 ID 不匹配时短路返回 false(不读 AL 状态)EthercatSlave::init()诊断打印区分三种情况:ID 不匹配、ID 匹配但 AL < SAFEOP、ID 匹配且 AL ≥ SAFEOPgetAlState()返回s_alStatecomm/esc_lan9252.cpp::EscLan9252::init()含完整 TODO 注释块,列出 SyncManager/FMMU/AL Control/SYNC0 配置步骤,并说明需 SSC 集成
阶段 M4:TIMER0 降级模式保留 ESC 事件中断(中危 M4)
comm/ethercat_sync.cpp的#else(TIMER0 降级)分支含EXTI1_IRQHandler定义comm/ethercat_sync.cpp的#else分支含EXTI2_IRQHandler定义EthercatSync::init()的#else分支含 EXTI1 的gpio_exti_source_select/exti_init/exti_interrupt_enable/exti_interrupt_flag_clear/nvic_irq_enable配置EthercatSync::init()的#else分支含 EXTI2 的对应配置#else分支不含EXTI0_IRQHandler定义(被TIMER0_IRQHandler替代)onEscIrqExti与onSync1Exti实现未改动
阶段 M5:输出三缓冲写入索引提供 2 周期宽限(中危 M5)
comm/ethercat_slave.cpp::setOutputs()中write_idx表达式为(s_outputReadIdx + 2U) % 3UsetOutputs()内注释无"无需临界区"表述setOutputs()内注释含"2 周期宽限"与"前提是主循环处理时间 < 2 × 周期时间"说明comm/ethercat_slave.h中s_outputs成员注释说明写入索引为(readIdx+2)%3与 2 周期宽限语义periodicIsr()中s_outputReadIdx递增逻辑未改动(仍为(readIdx + 1) % 3)
阶段 M6:safe* 接口重命名为 initOnly*(中危 M6)
comm/esc_lan9252.h中无safeReadReg/safeWriteReg/safeReadPdi/safeWritePdi声明comm/esc_lan9252.h中含initOnlyReadReg/initOnlyWriteReg/initOnlyReadPdi/initOnlyWritePdi声明comm/esc_lan9252.cpp中无safe*函数定义comm/esc_lan9252.cpp中含initOnly*函数定义comm/esc_lan9252.h中initOnly*接口注释含"INIT-ONLY"字样,无"safe"字样comm/ethercat_slave.cpp::EthercatSlave::init()中 AL 状态读取调用initOnlyReadReg(非safeReadReg)comm/esc_lan9252.cpp::readChipId()中调用initOnlyReadReg(非safeReadReg)- 全项目 grep
safeReadReg/safeWriteReg/safeReadPdi/safeWritePdi,无任何匹配(含注释)
阶段 M7:s_periodicSeq 加宽为 uint16_t(中危 M7)
comm/ethercat_slave.h中s_periodicSeq类型为volatile uint16_tcomm/ethercat_slave.h中s_processedSeq类型为uint16_tcomm/ethercat_slave.cpp中s_periodicSeq定义类型为volatile uint16_tcomm/ethercat_slave.cpp中s_processedSeq定义类型为uint16_thasPendingPeriodic()实现未改动(仍为s_periodicSeq != s_processedSeq)markPeriodicProcessed()实现未改动(仍为s_processedSeq = s_periodicSeq)
编译验证与一致性检查
- 静态审查:全项目 grep
safeReadReg/safeWriteReg/safeReadPdi/safeWritePdi,确认无残留 - 静态审查:
periodicIsr()中readPdi/writePdi使用不同 offset 常量 - 静态审查:
setOutputs()使用(readIdx+2)%3 - 静态审查:
s_periodicSeq与s_processedSeq均为uint16_t - 静态审查:降级模式下
EXTI1_IRQHandler/EXTI2_IRQHandler已定义 - 静态审查:
process()内调用getLatestInputs()与setOutputs() - 静态审查:
getApplicationInputs()/setApplicationOutputs()已实现 - 静态审查:
isEscReady()含 AL 状态守卫 - 全量编译通过,无 error(⚠️ 待编译环境修复 EXMC pack 阻塞后验证)
- 若可编译:map 文件确认新增静态成员
s_appInputs/s_appOutputs/s_alState已分配(⚠️ 待编译环境修复后验证)
风险闭环确认
- 严重 S1(PDO 偏移重叠):输入/输出 PDO 使用独立 offset,数据不再相互覆盖,闭环
- 严重 S2(process 为空):process() 框架级桥接实现,数据通路在框架层闭合,闭环
- 严重 S3(ESC 寄存器初始化缺失):isEscReady() 增加 AL 状态守卫,SYNC0 不会触发的事实在运行期可观测;完整 ESC 配置留 SSC 集成,本 spec 范围内闭环
- 中危 M4(降级模式丢失 ESC IRQ):EXTI1/EXTI2 handler 在降级模式下保留,ESC 事件路径可用,闭环
- 中危 M5(输出三缓冲竞态):写入索引改为
(readIdx+2)%3,2 周期宽限消除拷贝竞态,闭环 - 中危 M6(safe* 命名误导):重命名为
initOnly*,命名与实现语义一致,闭环 - 中危 M7(序列号回绕):加宽为
uint16_t,6.55s 回绕周期覆盖任何合理主循环阻塞,闭环