一、排版布局
- 头文件布局
#ifndef 文件名_H(全大写)
#define 文件名_H
其它条件编译选项
#include(依次为标准库头文件、非标准库头文件)
常量定义
全局宏
全局数据类型
类定义
模板(template)(包括C++中的类模板和函数模板)
全局函数原型
#endif
- C文件布局
#include(依次为标准库头文件、非标准库头文件)
常量定义
文件内部使用的宏
文件内部使用的数据类型
全局变量
本地变量(即静态全局变量)
局部函数原型
类的实现
全局函数
局部函数
二、注释
- 文件头部的注释,可以是英文也可以是中文(不做具体要求,建议统一采用中文)。具体格式如下:
/*********************************************************************
* 内容摘要: 按键检测相关
* 其它说明: 首次更新
* 当前版本: V1.0.0
* 作 者: zy
* 完成日期: 20200201
**********************************************************************/
/***********************************************************************
* Description: // 简要描述本文件的内容,完成的主要功能
* Others: // 其它内容的说明
* Version: // 输入当前版本
* Author: // 输入作者名字及单位
* Date: // 输入完成日期,例:2001-12-12
**********************************************************************/
- 函数头部注释,可以是英文也可以是中文(不做具体要求,建议统一采用中文)。具体格式如下:
/**********************************************************************
* 函数名称: DebugInfor
* 功能描述: 打印相关信息
* 输入参数: 无
* 输出参数: 无
* 其它说明: 观察内存使用情况
***********************************************************************/
三、结构体、枚举等
- 结构体:(以小写st开头,后缀Def)
定义结构体可以使用
typedef struct
{
U16 u16DataMember1;
U8 u8DataMember2;
…
}stNameDef;
stNameDef stName;
加粗是相关格式
/*电池状态数据*/
typedef struct
{
U16 u16Volt; /*电压*10mv*/
U16 s16Current; /*电流*10mA*/
U16 u16TotalCapacity; /*总容量*mAh*/
U16 u16RemainCapacity; /*剩余容量*mAh*/
U8 u8RemainPercent; /*剩余容量百分比*1%*/
U8 u8Temper; /*电池温度*1°,偏移40*/
U8 u8Status; /*状态码*/
U8 u8SOH; /*SOH百分比,单位1%*/
U32 u32Err; /*故障码*/
U8 u8PowerOff; /*关机指令*系统即将关闭时主动广播,轻触关机键(或者其他关机操作)后,电池不直接掉电*/
iot_uint16 u16SwVer; /*软件版本*/
iot_uint16 u16HwVer; /*硬件版本*/
} stBmsInfoDef;
stBmsInfoDef stBmsInfo;//定义结构体数据
stBmsInfoDef *UsrSensorGetBmsInfo(void)
{
return &stBmsInfo;
}
stBmsInfoDef *pstBmsInfo = UsrSensorGetBmsInfo();//定义结构体指针
- 枚举:(以小写em开头,后缀Def)
定义枚举可以使用
typedef enum
{
STEP_0 = 0x00,
STEP_1 ,
STEP_2 ,
STEP_3 ,
STEP_4 ,
STEP_5 ,
STEP_6
…
} emNameDef;
emNameDef emName;
加粗是相关格式
typedef enum{
DATA_ODO_SHOW = 0x00,//ODO数据是否显示
DATA_TRIP_SHOW ,//TRIP数据是否显示
DATA_MAX_SPEED_SHOW, //MAX_SPEED数据是否显示
DATA_AVG_SPEED_SHOW,//AVG_SPEED数据是否显示
DATA_TIME_SHOW,//TIME数据是否显示
DATA_CADENCE_SHOW,//CADENCE数据是否显示
DATA_REMAIN_SHOW,//REMAIN数据是否显示
DATA_CAL_SHOW,//CAL数据是否显示
ADVAN_DATA_SHOW_EXIT//退出
}emSetAdvanDataShowIndexDef;//高级设置之主页cycle数据显示哪些
emSetAdvanDataShowIndexDef emSetAdvanDataShowIndex;//定义枚举数据
- 联合体:(以小写un开头,后缀Def)
定义联合体可以使用
typedef union
{
}unForExampleDef, *punForExampleDef;
unForExampleDef unTestDevice;
四、变量、函数
- 函数需要使用帕斯卡命名方法,即函数名中每个逻辑断点都要一个大写字母来标记,并且最好见名知意;如果是只在当前文件中使用的函数最好加上static,限制其使用范围;函数名应准确描述函数的功能,使用动宾词组为执行某操作的函数命名
static void OpenSetHomePage( void );
void PrintRecord( unsigned int RecInd ) ;
int InputRecord( void ) ;
unsigned char GetCurrentColor( void ) ;
- 变量命名使用驼峰命名法,即变量第一个单词首字母小写,余下单词首字母大写,并且第一个单词最好是变量类型;非指针命名:类型+描述(u8Temp),指针命名:p+类型+描述(float *pfTemp uint8 *pu8Temp)
U16 u16CurSpeed;
U8 u8CycleCount;
float fPower;
U8 *pu8StrLabel;
U8 arrLabelTitle[10][20];
五、宏及常量命名
均大写加下划线,每个逻辑断点使用下划线连接起来
/*电池状态定义*/
#define BMS_STATUS_CHARGING (0x01) /*充电*/
#define BMS_STATUS_DISCHARGING (0x02) /*放电*/
#define BMS_STATUS_SHELVED (0x03) /*搁置*/
#define BMS_STATUS_BALANCED (0x04) /*均衡*/
#define BMS_STATUS_PROTECTED (0x05) /*保护*/
#define BMS_STATUS_PERMANENT_FAULT (0x06) /*永久失效*/
/*电池故障码*/
#define BMS_ERR_CHARGING_OVER_VOLT (iot_uint32)(0x00000001) /*充电过压*/
#define BMS_ERR_CHARGING_OVER_CURRENT (iot_uint32)(0x00000001 << 1) /*充电过流*/
#define BMS_ERR_CHARGING_HIGH_TEMPER (iot_uint32)(0x00000001 << 2) /*充电高温*/
#define BMS_ERR_CHARGING_LOW_TEMPER (iot_uint32)(0x00000001 << 3) /*充电低温*/
#define BMS_ERR_DISCHARGE_OWE_VOLT (iot_uint32)(0x00000001 << 4) /*放电欠压*/
#define BMS_ERR_DISCHARGE_OVER_CURRENT (iot_uint32)(0x00000001 << 5) /*放电过流*/
#define BMS_ERR_DISCHARGE_OVER_TEMPER (iot_uint32)(0x00000001 << 6) /*放电过温*/
#define BMS_ERR_DISCHARGE_LOW_TEMPER (iot_uint32)(0x00000001 << 7) /*放电低温*/
#define BMS_ERR_PERMANENT_FAULT (iot_uint32)(0x00000001 << 8) /*BMS永久故障*/
#define RECTANGLE_AREA( a, b ) ((a) * (b))//用宏定义表达式时,要使用完备的括号。
六、文件
文件命名规则,以能将代码实现功能做一概括性描述为准则,和函数一致。
example: DevKey.c ,UiHomePage.c,UsrTypedef.h
七、数据类型
变量的数据类型,在不同的mcu体系结构下,其长度是不同的,有必要做统一的规范。在软件工程中,强制要求采用下面示例的变量类型定义头文件。保证数据类型的统一
#ifndef __BASIC_DATA_TYPE_H__
#define __BASIC_DATA_TYPE_H__
#define MAX_NAME_LENGTH 200
#define MAX_UNIT_LENGTH 50
#ifndef NULL
#define NULL (void *)0
#endif
#ifndef bool
#define bool unsigned char
#endif
#ifndef TRUE
#define TRUE 1
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef true
#define true 1
#endif
#ifndef false
#define false 0
#endif
typedef signed char S8; // s8
typedef unsigned char U8; // u8
typedef signed short int S16; // s16
typedef unsigned short int U16; // u16
typedef signed int S32; // s32
typedef unsigned int U32; // u32
typedef signed long long S64; // s64
typedef unsigned long long U64; // u64
typedef long double float80; // f80