Files
GD32E50X_BOOT/.trae/specs/prune-boot-dead-code/tasks.md
T
cbb 3377a2e58a refactor(device): 移除未使用的CAN DMA初始化函数和SPI中断处理
移除了CAN模块中未启用的DMA初始化相关代码,包括can_dma_init函数
和相关的调用。同时移除了SPI OTA模块中已废弃的中断处理函数和C风格
兼容包装函数,这些功能已被DMA方式替代。
BREAKING CHANGE: 移除了can_dma_init函数和spi_ota_irq_handler等C风格API。
2026-07-15 01:56:38 +08:00

9.1 KiB
Raw Blame History

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 命中
  • 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 命中

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) 实现及其注释
  • 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 命中
  • 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 命中

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 包装实现
  • 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 整体

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_handler C 包装、extern "C" SPI0_IRQHandler
    • SubTask D1.4: 决策依据已记录(启动文件 [WEAK] 引用会自动落到默认空实现,不会有编译错误)

Group E — 开发期备份文件与冲突副本

  • Task E1: 删除 SpiOta 备份文件

    • SubTask E1.1: 删除 SpiOta.cpp.bak_20260528
    • SubTask E1.2: 删除 SpiOta.cpp.bak_20260529_txdebug
  • 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

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 调用)
  • 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] 引用)
  • 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 的注释
  • 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] 引用 → 保留

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: 注释一致性扫描通过,无遗漏引用

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 执行的编译验证清单

  1. 确认 cbuild.exe / csolution.exe 在 PATH,或 CMSIS_COMPILER_ROOT / CMSIS_PACK_ROOT 已设置
  2. (可选)清理上次构建产物:out/、*.cbuild-idx.yml、*.cbuild-pack.yml、*.cgen.yml
  3. 执行编译:
    cd g:\Robot_v2\DCU\GD32E50X_BOOT
    cbuild GD32E50X_BOOT.csolution.yml
    
    或
    csolution convert -s GD32E50X_BOOT.csolution.yml
    cbuild GD32E50X_BOOT+GD32E508VE.Debug.cgen.yml
    
  4. 验证通过标准:编译 0 error;无新增 warning;链接成功生成 out\GD32E50X_BOOT+GD32E508VE\Debug\GD32E50X_BOOT.axf(或 .elf)及 .hex/.bin
  5. 若出现 undefined reference to XXX:对照 G1 表核实是否仍有调用点(已确认全工程 0 命中,理论上不会出现)