Files
GD32E50X_BOOT/.trae/specs/prune-boot-dead-code/spec.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

10 KiB
Raw Blame History

清理 BOOT 旧版本兼容代码与已废弃代码 Spec

Why

BOOT 工程经过多轮迭代后,源码中沉淀了大量「兼容旧协议」「占位预留」「历史遗留字段」「死代码」与 开发期备份文件。这些内容已经没有调用方,但仍然占用编译产物体积、增加阅读成本,并容易在后续维护中 被误以为是「仍然有效」的实现而引入新 bug。

本变更的目标是逐函数扫描 BOOT 自有源码(不含 RTE/Device 厂商库),安全去除所有可以 确认无调用方的旧版本兼容代码与已废弃代码,做到不漏不错:不漏掉一处死代码,不错删一处仍在使用 的代码。

What Changes

一、历史遗留字段

  • 删除 OTAHandler::ota_stateota_time 字段(OTA.h 第 49 行,注释明确「历史遗留字段,当前实现未实际使用」)。

二、OTA 兼容旧接口

  • 删除 OTAHandler::handleOTAMessage(u32 id, u8 *data, u8 len) 声明与实现 (OTA.h、 OTA.cpp)。 该函数注释为「兼容旧接口:按 CAN ID 处理 OTA 消息」,全工程无调用方,所有链路均直接走 handleLinkMessage()。

三、CAN 兼容旧 ACK 接口

  • 删除 CAN_transmiter::sendDATA_ACK(u32 packet_num, bool if_success) 声明与实现 (Can.h、 Can.cpp)。 注释明确「packet_num 当前实现未使用」,全工程无调用方。
  • 删除 CAN_transmiter::sendDATA_ACK(u32 packet_num, u8 *data) 声明与实现 (Can.h、 Can.cpp)。 注释「兼容旧协议格式:前两字节固定为 0xBA 0xC0」,全工程无调用方。

四、CAN DMA 占位接口

  • 删除 void can_dma_init(void) 声明与实现 (Can.h、 Can.cpp)。 函数体为空,注释「当前实现未启用 DMA,该函数作为保留占位接口」。
  • 同步移除 canfd_config() 中对 can_dma_init() 的调用 (Can.cpp:80)。

五、BootPlatform 预留占位接口

  • 删除 BootPlatform::getResetCause() 与 C 包装 get_reset_cause() (initial.h:52/81、 initial.cpp:76/86)。 函数体仅 return 0,注释「预留:如需区分...可在此补齐」,无调用方。
  • 删除 BootPlatform::initUnusedPins() 与 C 包装 unused_pin_init() (initial.h:53/88、 initial.cpp:93/108)。 函数体仅开 GPIOA/B/C 时钟,注释「预留:如果需要降低悬空功耗...」,无调用方。
  • 删除 BootPlatform::printSystemClockInfo() 与 C 包装 print_system_clock_info() (initial.h:54/97、 initial.cpp:115/124)。 函数体为空,注释「预留:可在此打印...」,无调用方。
  • 删除 BootPlatform::scanAppFlashContent(int, u32) 与 C 包装 scanAppFlashContent() (initial.h:55/133、 initial.cpp:133/146)。 函数体仅 (void)print_content; (void)page_count;,注释「预留:调试用...」,无调用方。

六、SpiOta 保留空壳 ISR

  • 调研 SpiOta::onSpiInterrupt() 的 IRQ 向量绑定情况 (SpiOta.cpp:902, 注释「RX 已改 DMA,保留空壳兼容旧 IRQ 向量」)。
    • 若 SPI0_IRQHandler 未挂载或 NVIC 未使能:删除 onSpiInterrupt() 与对应 IRQ Handler。
    • 若 IRQ 仍启用且仅用于清残留 ERR/RBNE 标志:保留 onSpiInterrupt() 实现,但同步更新 函数注释,去掉「兼容旧 IRQ 向量」字样,明确其当前职责。
    • 该任务为调研驱动,不预先设定删除方向。

七、开发期备份文件

  • 删除 SpiOta.cpp.bak_20260528 (g:\Robot_v2\DCU\GD32E50X_BOOT\GD32E50X_BOOT\device\SpiOta.cpp.bak_20260528)。
  • 删除 SpiOta.cpp.bak_20260529_txdebug (g:\Robot_v2\DCU\GD32E50X_BOOT\GD32E50X_BOOT\device\SpiOta.cpp.bak_20260529_txdebug)。
  • 评估 RTE/_Debug_GD32E508VE/RTE_Components(CBB-003的冲突副本1_2026-05-06 00-26-28).h 的去留:该文件名带「冲突副本」,明显为 IDE 合并冲突产物;若 RTE_Components.h 已存在 正式版本,则删除冲突副本。

八、C 风格包装层审计(仅审计,不强制删除)

  • 全工程审计以下 C 包装是否有调用方,仅删除确认无调用方的:
    • USART0_init、get_reset_cause、unused_pin_init、print_system_clock_info、 enter_deep_sleep、check_sleep、scanAppFlashContent、systick_config、 delay_1ms/us/s、delay_decrement、system_soft_reset、spi_ota_* 全套。
    • 凡是仅在自身 .cpp 内被同类 static 方法走一遍转发的,且全工程无其他调用方的,予以删除。
    • 凡是有调用方(哪怕一处)的,保留不动,并在任务记录中说明保留原因。
  • 注:第七项删除 BootPlatform 相关包装时已顺带删除其对应 C 包装,无需重复处理。

Impact

ADDED Requirements

Requirement: 逐函数扫描确认无调用方

本 spec 涉及的每一处删除目标,SHALL 在执行删除前以 Grep/搜索方式确认其在 g:\Robot_v2\DCU\GD32E50X_BOOT\GD32E50X_BOOT 全工程范围内没有任何调用方。删除时 SHALL 同步 删除其声明(.h)与实现(.cpp),避免悬空声明。

Scenario: 删除前确认无调用方

  • WHEN 执行者准备删除某函数/字段
  • THEN 使用 Grep 在 GD32E50X_BOOT 目录全量搜索该符号
  • AND 仅当搜索结果只包含其自身的「声明 + 实现」时,方可删除
  • AND 若搜索结果中出现任何第三方引用,SHALL 中止删除并在任务记录中说明保留原因

Requirement: 保持现有行为零变化

本 spec 是纯清理重构,SHALL NOT 改变任何保留代码的外部行为、协议、Flash 布局、外设初始化顺序与 中断响应路径。

Scenario: 清理后行为不变

  • WHEN 清理完成并重新编译
  • THEN BOOT 启动流程、OTA 握手、SPI/CAN 收发、Flash 写入、睡眠/唤醒、应用跳转等所有路径 SHALL 与清理前完全等价
  • AND 编译 SHALL 通过,无新增 warning/error

MODIFIED Requirements

Requirement: 注释一致性

删除「兼容旧」「历史遗留」「预留占位」相关代码后,剩余文件中所有引用这些已删符号的注释、 Doxygen 文档 SHALL 同步更新或删除,避免出现「指向不存在的符号」的注释。

Scenario: 注释同步

  • WHEN 某符号被删除
  • THEN 全工程搜索该符号名
  • AND 所有引用该符号的注释、文档 SHALL 一并删除或改写

REMOVED Requirements

Requirement: 旧版本 CAN ACK 协议兼容

Reason: sendDATA_ACK 两个重载为旧协议(0xBA 0xC0 头 + 4 字节业务数据 / 简化 0x0001 ACK) 保留的兼容接口,全工程无调用方,新协议统一走 send_ack_frame + ota_can_sender。 Migration: 无需迁移,调用方已不存在。

Requirement: 按 CAN ID 分发 OTA 消息

Reason: OTAHandler::handleOTAMessage() 为旧的「按 CAN ID 分发」入口,所有实际链路 (CAN/SPI)已统一改走 handleLinkMessage(),无任何调用方。 Migration: 无需迁移,调用方已不存在。

Requirement: CAN DMA 初始化占位

Reason: can_dma_init() 是空函数占位,CAN 接收路径直接从 FIFO 取数。 Migration: 无需迁移,函数体本就为空。