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

128 lines
9.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Tasks
> 执行顺序按下列分组推进。每组内任务可并行;跨组存在依赖时单独标注。
> 所有任务执行前必须先 Grep 全工程确认无调用方(见 spec.md 中 Requirement: 逐函数扫描确认无调用方)。
## Group A — 历史遗留字段与 OTA 兼容旧接口
- [x] Task A1: 删除 `OTAHandler::ota_stateota_time` 历史遗留字段
- [x] SubTask A1.1: Grep `ota_stateota_time` 全工程,确认仅 OTA.h 第 49 行声明,无任何读写引用
- [x] SubTask A1.2: 删除 [OTA.h:49](file:///g:/Robot_v2/DCU/GD32E50X_BOOT/GD32E50X_BOOT/sys/OTA.h#L49) 中 `u32 ota_stateota_time;` 字段及其 Doxygen 注释
- [x] SubTask A1.3: 全工程再 Grep `ota_stateota_time`,确认 0 命中
- [x] Task A2: 删除 `OTAHandler::handleOTAMessage()` 兼容旧接口
- [x] SubTask A2.1: Grep `handleOTAMessage` 全工程,确认仅在 OTA.h 声明、OTA.cpp 实现,无任何调用方
- [x] SubTask A2.2: 删除 OTA.h 中 `handleOTAMessage` 声明及其 Doxygen 注释
- [x] SubTask A2.3: 删除 OTA.cpp 中 `handleOTAMessage` 实现及其注释
- [x] SubTask A2.4: 全工程再 Grep `handleOTAMessage`,确认 0 命中
## Group B — CAN 兼容旧 ACK 接口与 DMA 占位
- [x] Task B1: 删除 `CAN_transmiter::sendDATA_ACK(u32, bool)` 简化 ACK 接口
- [x] SubTask B1.1: Grep `sendDATA_ACK` 全工程,确认仅在 Can.h 声明、Can.cpp 实现,无任何调用方
- [x] SubTask B1.2: 删除 Can.h 中 `sendDATA_ACK(u32 packet_num, bool if_success)` 声明及其 Doxygen 注释
- [x] SubTask B1.3: 删除 Can.cpp 中 `sendDATA_ACK(u32, bool)` 实现及其注释
- [x] Task B2: 删除 `CAN_transmiter::sendDATA_ACK(u32, u8*)` 兼容旧协议 ACK 接口
- [x] SubTask B2.1: 删除 Can.h 中 `sendDATA_ACK(u32 packet_num, u8 *data)` 声明及其 Doxygen 注释
- [x] SubTask B2.2: 删除 Can.cpp 中 `sendDATA_ACK(u32, u8*)` 实现及其注释
- [x] SubTask B2.3: 全工程再 Grep `sendDATA_ACK`,确认 0 命中
- [x] Task B3: 删除 `can_dma_init()` 占位函数
- [x] SubTask B3.1: Grep `can_dma_init` 全工程,确认仅在 Can.h 声明、Can.cpp 实现及 `canfd_config()` 内被调用
- [x] SubTask B3.2: 删除 Can.h 中 `can_dma_init` 声明及其 Doxygen 注释
- [x] SubTask B3.3: 删除 Can.cpp 中 `can_dma_init` 实现及其注释
- [x] SubTask B3.4: 删除 Can.cpp 中 `canfd_config()` 内对 `can_dma_init()` 的调用
- [x] SubTask B3.5: 全工程再 Grep `can_dma_init`,确认 0 命中
## Group C — BootPlatform 预留占位接口
- [x] Task C1: 删除 `BootPlatform::getResetCause()` 与 C 包装 `get_reset_cause()`
- [x] SubTask C1.1: Grep `getResetCause` 与 `get_reset_cause` 全工程,确认无任何调用方
- [x] SubTask C1.2-C1.5: 删除 initial.h 声明、C 包装声明;删除 initial.cpp 实现、C 包装实现
- [x] Task C2: 删除 `BootPlatform::initUnusedPins()` 与 C 包装 `unused_pin_init()`
- [x] SubTask C2.1-C2.5: 删除 initial.h/initial.cpp 中相关声明与实现
- [x] Task C3: 删除 `BootPlatform::printSystemClockInfo()` 与 C 包装 `print_system_clock_info()`
- [x] SubTask C3.1-C3.5: 删除 initial.h/initial.cpp 中相关声明与实现
- [x] Task C4: 删除 `BootPlatform::scanAppFlashContent()` 与 C 包装 `scanAppFlashContent()`
- [x] SubTask C4.1-C4.6: 删除 initial.h/initial.cpp 中相关声明与实现;删除已空的 `class BootPlatform` 整体
## Group D — SpiOta 保留空壳 ISR(调研驱动)
- [x] Task D1: 调研并决策 `SpiOta::onSpiInterrupt()` 去留
- [x] SubTask D1.1: SpiOta.cpp 中 `extern "C" void SPI0_IRQHandler(void)` 挂载于第 1026 行,调用 `SpiOta::onSpiInterrupt()`
- [x] SubTask D1.2: `configureSpi0()` 显式禁用 SPI0 的 RBNE/ERR/TBE 中断,且未调用 `nvic_irq_enable(SPI0_IRQn, ...)` → NVIC 未使能 SPI0 IRQ → ISR 永不触发
- [x] SubTask D1.3: 决策为**删除**:删除 `onSpiInterrupt()` 实现/声明、`spi_ota_irq_handler` C 包装、`extern "C" SPI0_IRQHandler`
- [x] SubTask D1.4: 决策依据已记录(启动文件 [WEAK] 引用会自动落到默认空实现,不会有编译错误)
## Group E — 开发期备份文件与冲突副本
- [x] Task E1: 删除 SpiOta 备份文件
- [x] SubTask E1.1: 删除 `SpiOta.cpp.bak_20260528`
- [x] SubTask E1.2: 删除 `SpiOta.cpp.bak_20260529_txdebug`
- [x] Task E2: 处理 RTE 冲突副本文件
- [x] SubTask E2.1: 列出 `RTE\_Debug_GD32E508VE\` 目录所有 `RTE_Components*.h` 文件(共两份:正式版 + 冲突副本)
- [x] 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 风格包装层审计(仅审计,不强制删除)
- [x] Task F1: 审计 systick.h C 包装是否有调用方
- [x] SubTask F1.1: Grep `systick_config`、`delay_1ms`、`delay_1us`、`delay_1s`、`delay_decrement`、`system_soft_reset` 全工程
- [x] SubTask F1.2: 删除无调用方的 C 包装:`systick_config`、`delay_1s`、`delay_decrement`
- [x] SubTask F1.3: 保留有调用方的 C 包装:`delay_1ms`(main.cpp/OTA.cpp/initial.cpp 调用)、`delay_1us`(OTA.cpp 调用)、`system_soft_reset`(initial.cpp 调用)
- [x] Task F2: 审计 initial.h 中除 Group C 外剩余 C 包装是否有调用方
- [x] SubTask F2.1: Grep `USART0_init`、`enter_deep_sleep`、`check_sleep`、`EXTI5_9_IRQHandler`、`EXTI10_15_IRQHandler` 全工程
- [x] SubTask F2.2: 删除无调用方的 C 包装:`USART0_init`、`enter_deep_sleep`、`check_sleep`
- [x] SubTask F2.3: 保留有调用方的 C 包装:`EXTI5_9_IRQHandler`、`EXTI10_15_IRQHandler`(extern "C" IRQ Handler,启动文件 [WEAK] 引用)
- [x] Task F3: 审计 SpiOta.h C 包装是否有调用方
- [x] SubTask F3.1: Grep 全部 11 个 `spi_ota_*` C 包装(含 `spi_ota_cs_exti_handler`)全工程
- [x] 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++ 静态方法)
- [x] SubTask F3.3: 删除空的 `#ifdef __cplusplus extern "C" { ... } #endif` 块;同步更新 initial.cpp 中提到 `spi_ota_cs_exti_handler` 的注释
- [x] Task F4: 审计 Can.h C 包装是否有调用方
- [x] SubTask F4.1: Grep `can_gpio_init`、`canfd_config`、`CAN0_RX0_IRQHandler`、`CAN0_TX_IRQHandler` 全工程
- [x] SubTask F4.2: `can_gpio_init` / `canfd_config` 仅在 Can.cpp 内被同类方法调用,但删除会破坏调用点(需内联修改),违反"严格只做删除"约束 → **保留**
- [x] SubTask F4.3: `CAN0_RX0_IRQHandler` / `CAN0_TX_IRQHandler` 为 extern "C" IRQ Handler,启动文件 [WEAK] 引用 → **保留**
## Group G — 注释同步与最终验证
- [x] Task G1: 注释一致性扫描
- [x] SubTask G1.1: 全工程 Grep 19 个已删符号名
- [x] SubTask G1.2: 所有 19 个符号命中数为 0(`SPI0_IRQHandler` 仅在启动文件 [WEAK] 处出现,属预期)
- [x] Task G2: 编译验证
- [x] 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 中手动编译验证。验证清单已提供给用户
- [x] 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 命中,理论上不会出现)