移除了CAN模块中未启用的DMA初始化相关代码,包括can_dma_init函数 和相关的调用。同时移除了SPI OTA模块中已废弃的中断处理函数和C风格 兼容包装函数,这些功能已被DMA方式替代。 BREAKING CHANGE: 移除了can_dma_init函数和spi_ota_irq_handler等C风格API。
9.1 KiB
Tasks
执行顺序按下列分组推进。每组内任务可并行;跨组存在依赖时单独标注。 所有任务执行前必须先 Grep 全工程确认无调用方(见 spec.md 中 Requirement: 逐函数扫描确认无调用方)。
Group A — 历史遗留字段与 OTA 兼容旧接口
-
Task A1: 删除
OTAHandler::ota_stateota_time历史遗留字段- SubTask A1.1: Grep
ota_stateota_time全工程,确认仅 OTA.h 第 49 行声明,无任何读写引用 - SubTask A1.2: 删除 OTA.h:49 中
u32 ota_stateota_time;字段及其 Doxygen 注释 - SubTask A1.3: 全工程再 Grep
ota_stateota_time,确认 0 命中
- SubTask A1.1: Grep
-
Task A2: 删除
OTAHandler::handleOTAMessage()兼容旧接口- SubTask A2.1: Grep
handleOTAMessage全工程,确认仅在 OTA.h 声明、OTA.cpp 实现,无任何调用方 - SubTask A2.2: 删除 OTA.h 中
handleOTAMessage声明及其 Doxygen 注释 - SubTask A2.3: 删除 OTA.cpp 中
handleOTAMessage实现及其注释 - SubTask A2.4: 全工程再 Grep
handleOTAMessage,确认 0 命中
- SubTask A2.1: Grep
Group B — CAN 兼容旧 ACK 接口与 DMA 占位
-
Task B1: 删除
CAN_transmiter::sendDATA_ACK(u32, bool)简化 ACK 接口- SubTask B1.1: Grep
sendDATA_ACK全工程,确认仅在 Can.h 声明、Can.cpp 实现,无任何调用方 - SubTask B1.2: 删除 Can.h 中
sendDATA_ACK(u32 packet_num, bool if_success)声明及其 Doxygen 注释 - SubTask B1.3: 删除 Can.cpp 中
sendDATA_ACK(u32, bool)实现及其注释
- SubTask B1.1: Grep
-
Task B2: 删除
CAN_transmiter::sendDATA_ACK(u32, u8*)兼容旧协议 ACK 接口- SubTask B2.1: 删除 Can.h 中
sendDATA_ACK(u32 packet_num, u8 *data)声明及其 Doxygen 注释 - SubTask B2.2: 删除 Can.cpp 中
sendDATA_ACK(u32, u8*)实现及其注释 - SubTask B2.3: 全工程再 Grep
sendDATA_ACK,确认 0 命中
- SubTask B2.1: 删除 Can.h 中
-
Task B3: 删除
can_dma_init()占位函数- SubTask B3.1: Grep
can_dma_init全工程,确认仅在 Can.h 声明、Can.cpp 实现及canfd_config()内被调用 - SubTask B3.2: 删除 Can.h 中
can_dma_init声明及其 Doxygen 注释 - SubTask B3.3: 删除 Can.cpp 中
can_dma_init实现及其注释 - SubTask B3.4: 删除 Can.cpp 中
canfd_config()内对can_dma_init()的调用 - SubTask B3.5: 全工程再 Grep
can_dma_init,确认 0 命中
- SubTask B3.1: Grep
Group C — BootPlatform 预留占位接口
-
Task C1: 删除
BootPlatform::getResetCause()与 C 包装get_reset_cause()- SubTask C1.1: Grep
getResetCause与get_reset_cause全工程,确认无任何调用方 - SubTask C1.2-C1.5: 删除 initial.h 声明、C 包装声明;删除 initial.cpp 实现、C 包装实现
- SubTask C1.1: Grep
-
Task C2: 删除
BootPlatform::initUnusedPins()与 C 包装unused_pin_init()- SubTask C2.1-C2.5: 删除 initial.h/initial.cpp 中相关声明与实现
-
Task C3: 删除
BootPlatform::printSystemClockInfo()与 C 包装print_system_clock_info()- SubTask C3.1-C3.5: 删除 initial.h/initial.cpp 中相关声明与实现
-
Task C4: 删除
BootPlatform::scanAppFlashContent()与 C 包装scanAppFlashContent()- SubTask C4.1-C4.6: 删除 initial.h/initial.cpp 中相关声明与实现;删除已空的
class BootPlatform整体
- SubTask C4.1-C4.6: 删除 initial.h/initial.cpp 中相关声明与实现;删除已空的
Group D — SpiOta 保留空壳 ISR(调研驱动)
- Task D1: 调研并决策
SpiOta::onSpiInterrupt()去留- SubTask D1.1: SpiOta.cpp 中
extern "C" void SPI0_IRQHandler(void)挂载于第 1026 行,调用SpiOta::onSpiInterrupt() - SubTask D1.2:
configureSpi0()显式禁用 SPI0 的 RBNE/ERR/TBE 中断,且未调用nvic_irq_enable(SPI0_IRQn, ...)→ NVIC 未使能 SPI0 IRQ → ISR 永不触发 - SubTask D1.3: 决策为删除:删除
onSpiInterrupt()实现/声明、spi_ota_irq_handlerC 包装、extern "C" SPI0_IRQHandler - SubTask D1.4: 决策依据已记录(启动文件 [WEAK] 引用会自动落到默认空实现,不会有编译错误)
- SubTask D1.1: SpiOta.cpp 中
Group E — 开发期备份文件与冲突副本
-
Task E1: 删除 SpiOta 备份文件
- SubTask E1.1: 删除
SpiOta.cpp.bak_20260528 - SubTask E1.2: 删除
SpiOta.cpp.bak_20260529_txdebug
- SubTask E1.1: 删除
-
Task E2: 处理 RTE 冲突副本文件
- SubTask E2.1: 列出
RTE\_Debug_GD32E508VE\目录所有RTE_Components*.h文件(共两份:正式版 + 冲突副本) - SubTask E2.2: 决策为删除冲突副本:冲突副本文件名带「冲突副本」字样,明显为 IDE 合并冲突产物;csolution 只引用
RTE_Components.h,副本不会被编译器引用;两份内容差异(CTC/SPI vs FWDGT)反映配置演进,正式版代表当前生效配置。删除RTE_Components(CBB-003的冲突副本1_2026-05-06 00-26-28).h
- SubTask E2.1: 列出
Group F — C 风格包装层审计(仅审计,不强制删除)
-
Task F1: 审计 systick.h C 包装是否有调用方
- SubTask F1.1: Grep
systick_config、delay_1ms、delay_1us、delay_1s、delay_decrement、system_soft_reset全工程 - SubTask F1.2: 删除无调用方的 C 包装:
systick_config、delay_1s、delay_decrement - SubTask F1.3: 保留有调用方的 C 包装:
delay_1ms(main.cpp/OTA.cpp/initial.cpp 调用)、delay_1us(OTA.cpp 调用)、system_soft_reset(initial.cpp 调用)
- SubTask F1.1: Grep
-
Task F2: 审计 initial.h 中除 Group C 外剩余 C 包装是否有调用方
- SubTask F2.1: Grep
USART0_init、enter_deep_sleep、check_sleep、EXTI5_9_IRQHandler、EXTI10_15_IRQHandler全工程 - SubTask F2.2: 删除无调用方的 C 包装:
USART0_init、enter_deep_sleep、check_sleep - SubTask F2.3: 保留有调用方的 C 包装:
EXTI5_9_IRQHandler、EXTI10_15_IRQHandler(extern "C" IRQ Handler,启动文件 [WEAK] 引用)
- SubTask F2.1: Grep
-
Task F3: 审计 SpiOta.h C 包装是否有调用方
- SubTask F3.1: Grep 全部 11 个
spi_ota_*C 包装(含spi_ota_cs_exti_handler)全工程 - SubTask F3.2: 删除无调用方的 C 包装:
spi_ota_init、spi_ota_poll、spi_ota_service_pending_tx、spi_ota_set_sender、spi_ota_on_cs_assert、spi_ota_on_cs_release、spi_ota_gpio_init、spi_ota_spi0_init、spi_ota_exti_init、spi_ota_irq_handler、spi_ota_has_tx_frame、spi_ota_cs_exti_handler(initial.cpp 中的引用仅为注释,实际调用走SpiOta::onCsExtiInterrupt()C++ 静态方法) - SubTask F3.3: 删除空的
#ifdef __cplusplus extern "C" { ... } #endif块;同步更新 initial.cpp 中提到spi_ota_cs_exti_handler的注释
- SubTask F3.1: Grep 全部 11 个
-
Task F4: 审计 Can.h C 包装是否有调用方
- SubTask F4.1: Grep
can_gpio_init、canfd_config、CAN0_RX0_IRQHandler、CAN0_TX_IRQHandler全工程 - SubTask F4.2:
can_gpio_init/canfd_config仅在 Can.cpp 内被同类方法调用,但删除会破坏调用点(需内联修改),违反"严格只做删除"约束 → 保留 - SubTask F4.3:
CAN0_RX0_IRQHandler/CAN0_TX_IRQHandler为 extern "C" IRQ Handler,启动文件 [WEAK] 引用 → 保留
- SubTask F4.1: Grep
Group G — 注释同步与最终验证
-
Task G1: 注释一致性扫描
- SubTask G1.1: 全工程 Grep 19 个已删符号名
- SubTask G1.2: 所有 19 个符号命中数为 0(
SPI0_IRQHandler仅在启动文件 [WEAK] 处出现,属预期)
-
Task G2: 编译验证
- SubTask G2.1: 检查编译工具链可用性:
cbuild/csolution/cbuildgen均不在 PATH;CMSIS_COMPILER_ROOT/CMSIS_PACK_ROOT未设置;ARM 编译器(armcc/armclang/arm-none-eabi-gcc)均未找到 - SubTask G2.2: 编译验证未执行——当前环境编译工具链不可用,需用户在装有 CMSIS-Toolbox 的本地 IDE 中手动编译验证。验证清单已提供给用户
- SubTask G2.3: 注释一致性扫描通过,无遗漏引用
- SubTask G2.1: 检查编译工具链可用性:
Task Dependencies
- Group A、B、C、E 之间无依赖,可并行执行。✅ 已全部完成
- Task D 依赖对 SpiOta.cpp 中 NVIC 配置的调研。✅ 已完成(决策为删除)
- Group F(C 包装审计)依赖 Group A/B/C 完成后才能得到「剩余待审计」的精确清单。✅ 已完成
- Task G1 依赖所有删除任务完成。✅ 已完成
- Task G2 依赖 G1 完成。⚠️ 注释扫描已完成;编译验证因工具链不可用未执行,需用户本地验证
用户应在本地 IDE 执行的编译验证清单
- 确认
cbuild.exe/csolution.exe在 PATH,或CMSIS_COMPILER_ROOT/CMSIS_PACK_ROOT已设置 - (可选)清理上次构建产物:
out/、*.cbuild-idx.yml、*.cbuild-pack.yml、*.cgen.yml - 执行编译:
或
cd g:\Robot_v2\DCU\GD32E50X_BOOT cbuild GD32E50X_BOOT.csolution.ymlcsolution convert -s GD32E50X_BOOT.csolution.yml cbuild GD32E50X_BOOT+GD32E508VE.Debug.cgen.yml - 验证通过标准:编译 0 error;无新增 warning;链接成功生成
out\GD32E50X_BOOT+GD32E508VE\Debug\GD32E50X_BOOT.axf(或.elf)及.hex/.bin - 若出现
undefined reference to XXX:对照 G1 表核实是否仍有调用点(已确认全工程 0 命中,理论上不会出现)