编码规范
1. 编码格式
- 所有C语言源文件统一使用GB2312编码,确保跨平台兼容性
- 所有非C语言源文件统一使用utf-8编码,确保跨平台兼容性
2. 变量命名规范
- 变量命名统一使用大驼峰命名法(PascalCase)
- 全局变量命名格式:
G_ + 大驼峰,例如:G_SystemStatus
- 静态变量命名格式:
S_ + 大驼峰,例如:S_InstanceCount
3. 结构体规范
- 所有结构体定义必须添加
__PACKED,防止编译器自动优化结构体布局;需要四字节对齐的结构体仍然使用__PACKED,并在定义结构体时通过成员顺序或预留字段手动对齐
- 结构体定义时尽量保证四字节对齐,提高内存访问效率
- 结构体成员命名使用大驼峰命名法
- 结构体类型命名格式:大驼峰 +
_t,例如:AbcDefGh_t
结构体手动对齐示例:
typedef struct
{
uint8_t MsgType; /* 偏移0:消息类型 */
uint8_t Reserved0; /* 偏移1:手动补齐,使Length从偏移2开始 */
uint16_t Length; /* 偏移2:长度字段 */
uint32_t SeqNo; /* 偏移4:序号字段,手动保证四字节对齐 */
uint8_t Status; /* 偏移8:状态 */
uint8_t Reserved1[3]; /* 偏移9-11:手动补齐,使结构体总长度为12字节 */
} __PACKED ExampleFrame_t;
结构体未手动对齐的反例:
typedef struct
{
uint8_t MsgType; /* 偏移0:消息类型 */
uint32_t SeqNo; /* 偏移1:序号字段,未按四字节对齐 */
uint8_t Status; /* 偏移5:状态 */
} __PACKED BadFrame_t;
4. 枚举规范
- 每个枚举成员都必须明确赋值,避免代码阅读时人工计算枚举值
- 枚举成员命名使用全大写字母和下划线连接,例如:
ENUM_VALUE_ONE
- 枚举类型命名格式:大驼峰 +
_e,例如:AbcDefGh_e
- 所有的枚举都要加中文注释
5. 头文件管理
.c文件只能包含同名的.h文件
- 其他头文件依赖应在
.h文件中统一管理
6. 宏定义规范
- 宏命名统一使用全大写字母和下划线连接,例如:
ABC_DEF
- 宏定义应具有明确的语义和用途
- 所有的宏都要加中文注释
7. 函数设计规范
- 函数圈复杂度不超过10,保持函数简洁易读
- 函数命名使用下划线连接的小写字母,例如:
is_valid_item_seq
- 函数参数数量不超过4个,超过时应使用结构体封装
- 函数声明、定义和调用的参数数量不超过5个时,函数名和所有参数必须写在同一行;只有参数数量超过5个时才换行
- 每个函数都必须添加Doxygen注释,注释语言使用中文
函数注释示例:
/**
* @brief 判断操作的数据标识序号是否合法
*
* @param [in] ItemSeq 序号
* @return true 序号合法,false 序号不合法
*/
static bool is_valid_item_seq(uint8_t ItemSeq);
8. 其他编码规范
- 外部接口的变量和函数必须添加
extern声明
- 内部使用的变量和函数必须添加
static修饰符
- 尽量避免使用全局变量,防止并发访问问题
- 全局变量尽量不进行初始化,减少启动时间
- 优先使用
const修饰符,提高代码安全性
- 数据类型选择原则:能用
uint8_t解决的不使用uint16_t或int,节省资源
- 条件判断中常量在前,变量在后,例如:
if(0 == x)而不是if(x == 0)
- 所有花括号必须另起一行,保持代码格式统一
- 日志打印内容应简洁明了,避免冗余信息
- 中文注释要多写,没有坏处
- 布尔类型的函数或者变量一律使用bool类型,不使用int或其他类型
- 局部变量哪里使用哪里定义,不要在函数开头统一定义
- 数据类型统一用C语言标准的int8_t、int16_t、int32_t、int64_t、uint8_t、uint16_t、uint32_t、uint64_t,不要用int、long、short、unsigned int等
编译方法
编译路径
临时编译方法
make clean && make venus2m_v7_riscv_sta -j P=HU_NAN CHIPVER=CHIP_V7
正式编译方法