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

crc.h

源文件路径:common/crc.h 所属模块:common(通用工具库) 代码行数:23

1. 文件职责

本文件是 common/crc.c 的对外接口头文件,声明 EMS 固件中全部 5 个通用校验(CRC)函数原型。这些函数被数据层(配置/故障日志/网络事件日志/断电续传存储的落盘校验)、中间件层(逆变器、电表、BMS、AFCI、EVC、并机 CAN 通信帧校验)以及网络层(net/ems.c、net/server.c、net/ems_download.c、net/upd_download.c)广泛调用,是「凡是帧/记录需要校验和」时的统一入口。文件本身不含实现、不含状态、不参与数据流计算,只在编译期把算法签名暴露给包含者。它同时承担「把 chip.h 的基础类型引入到调用方」的副作用(见第 6 节)。

2. 关键数据结构与宏

名称类型说明
__CRC_H__宏include guard
GetCrcCode_8_MAXIM函数原型u8 GetCrcCode_8_MAXIM(u8 *ptr, u32 len),CRC-8/MAXIM
GetCrcCode_Modbus函数原型u16 GetCrcCode_Modbus(u8 *pData, u32 wLen),初值 0xFFFF 的反射 CRC-16
GetCrcCode_IBM函数原型u16 GetCrcCode_IBM(u8 *pData, u32 wLen),初值 0x0000 的反射 CRC-16
get_data_crc_check函数原型u16 get_data_crc_check(u16 crc, const u8 data),单字节增量更新
GetCrcCode_CRC16函数原型u16 GetCrcCode_CRC16(u16 initCRC16, u8 *updata, u32 len),可指定初值的反射 CRC-16

本文件不定义结构体、枚举、联合体、位域,也没有除 include guard 外的宏常量。类型 u8 / u16 / u32 来自第 13 行 #include "chip.h"。

3. 函数清单

函数名作用域说明
GetCrcCode_8_MAXIM全局(原型声明)8 位 Dallas/Maxim CRC,定义于 crc.c:126
GetCrcCode_Modbus全局(原型声明)初值 0xFFFF 的反射 CRC-16,定义于 crc.c:144
GetCrcCode_IBM全局(原型声明)初值 0x0000 的反射 CRC-16,定义于 crc.c:165
get_data_crc_check全局(原型声明)以外部传入的中间值继续计算单字节 CRC,定义于 crc.c:190
GetCrcCode_CRC16全局(原型声明)可指定初值的反射 CRC-16,定义于 crc.c:212

共 5 个原型声明,全部对应 crc.c 中的全局定义;本头文件没有 static 函数、没有函数指针、没有回调类型。

4. 核心逻辑解析

本文件是纯声明文件,不含可执行逻辑。要点集中在接口契约与算法选用上:

4.1 五个接口的算法定位

接口多项式/位序初值终值异或等价标准算法工程内用途
GetCrcCode_8_MAXIM0x31(反射 0x8C)0x00无CRC-8/MAXIM(Dallas 1-Wire)并机 CAN 帧第 8 字节
GetCrcCode_Modbus0xA001(反射)0xFFFF无CRC-16/MODBUSModbus RTU 帧尾、落盘记录尾
GetCrcCode_IBM0xA001(反射)0x0000无CRC-16/ARCEVC 升级帧
get_data_crc_check0xA001(反射)由调用方给出无CRC-16/MODBUS 的单字节迭代步BMS CAN 升级流式累加
GetCrcCode_CRC160xA001(反射)参数指定无广义 CRC-16/IBM 族BMS 电池日志

(上表结论已用 GetCrcCode_CRC16 的标准测试向量核对,详见 crc.c.md 第 4 节。)

4.2 调用约定

4.3 通信协议 / 定时 / uCOS-II 配合

无。本文件不涉及帧格式、超时重试、定时调度,不声明信号量或消息邮箱,也不直接引用 uCOS-II API。

5. 对外接口

导出(供外部使用):

名称使用方
GetCrcCode_Modbus覆盖 data / hmi / midware / net 四层的 28 个 .c 文件,是使用面最广的接口
GetCrcCode_8_MAXIMmidware/inverter/parallel_comm/parallel_can.c:92、:152、:527、:542(parallel_sci.c:78 处为注释掉的旧调用)
GetCrcCode_IBMmidware/evc/evc_upgrade.c:61、:68、:134、:143
get_data_crc_checkmidware/bms/alpha/battery_upgrade.c:287~:290、:395
GetCrcCode_CRC16midware/bms/alpha/battery_comm.c:1992

被调用(本文件引用的外部符号):

名称来源
chip.hsystem/sys/chip.h(第 13 行 include),提供 u8 / u16 / u32

本文件不导出任何全局变量。

6. 依赖关系

依赖:

被依赖(include 本头文件的文件,按层归类):

合计 35 个包含点(含 common/crc.c 自身),是 common/ 里被引用面最广的头文件之一。

7. 备注与风险点

  1. 头文件注释与内容不符:第 2 行 @file :crc.h 正确,但对应的 crc.c 文件头写的是 @file :convert.c(复制粘贴遗留),容易误导维护者。
  2. chip.h 的硬依赖未做条件保护:u8 / u16 / u32 并非本文件定义,一旦包含顺序变化或在无 chip.h 的环境(如 PC 侧单元测试)编译会整体失败。属正常写法但耦合较紧。
  3. 函数命名不一致:5 个接口里 4 个是 GetCrcCode_*,1 个是 get_data_crc_check(小写 + 下划线),且 GetCrcCode_8_MAXIM 会让人误以为参数是 8 位长度。命名未统一,检索时容易漏掉 get_data_crc_check。
  4. 参数命名暗示了错误的语义:GetCrcCode_Modbus(u8 *pData, u32 wLen) 里的 wLen 使用了匈牙利前缀 w(word/16 位),但实际类型是 u32 的字节数;GetCrcCode_CRC16(u16 initCRC16, u8 *updata, ...) 的 updata 是拼写错误。
  5. 无任何参数校验契约:所有原型都没有约定「指针为 NULL 或长度为 0 时的行为」,实现里也没有防护(见 crc.c.md 备注 4)。