编程事项

一、数据类型

        数据类型是给变量、函数做限定,以决定存储何种数据及返回何种数据

       #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)

  

原文地址:https://www.cnblogs.com/skullboyer/p/8109480.html