天天看點

單片機工程編寫規範

如下規範僅限于本人自己做記錄和參考,有誤之處請大家指正。

本規範将結合工作遇到的情況持續更新。

1.子產品化檔案格式

(.h)檔案

#ifndef __INCLUDE_H
#define __INCLUDE_H

/*************************** Includes ***************************/

/*************************** extern define  ********************/

/*************************** extern variables  *****************/

/*************************** extern function prototypes  *******/

#endif /*__INCLUDE_H*/
           

(.c)檔案

/*
 * @Author: xxxx
 * @Date: xxxx
 * @LastEditors: xxxx
 * @LastEditTime: xxxx
 * @Description: 
 */

/*************************** Includes ***************************/

/*************************** Private define  ********************/

/*************************** Private variables  *****************/

/*************************** Private function prototypes  *******/

/*************************** Public variables  ******************/

/**
  * @brief  main
  * @param  void
  * @retval None.
*/
int main(void)
{
    while(1)
    {

    }
}
           

可以定義一個公共的頭檔案将所有頭檔案都包含在裡面,以後每次寫C檔案就可以值包含一個頭檔案。

#ifndef __PUBLIC_H_
#define __PUBLIC_H_

#include "led.h"
#include "pwm.h"
#include "key.h"

#endif /*__PUBLIC_H_*/

           

2.新定義的類型命名規則

新定義的命名應該明确該對象的含義,盡量使用全部大寫,單詞之間用下劃線進行分割,成員變量使用首字母大寫區分各個單詞。

枚舉加"_e"字尾,結構體加上"_s"字尾,共用體加上"_u"字尾,函數指針加上"_f"字尾

//枚舉類型
typedef enum{
	MONDAY,
	TUESDAY,
	.....
}WEEK_e;
//結構體類型
typedef struct{
	char[10] StudentName;
	int StudentAge;
	....
}STUDENT_s;
//共用體
typedef union{
	unsigned char :1;
	unsigned char :7;
	uint8_t xxxx;
}xxx_u;
//函數指針類型
typedef (*usartEvent_Callback_f)(void);
           

3.命名規則(參考FreeRTOS命名規則)

3.1變量采用字首+具體用處的形式(下劃線+駝峰命名)

u表示無符号

l表示長整型

s表示短整形

c表示字元型

prv表示私有類型

p表示指針變量

x表示重定義類型

匈牙利命名法規則

a Array 數組

b BOOL (int) 布爾(整數)

by Unsigned Char (Byte) 無符号字元(位元組)

c Char 字元(位元組)

dw DWORD(unsigned long) 雙字(無符号長整數)

f Flags 标志(一般是有多位的數值)

fn Function 函數

g global 全局的

p Pointer 指針

m Data member of a class 一個類的資料成員

v void 空

s 字元串型

uint8_t ucUart_SendData;//表示無符号序列槽發送8位資料
uint16_t usUart_SendData;//表示無符号序列槽發送16位資料
uint8_t *pucUart_Buff;//表示指向序列槽緩存的指針
size_t xSize;//表示重定義類型
static uint8_t prvData;//表示私有變量
           

3.2函數采用具體裝置+作用(下劃線+駝峰命名)

void Uart_Init(void);//序列槽初始化
void Uart_SednData(uint8_t Data);//序列槽發送資料
           

3.3宏定義命名

盡量采用全部大寫的形式,C的宏隻能擴充為用大括号括起來的初始化、常量、小括号括起來的表達式、類型限定符、存儲類辨別符或do-while-zero 結構。

#define   PI 3.14159F
 #define  CLOCK (XSTAL / 16)
 #define   INIT(value)  { (value), 0, 0 } 
           

如果某一個宏是經常被使用的,則可以使用檔案名(小寫)+宏名的方式命名

4.在定義函數宏時,每個參數執行個體都應該以小括号括起來。

#define  abs (x) ( ( (x) >= 0 ) ? (x) : -(x) )
 #define   READ_TIME_32() \
 do  { \
	DISABLE_INTERRUPTS(); \
	time_now = (INT32U) TIMER_HI << 16; \
	time_now = time_now | (INT32U) TIMER_LO; \
	ENABLE_INTERRUPTS(); \
} while(0)   //分号在使用這個宏定義時後面加上
           

5.使用宏時,不允許參數數值發生變化。

//錯誤用法
b = SQUARE(a++);           /*結果:a = 7,即執行了兩次增。*/

//正确用法
b = SQUARE(a);
a++;                                      /*結果:a = 6,即隻執行了一次增*/
           

繼續閱讀