移除了CAN模块中未启用的DMA初始化相关代码,包括can_dma_init函数 和相关的调用。同时移除了SPI OTA模块中已废弃的中断处理函数和C风格 兼容包装函数,这些功能已被DMA方式替代。 BREAKING CHANGE: 移除了can_dma_init函数和spi_ota_irq_handler等C风格API。
10 KiB
清理 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
- 受影响代码:
- GD32E50X_BOOT/sys/OTA.h、 GD32E50X_BOOT/sys/OTA.cpp
- GD32E50X_BOOT/device/Can.h、 GD32E50X_BOOT/device/Can.cpp
- GD32E50X_BOOT/device/SpiOta.h、 GD32E50X_BOOT/device/SpiOta.cpp
- GD32E50X_BOOT/sys/initial.h、 GD32E50X_BOOT/sys/initial.cpp
- GD32E50X_BOOT/sys/systick.h、 GD32E50X_BOOT/sys/systick.cpp
- 删除备份文件:
SpiOta.cpp.bak_*、RTE_Components(...冲突副本...).h
- 不受影响:
RTE/Device/*厂商库文件(不在本 spec 范围内);OTA 业务逻辑、握手协议、 Flash 写入策略、SPI/CAN 收发主流程、睡眠唤醒流程。 - 风险评估:所有删除目标均经 Grep 全工程确认无调用方;C 包装层审计任务保留「有调用方即保留」 的兜底规则;SPI0 ISR 任务为调研驱动,不预设删除。
- 回归影响:编译产物体积略减;行为零变化。
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: 无需迁移,函数体本就为空。