目录
序言
作为一个合格的程序员,有良好的编码标准和风格是非常有必要的。有自己的编码标准和风格,如命名方式,数据类型等,比如一个简单、清晰地变量或函数命名可以让人瞬间理解其中含义而不需要去找接下来的逻辑代码才清楚其本意,由此同时还方便维护代码。本读者就非常喜欢FreeRTOS的编码标准和风格,感觉就非常nice,有其他好编码标准和风格也可以推荐。接下来以FreeRTOS为例讲解。
编码标准
FreeRTOS的核心文件符合MISRA规定的相关编码标准,MISRA全称为The Motor Industry Software Reliability Association,翻译就是汽车工业软件可靠性联会。FreeRTOS遵循MISRA制定的编码标准,但是FreeRTOS也并完全遵循MISRA的标准,其中有些地方是不同。
命名规则
FreeRTOS内核命名规则如下:
(1)变量命名
1、uint32_t类型变量的前缀使用ul,u表示unsigned,l表示long
2、uint16_t类型变量的前缀使用us,u表示unsigned,s表示short
3、uint8_t类型变量的前缀使用uc,u表示unsigned,c表示char
4、非stdint.h定义类型变量的前缀使用x,比如BastType_t和TickType
5、非stdint.h定义的无符号类型变量的前缀使用u,UBaseType_t类型的变量的前缀使用ux,因为UBaseType_t是unsigned BaseType_t
6、size_t类型变量的前缀使用x
7、枚举类型变量的前缀使用e
8、指针类型变量要多加一个前缀p,比如一个指针指向uint16_t类型,那么前缀就是pus
9、char类型的变量只能用于ASCII字符,使用c
10、char* 类型的变量只能用于ASCII字符串,使用前缀pc
(2)函数命名
1、使用static限定的某个文件的私有函数使用prv.
2、API函数根据其返回值来决定函数的前缀,无返回值的函数使用前缀v,表示void
3、API函数名字会使用它们所在的文件名,比如vTaskDelete表示此函数定义在task.c中,函数返回值为void类型
(3)宏命名
1、宏定义会使用它们所在文件名的一部分最为前缀,比如configUSE_PREEMPTION的前缀为config,表示其在FreeRTOSConfig.h文件中定义。注意,这部分前缀是小写。
2、宏定义的其他部分全部用大写,并且各个部分之间用下划线分隔
数据类型
只使用stdint.h和FreeRTOS自己定义的数据类型,但是下面两个除外:
(1)char
根据MISRA指导手册,char类型的变量只能保存ASCII字符
(2)char*
根据MISRA指导手册,char*类型变量只能用于保存ASCII字符串
编程风格
(1)缩进
缩进使用Tab键,一个Tab键等于四个空格键
(2)注释
注释一行不超过80列。不使用双斜杠//注释方式
(3)布局风格
良好的代码布局可以易于浏览和阅读,FreeRTOS的代码布局如下:
函数布局
/*
* 函数的每一行注释前面都要加*
*
*/
static void prvFunction(uint32_t ulParameter)
{
/*变量的注释使用/* */格式,每一行不需要使用**/
static BaseType_t xVariable;
}
/*函数结束以后用分隔线隔开,分隔线紧跟在函数括号的下一行,分割线和下一个函数之间通过孔行隔开*/
/*---------------------------------------------------*/
void vFunction(void)
{
/*声明变量不需要缩进*/
uint8_t ucByte;
/*代码需要缩进,同样的,花括号单独占一行 */
for(ucByte = 0; ucByte < fileBUFFER_LENGTH; ucByte++)
{
/*再次缩进*/
}
/* 涉及运算符优先级的地方要使用括号明确运算符优先级,尤其是多则运算*/
if((ucByte < fileBUFFER_LENGTH) && (ucByte != 0u))
{
}
/* 条件编译语句全部展开,并且其他代码缩进*/
#if(configUSE_TRACE_FACILITY == 1)
{
pxNewTCB->uxTCBNumber = uxTaskNumber;
}
#endif
/* 方括号也需要使用空格隔开,左方括号后面和右方括号前面都使用空格*/
ucBuffer[ 0 ] = 0u;
ucBuffer[ fileBuffer_LENGTH - 1u ] = 0U;
}
通过本篇文件的学习,希望能够给予大家参考。