一、数据类型
数据类型是给变量、函数做限定,以决定存储何种数据及返回何种数据
#1 基本数据类型定义的变量、函数,因不赋予特定含义不易阅读,对于移植及他人阅读或日后阅读带来诸多不变,所以为了可读性需要将定义的变量、函数赋予特定的含义,当然这种特定类型带来的弊端就是,找到其原始数据类型有点麻烦,见到一个变量你不可能立刻就知道它属于何种基本数据类型,但这并不妨碍其优势的发挥,特定含义除了变量、函数的命名,定义变量、函数的类型也得有特定含义,特定含义类型的获得方式 ,比如需要一个时间类型:
> typedef int timetype
#2 新建数据类型包括结构体、联合体等,命名采用 对象_属性_类型,如 GPS_data_s(结构体),GPS_package_s(结构体),GPS_package_u(联合体),建议同一对象的结构体和联合体除尾缀命名相同
新类型定义的变量建议格式:
> 作为函数参数(形参) func(GPS_package_s sGPS_package_obj)、func(GPS_package_u uGPS_package_obj)
> 作为普通变量则无要求,只要求具有特定含义即可
成员变量建议的格式如下:
> string_string 这种方式采用小写(特定词汇除外,如 GPS、CRC)
> stringstring stringstring_string string_stringstring 这种方式采用首字母大写(特定词汇除外,如 msg_ID、msg_CRC)
1 /* Define the GPS structure ---------------------------------------------------------------------*/ 2 typedef struct 3 { 4 uint32_t alarm_flag; /* 报警标志 */ 5 uint32_t status; /* 状态 */ 6 uint32_t latitude; /* 维度 */ 7 uint32_t longitude; /* 经度 */ 8 uint16_t elevation; /* 海拔 */ 9 uint16_t speed; /* 速度 */ 10 uint16_t direction; /* 方向 */ 11 uint8_t GMT8[6]; /* GMT+8 YY-MM-DD-hh-mm-ss */ 12 }GPS_data_s; 13 14 typedef struct 15 { 16 uint8_t msg_head; /* 消息标识头 */ 17 uint16_t msg_ID; /* 消息 ID */ 18 uint16_t msg_prop; /* 消息体属性 */ 19 uint8_t term_phone[6]; /* 终端手机号 */ 20 uint16_t msg_SwiftNum; /* 消息流水号 */ 21 GPS_data_s message; /* 消息体 */ 22 uint8_t msg_CRC; /* 校验码 */ 23 uint8_t msg_tail; /* 消息标识尾 */ 24 }GPS_package_s; 25 26 /* Define single union control bytes output */ 27 typedef union 28 { 29 GPS_package_s sGPS_obj; 30 uint8_t GPS_byte[sizeof(GPS_package_s)]; 31 }GPS_package_u;
二、函数
#1 函数命名
命名应做到表达清晰、无歧义,避免与常见名重复,最好能做到见名知意,建议格式:模块名_操作对象_目的,为全部小写以下划线连接,除非特定词汇像GPS(模块)、BCD(编码格式)等
举例六轴模块MPU6050函数定义:
> mpu6050_hard_init() 此函数作用是初始化与MCU相连接的管脚、使用资源(SPI、IIC、USART等)相关的配置
> mpu6050_device_init() 此函数作用是初始化模块自身相关寄存器的配置
建议驱动文件内部使用函数一致使用限定符 static
> static mpu6050_register_write()
> static mpu6050_register_read()
建议供外部文件使用的函数一致使用 bsp_模块名_(操作对象)_目的,括号部分可省,模块名通常就是所在文件名,供外部使用的函数或变量最好能体现其来源,即看到该函数和变量时就能知道它是在哪个文件中定义的
> bsp_mpu6050_init() 此函数作用是供系统初始化使用
> bsp_mpu6050_write()
> bsp_mpu6050_read()
#2 函数参数
函数的参数定义的建议格式:
> _参数名(一个单词的情况,参数名要小写)
> 前缀参数名 (前缀通常为类型,参数首字母大写)
> 参数名(多个单词的情况,参数名中各单词间直接相接,各单词首字母大写,建议两个单词即可)
示例
> void dec_to_BCD(uint64_t _dec, uint8_t* _buf, uint8_t _num)
> void dec_to_BCD(uint64_t ullDec, uint8_t* ucBuf, uint8_t ucNum)
> uint16_t escape_process(uint8_t *SrcBuf, uint8_t *DesBuf, uint16_t _num)