Files
DCU_APP/GD32E508_DCU_APP/GD32E508_DCU_APP.cproject.yml
cbb d8b3c9767c feat(ota): 电机 OTA 支持 EtherCAT 模式(CoE 邮箱进料 + 通道独占锁)
进料口从「只有 ESP32 SPI 一条」扩成两条,中继引擎不变:主站经 CoE 0x2511 数据窗
把电机固件明文灌进 GD32 的 48KB SRAM 暂存区,再由 comm/ecat_motor_ota 泵进原有
4KB 环缓;AES 握手、CAN 单发停等、重发、0AAC 运行确认全部沿用 MotorOtaRelay。
纯网线(ESP32 WiFi 关断、/motor/ota 打不通)场合因此也能刷电机。
偏移/幂等判据仍只有一份:feedData 拆出 feedAt,两个进料口共用。

同时把审计报告 VULN-12/13/14 落地(此前只存在于文档,一行未实现):start() 第一条
语句在 PRIMASK 内原子置位 s_channel_lock_mask,EtherCAT 桥接 sendBatch/processOutput
与 SPI 0xC0/0xC7 对锁定通道回新码 0xE7=「被电机 OTA 独占」,不冒充「邮箱满」0xE4。
反向互斥一并补上:电机 OTA 活跃时 requestEnterBoot() 直接拒绝——SPI 0xB0、CoE 0x2502、
CAN 0x320 三条交接入口共用这一个判据,避免复位把刷写腰斩在 erase 之后。

完整性口径按链路分开,不互相冒充:块级 CRC32 + 整镜像 CRC32 都在从站核,且核过才
让电机进 BOOT——失败时电机仍跑旧 APP、擦除没开始,不存在「先擦再验」的变砖路径。
CRC 为 CRC-32/B(poly 0x04C11DB7,初值 0xFFFFFFFF,无反射无末尾异或),与 v2_crc32
同算法(用公开向量 123456789=0x0376E6E7 对过)。

块长取 1024 而不是 BOOT 用的 4096:SSC 的分段下载缓冲是全工程唯一的 malloc 用户,
而 APP 的 __HEAP_SIZE 只有 3KB,4096 会被从站当场回 abort 0x05040005 Out of memory
(BOOT 的堆是 16KB 才撑得住 4096——块长能抄,堆抄不了)。这是跨仓常量,须与
tools/ecat 的 MFO_CHUNK_OBJ 同步。

APP 1.7.4(RAM ZI 97156)。已实测:0x2510 参数写与一块 1016B 数据写均被从站接受
(staged=1016、phase bit4);端到端电机刷写待复测(native 块长修复后未跑完整一轮)。
2026-10-11 02:47:19 +08:00

186 lines
6.9 KiB
YAML
Raw Permalink 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.
# A project translates into one executable or library.
project:
groups:
- group: Source Files
files:
- file: ./main.h
- file: ./main.cpp
- group: sys
files:
- file: ./sys/initial.h
- file: ./sys/initial.cpp
- file: ./sys/systick.h
- file: ./sys/systick.cpp
- file: ./sys/task_manager.h
- file: ./sys/task_manager.cpp
- file: ./sys/task_runner.h
- file: ./sys/task_runner.cpp
- file: ./sys/cpu_load.h
- file: ./sys/cpu_load.cpp
- file: ./sys/ota_boot_request.h
- file: ./sys/ota_boot_request.cpp
- file: ./sys/aes128.h
- file: ./sys/aes128.cpp
- file: ./sys/motor_ota_relay.h
- file: ./sys/motor_ota_relay.cpp
- file: ./sys/hardfault.cpp
- file: ./sys/cpp_stubs.cpp
- file: ./sys/config.h
- file: ./sys/esp32_en.h
- file: ./sys/esp32_en.cpp
- group: device
files:
- file: ./device/adc.h
- file: ./device/adc.cpp
- file: ./device/canfd.h
- file: ./device/canfd.cpp
- file: ./device/timer.h
- file: ./device/timer.cpp
- file: ./device/usart0.h
- file: ./device/usart0.cpp
- file: ./device/watchdog.h
- file: ./device/watchdog.cpp
- file: ./device/motor_state.h
- file: ./device/motor_state.cpp
- file: ./device/motor_version.h
- file: ./device/motor_version.cpp
# GigaDevice DFP 未把 EXMC 注册为 CMSIS 组件(仅有 FMC=片内 Flash),
# 但外设源文件存在于 Pack;LAN9252 并行总线需要 EXMC,故本地编入。
- group: device_exmc
files:
- file: ./RTE/Device/GD32E508VE/gd32e50x_exmc.c
- file: ./RTE/Device/GD32E508VE/gd32e50x_exmc.h
- group: device/spi
files:
- file: ./device/spi/app_spi_command.h
- file: ./device/spi/app_spi_command.cpp
- file: ./device/spi/spi_command_handler.h
- file: ./device/spi/app_spi_command_defs.h
- file: ./device/spi/app_spi_cmd_boot_request.cpp
- file: ./device/spi/app_spi_cmd_ota_wait.cpp
- file: ./device/spi/app_spi_cmd_ping.cpp
- file: ./device/spi/app_spi_cmd_init_status.cpp
- file: ./device/spi/app_spi_cmd_can_bridge.cpp
- file: ./device/spi/app_spi_cmd_can_burst.cpp
- file: ./device/spi/app_spi_cmd_can_feedback.cpp
- file: ./device/spi/app_spi_cmd_id_snapshot.cpp
- file: ./device/spi/app_spi_cmd_adc_feedback.cpp
- file: ./device/spi/app_spi_cmd_motor_state.cpp
- file: ./device/spi/app_spi_cmd_motor_version.cpp
- file: ./device/spi/app_spi_cmd_motor_ota.cpp
- file: ./device/spi/app_spi_cmd_exmc_diag.cpp
- file: ./device/spi/app_spi_diag.h
- file: ./device/spi/app_spi_cmd_spi_diag.cpp
- group: spi_link
files:
- file: ../../spi_link/spi_link_v2.cpp
- group: comm
files:
- file: ./comm/esc_exmc_bus.h
- file: ./comm/esc_exmc_bus.cpp
- file: ./comm/esc_lan9252.h
- file: ./comm/esc_lan9252.cpp
- file: ./comm/ethercat_slave.h
- file: ./comm/ethercat_slave.cpp
- file: ./comm/ethercat_sync.h
- file: ./comm/ethercat_sync.cpp
- file: ./comm/ethercat_can_bridge.h
- file: ./comm/ethercat_can_bridge.cpp
# 电机 OTA 的 EtherCAT 邮箱进料通路(CoE 0x2510/0x2511 → MotorOtaRelay 环缓)
- file: ./comm/ecat_motor_ota.h
- file: ./comm/ecat_motor_ota.cpp
- file: ./comm/ethercat_pdo.h
- file: ./comm/ethercat_pdo.cpp
# [DIFF-STATS] 临时仪表:差分写取证,删除时连同本两行与 comm/ethercat_diff_stats.* 一并移除
- file: ./comm/ethercat_diff_stats.h
- file: ./comm/ethercat_diff_stats.cpp
- group: comm/ssc
files:
- file: ./comm/ssc/inc/ecatslv.h
- file: ./comm/ssc/inc/ecatappl.h
- file: ./comm/ssc/inc/mailbox.h
- file: ./comm/ssc/inc/ecatcoe.h
- file: ./comm/ssc/inc/sdoserv.h
- file: ./comm/ssc/inc/objdef.h
- file: ./comm/ssc/inc/coeappl.h
- file: ./comm/ssc/inc/esc.h
- file: ./comm/ssc/inc/applInterface.h
- file: ./comm/ssc/inc/el9800hw.h
- file: ./comm/ssc/src/ecatslv.c
- file: ./comm/ssc/src/ecatappl.c
- file: ./comm/ssc/src/mailbox.c
- file: ./comm/ssc/src/ecatcoe.c
- file: ./comm/ssc/src/sdoserv.c
- file: ./comm/ssc/src/objdef.c
- file: ./comm/ssc/src/coeappl.c
- file: ./comm/ssc/port/hw_gd32exmc.cpp
- file: ./comm/ssc/port/dc_app.c
- file: ./comm/ssc/port/dc_app.h
- file: ./comm/ssc/port/ecat_def.h
# List components to use for your application.
# A software component is a re-usable unit that may be configurable.
components:
- component: ARM::CMSIS:CORE
- component: Device:Startup
- component: Device:GD32E50x_StdPeripherals:ADC
- component: Device:GD32E50x_StdPeripherals:CAN
- component: Device:GD32E50x_StdPeripherals:CRC
- component: Device:GD32E50x_StdPeripherals:DBG
- component: Device:GD32E50x_StdPeripherals:DMA
- component: Device:GD32E50x_StdPeripherals:EXTI
- component: Device:GD32E50x_StdPeripherals:FMC
- component: Device:GD32E50x_StdPeripherals:GPIO
- component: Device:GD32E50x_StdPeripherals:MISC
- component: Device:GD32E50x_StdPeripherals:PMU
- component: Device:GD32E50x_StdPeripherals:RCU
- component: Device:GD32E50x_StdPeripherals:SPI_I2S
- component: Device:GD32E50x_StdPeripherals:TIMER
- component: Device:GD32E50x_StdPeripherals:USART
- component: Device:GD32E50x_libopt
- component: Device:GD32E50x_StdPeripherals:FWDGT
# List executable file formats to be generated.
output:
type:
- elf
- hex
- map
misc:
- for-compiler: AC6
C-CPP:
- -DGD32E508
- -DGD32E50X
- -DHXTAL_VALUE=8000000U
- -gdwarf-5
- -D__MICROLIB
- -fshort-enums
- -fshort-wchar
# EXMC 未作为 CMSIS 组件分发;头文件在 RTE 本地目录
- -IRTE/Device/GD32E508VE
- -Wno-register
- -IG:/Robot_v2/DCU/spi_link
C:
- -std=gnu11
CPP:
- -std=gnu++17
# 全工程零使用 RTTI/异常(grep 验证),关闭以剥离 libcppabi 运行时(约 2.5 KB Flash)
- -fno-rtti
- -fno-exceptions
ASM:
- -DGD32E508
- -DGD32E50X
- -DHXTAL_VALUE=8000000U
- -gdwarf-5
- -D__MICROLIB
# 启动文件经 legacy armasm 汇编:消 armclang 驱动"参数未使用"告警 + armasm 弃用告警(A1950W)
- -Wno-unused-command-line-argument
- -Wa,armasm,--diag_suppress=A1950W
Link:
- --library_type=microlib
- --entry=Reset_Handler
# 输出未引用段与总量报告,用于 Flash 尺寸归因
- --info=unused,totals