EMS 知识库
首页 / knowledge/代码解析/net

ems_download.h

源文件路径:net/ems_download.h 所属模块:net(网络应用层 — EMS 固件下载与升级) 代码行数:44

1. 文件职责

本文件是 EMS 应用固件在外挂 SPI Flash 上的地址分区表与下载/升级状态查询接口的声明头。

它定义了 4 个关键 Flash 区域(主用/备份 × 配置/固件)的起止地址,以及 APP 固件长度的上下限,是 net/ems_download.c、net/upd_download.c 乃至 net/server.c 落盘时共同遵循的"磁盘分区表"。

同时它导出 7 个状态查询/动作函数声明,供 HMI、LED、BMS、以太网等模块判断整机升级状态。

它的地址宏被 net/server.c:3451 通过 APP_MIN_SIZE / APP_MAX_SIZE 用于校验服务器下发的固件长度是否合法,属于升级流程的前置门禁。

本头文件不包含任何实现,也不定义结构体,是纯常量 + 声明的接口描述文件。

2. 关键数据结构与宏

名称类型说明
__EMS_DOWNLOAD_H__宏(include guard)头文件保护宏(:9-10)
START_ADDR_SPI_FLASH_EMS_FW_CFG_INFO宏0x00000000,主用 EMS 升级配置信息区起始(:17)
END_ADDR_SPI_FLASH_EMS_FW_CFG_INFO宏0x00000FFF,该区结束,共 4KB(:18)
START_ADDR_SPI_FLASH_EMS_FW宏0x00003000,主用 EMS 固件下载区起始(:21)
END_ADDR_SPI_FLASH_EMS_FW宏0x00102FFF,该区结束,约 1MB(:22)
START_ADDR_SPI_FLASH_EMS_APP2_FW_CFG_INFO宏0x00103000,备份 EMS 升级配置信息区起始(:25)
END_ADDR_SPI_FLASH_EMS_APP2_FW_CFG_INFO宏0x00103FFF,该区结束,共 4KB(:26)
START_ADDR_SPI_FLASH_EMS_APP2_FW宏0x00106000,备份 EMS 固件下载区起始(:29)
END_ADDR_SPI_FLASH_EMS_APP2_FW宏0x00205FFF,该区结束,约 1MB(:30)
APP_MIN_SIZE宏100 * 1024(102400),APP 固件最小合法字节数(:32)
APP_MAX_SIZE宏(CHIP_FLASH_SIZE - 32) * 1024,APP 固件最大合法字节数(:33)
CHIP_FLASH_SIZE宏(外部 system/sys/chip.h:180)*(volatile uint16_t*)(0x1FFF7A22),运行时从芯片 UID 区读出的 Flash 容量(单位 KB),故 APP_MAX_SIZE 是运行期才确定的表达式

本文件未定义结构体、枚举、联合体或位域。

3. 函数清单

本文件不含函数定义,只含函数声明。

函数名作用域说明
save_updt_config_info_to_external_flash(u8 *pBuff, u32 Len)全局(声明,定义在 net/ems_download.c:63)将升级配置表写入外挂 SPI Flash 的 CFG_INFO 区
calculate_ems_flash_md5(void)全局(声明,定义在 net/ems_download.c:120)EMS 固件整包 MD5 校核并可触发复位升级
save_ems_server_update_info(void)全局(声明,定义在 net/ems_download.c:47,空实现)EMS 服务器升级信息保存(历史桩函数)
IsDownloadEMS(void)全局(声明,定义在 net/ems_download.c:217)返回 EMS 强制/正在下载标志
GetPercentDownloadEMS(void)全局(声明,定义在 net/ems_download.c:228)返回 EMS 下载百分比(0~100)
IsSystemDownload(void)全局(声明,定义在 net/ems_download.c:252)聚合查询:整机是否有任一设备正在下载固件
IsSystemUpgrade(void)全局(声明,定义在 net/ems_download.c:274)聚合查询:整机是否有任一设备下载完成待升级

注意:net/ems_download.c 中另有 calculate_ems_flash_md5_read_data(:93)与 GetPercentUpgradeEMS(:239)两个全局函数未在此声明,属于接口遗漏。

4. 核心逻辑解析

本文件无逻辑代码。相关实现逻辑说明见 docs/knowledge/代码解析/net/ems_download.c.md 的第 4 节。

头文件层面的要点:

Flash 分区布局(外挂 SPI Flash,字节偏移)

区域起始结束大小用途
主用配置0x000000000x00000FFF4KB主区 STUpdateTab
保留空洞0x000010000x00002FFF8KB未定义
主用固件0x000030000x00102FFF≈1020KBAPP1 EMS 固件镜像
保留空洞0x00103000 之前—1KB0x102FFF → 0x103000 无缝衔接,无空洞
备份配置0x001030000x00103FFF4KB备份区 STUpdateTab
保留空洞0x001040000x00105FFF8KB未定义
备份固件0x001060000x00205FFF≈1020KBAPP2 EMS 固件镜像

主区与备份区的内部结构完全镜像(配置 4KB + 空洞 8KB + 固件 ≈1MB),便于双分区回滚。

APP_MAX_SIZE 是运行期表达式:CHIP_FLASH_SIZE 从系统存储区地址 0x1FFF7A22 读取(system/sys/chip.h:180),因此 APP_MAX_SIZE 不能直接用于 #if 预处理判断,只能用于运行期比较。net/server.c:3451 即把它作为实参传给 set_file_updating_info_for_dev() 做长度合法性校验。

与 upd_download.h 的重复定义:net/upd_download.h:16-21 重复定义了 START_ADDR_SPI_FLASH_EMS_FW、END_ADDR_SPI_FLASH_EMS_FW、START_ADDR_SPI_FLASH_EMS_APP2_FW、END_ADDR_SPI_FLASH_EMS_APP2_FW 四个宏,取值与本文件完全一致,但没有 include guard 之外的任何去重机制,两处必须同步修改。

5. 对外接口

本文件导出

符号使用者
START_ADDR_SPI_FLASH_EMS_FW_CFG_INFOnet/ems_download.c:76
START_ADDR_SPI_FLASH_EMS_APP2_FW_CFG_INFOnet/ems_download.c:80
START_ADDR_SPI_FLASH_EMS_FWnet/ems_download.c:97
START_ADDR_SPI_FLASH_EMS_APP2_FWnet/ems_download.c:97
APP_MIN_SIZE / APP_MAX_SIZEnet/server.c:3451(传给 set_file_updating_info_for_dev)
save_updt_config_info_to_external_flash仅 net/ems_download.c:184 内部调用,无外部调用方
calculate_ems_flash_md5net/server.c:3785、midware/interface/modbus/modbus.c:9336
save_ems_server_update_infonet/server.c:3234
IsDownloadEMShmi/ui/ui_main.c:782、data/fault_warn_log/fault_warn_log.c:1540、data/resume_data/flash/flash_data_store.c:2806
GetPercentDownloadEMShmi/ui/ui_main.c:788
IsSystemDownloadhmi/led.c、midware/bms/bms.c、midware/ethernt/ethernet.c、midware/ethernt/wireless/wireless_driver.c、net/ems.c
IsSystemUpgradehmi/led.c、midware/bms/bms.c、midware/ethernt/ethernet.c、net/ems.c
END_ADDR_SPI_FLASH_EMS_FW_CFG_INFO / END_ADDR_SPI_FLASH_EMS_APP2_FW_CFG_INFO / END_ADDR_SPI_FLASH_EMS_APP2_FW全工程搜索无引用,仅作文档用途

本文件调用的外部函数 / 变量

无(仅 #include <includes.h>,类型与 CHIP_FLASH_SIZE 由使用者自行 include chip.h)。

6. 依赖关系

7. 备注与风险点