- 将设备相关文件重新组织为device/spi和comm分组 - 添加EtherCAT从站通信模块(esc_exmc_bus、esc_lan9252、ethercat_slave等) - 添加EXMC外设组件支持 - 统一文件命名规范为小写 refactor(canfd): 优化CANFD模块中断安全性和配置方式 - 替换自定义临界区函数为RT_CRITICAL_SAVE/RESTORE宏 - 使用配置常量CONFIG_IRQ_PREEMPT_CAN替代硬编码值 - 简化邮箱满时的处理逻辑,移除不必要的SysTick等待 - 移除废弃的中断保存头文件引用 refactor(timer): 更新定时器配置以使用配置常量 - 修复头文件包含路径大小写问题 - 使用CONFIG_NVIC_PRIORITY_GROUP配置项替代硬编码值
6.1 KiB
6.1 KiB
Verification Checklist
使能开关(未焊接保护)
sys/config.h中CONFIG_ETHERCAT_ENABLE默认为 0CONFIG_ETHERCAT_ENABLE=0时comm/全部代码不参与编译(用#if包裹)CONFIG_ETHERCAT_ENABLE=0时sys/initial.cpp不调用EthercatSlave::init()/EthercatSync::init()CONFIG_ETHERCAT_ENABLE=0时sys/task_runner.cpp的TASK_ETHERCAT_PROCESS分支空操作CONFIG_ETHERCAT_ENABLE=0时 EXMC / EXTI0 / EXTI1 / EXTI2 不被配置CONFIG_ETHERCAT_ENABLE=0时编译产物与改造前功能等价(ADC/CAN/SPI 正常)- 阶段 1 实时架构改造(NVIC/BASEPRI/ISR 瘦身)不受
CONFIG_ETHERCAT_ENABLE影响,始终生效 TASK_SPI_CMD_PROCESS与taskSpiCmdProcess()不受CONFIG_ETHERCAT_ENABLE限制(阶段1 改造已需要)
阶段 1:实时架构改造
sys/critical.h已创建,RT_CRITICAL_ENTER/EXIT/SAVE/RESTORE宏基于 BASEPRI 实现sys/config.h中CONFIG_NVIC_PRIORITY_GROUP设为NVIC_PRIGROUP_PRE4_SUB0sys/config.h中各中断优先级宏已按分层表配置(EtherCAT=0/调度器=1/CAN=2/SPI+EXTI+USART=3)sys/config.h中CONFIG_MAIN_LOOP_WFI_ENABLE默认为 0device/Timer.cpp中nvic_priority_group_set使用CONFIG_NVIC_PRIORITY_GROUPdevice/Timer.cpp中调度器 NVIC 优先级为 (1, 0)sys/task_manager.cpp中set()和takePending()使用 BASEPRI 临界区sys/task_manager.cpp中无残留__disable_irq/__set_PRIMASKdevice/CANFD.cpp中hasRxFrame()和consumeRxFrame()使用 BASEPRI 临界区device/CANFD.cpp中 CAN RX0 NVIC 优先级为 (2, n)device/CANFD.cpp中handleRxInterrupt()仅做入队+置位(验证未退化)device/app_spi_command.cpp中 SPI0 NVIC 优先级为 (3, 0)device/app_spi_command.cpp中 EXTI10_15 NVIC 优先级为 (3, 1)device/app_spi_command.cpp中poll()使用 BASEPRI 临界区device/app_spi_command.cpp中onCsRelease()不在 ISR 内调用processCommand()(移主循环)device/usart0.cpp中 USART0 NVIC 优先级为 (3, 0)device/usart0.cpp中putCharNonBlocking()使用 BASEPRI 临界区main.h中system_task_t增加TASK_ETHERCAT_PROCESSmain.h中system_task_t增加TASK_SPI_CMD_PROCESSdevice/app_spi_command.h中增加processPendingCommand()公有方法声明device/app_spi_command.cpp中onCsRelease()不再调用processCommand(),改置位m_cmdPending+TASK_SPI_CMD_PROCESSdevice/app_spi_command.cpp中processPendingCommand()清除m_cmdPending后调用processCommand()main.cpp中 WFI 代码块由CONFIG_MAIN_LOOP_WFI_ENABLE开关控制main.cpp中 WFI 关闭时使用__NOP()忙等- 全项目搜索确认无遗漏的
__disable_irq/__set_PRIMASK(除sys/critical.h实现内)
阶段 2:LAN9252 ESC 驱动骨架
comm/esc_exmc_bus.h已创建,声明EscExmcBus类接口comm/esc_exmc_bus.cpp已创建,EXMC NOR/SRAM 16-bit 初始化实现comm/esc_exmc_bus.cpp中 GPIO 配置使用config.h引脚宏(基于标准映射 PD0/PD1/PD4/PD5/PD7/PD8-PD11/PD14/PD15,PE7-PE15)comm/esc_exmc_bus.cpp中read16/write16通过内存映射地址(0x60000000)访问comm/esc_lan9252.h已创建,声明EscLan9252类接口comm/esc_lan9252.cpp已创建,实现init()/selfTest()/readReg/writeReg/readPdi/writePdicomm/esc_lan9252.cpp中selfTest()读取 ESC ID 寄存器并校验comm/ethercat_slave.h已创建,声明EthercatSlave类与 PDO 双缓冲结构comm/ethercat_slave.cpp已创建,实现周期处理与双缓冲comm/ethercat_slave.cpp中periodicIsr()标记__attribute__((section(".ramfunc")))comm/ethercat_slave.cpp中periodicIsr()执行:读输入→写输出→翻转指针→置位任务comm/ethercat_slave.cpp中getLatestInputs()无锁原子读取comm/ethercat_sync.h/comm/ethercat_sync.cpp已创建comm/ethercat_sync.cpp中 SYNC0 EXTI(PB0/EXTI0)配置完成,下降沿触发comm/ethercat_sync.cpp中 IRQ EXTI(PB1/EXTI1)配置完成,下降沿触发comm/ethercat_sync.cpp中 SYNC1 EXTI(PB2/EXTI2)配置完成,下降沿触发comm/ethercat_sync.cpp中 EXTI0_IRQn NVIC 优先级 (0, 0)(SYNC0 独占 preempt=0)comm/ethercat_sync.cpp中 EXTI1_IRQn NVIC 优先级 (1, 0)(IRQ preempt=1,可被 SYNC0 抢占)comm/ethercat_sync.cpp中 EXTI2_IRQn NVIC 优先级 (1, 0)(SYNC1 preempt=1,备用)comm/ethercat_sync.cpp中onSync0Exti()清 EXTI0 标志 → 调用EthercatSlave::periodicIsr()comm/ethercat_sync.cpp中onEscIrqExti()清 EXTI1 标志 → 置位TASK_ETHERCAT_PROCESS(极简)comm/ethercat_sync.cpp中onSync1Exti()清 EXTI2 标志(备用)comm/ethercat_sync.cpp中提供EXTI0_IRQHandler/EXTI1_IRQHandler/EXTI2_IRQHandlerC 包装- GPIO PB0/PB1/PB2 时钟使能与输入模式配置完成
- PA0 未被占用,保留给未来 STANDBY 模式唤醒(WKUP_PIN0)
- 降级模式
CONFIG_ETHERCAT_SYNC_MODE==1时 TIMER0 配置可用
阶段 3:系统集成
sys/initial.cpp中AppInitializer::init()增加EthercatSlave::init()调用sys/initial.cpp中增加EthercatSync::init()调用sys/task_runner.cpp中增加taskEthercatProcess()方法sys/task_runner.cpp中增加taskSpiCmdProcess()方法sys/task_runner.cpp中runPending()增加TASK_ETHERCAT_PROCESS分支sys/task_runner.cpp中runPending()增加TASK_SPI_CMD_PROCESS分支sys/config.h中 NVIC 分组、优先级、EXMC 引脚、ESC 中断引脚、SYNC 模式等配置宏已定义- 构建配置
GD32E508_DCU_APP.cproject.yml包含comm/目录
编译验证
- 全量编译通过,无 error
- 无新增 warning
- 无遗漏的
__disable_irq/__set_PRIMASK(全项目搜索确认) - 新增文件均在
comm/目录下,不污染现有device//sys/结构