前面讨论了怎么把freertos移植到s3c2440上的话题,现在我看开始细细读一下freertos的代码。读代码之前先认识下代码规范,我们常见的类似的规范大多是一些命名规则,对齐什么的,比如驼峰命名法等等。但是freertos用了一个完全不同的规则,被称之为MISRA (
The Motor Industry Software Reliability Association),之所以使用这个规范我想除了历史原因和个人习惯之外,MISRA在实时系统尤其是汽车行业的应用可能是促使freertos选择的一个重要原因。
MISRA规则详细的规范了,实时汽车系统软件编写的基本规范包括,C语言的版本标准C98这类,汇编语言的嵌入,编译器的选择,编译器的安全性评估,库的使用,第三方库的兼容性标准,标准c库的使用,以及系统代码的测试,覆盖,以及标准c语言里面的头文件,实现的c文件的使用,函数,变量的定义申明,命名规则,括号,空格等,以及一些对标准c的扩展,类似于结构体,共同体变量内存的分配,还有就是注释等等。总之一点就是尽可能让代码工作在我们设计的逻辑下,排斥人为编码错误和类似于编译工具的错误,编译环境的差异导致的错误等。有兴趣可以去他们官网查看这份标准。‘
实际用在我们freertos里面的话,我们读代码的时候只要知道有这么回事,慢慢熟悉它的编码规范就好了,通过他里面的代码风格,我们可以获取到除了代码本身逻辑要表达的信息之外,还能通过类似命名规则等东西获取到额外的信息,比如说,该变量是全局的还是局部的,变量类型是什么类型等。
使用typedef定义变量类型名,使用一些特定的前缀来定义变量名,函数名;
uint32_t ul... ,表示unsigned long
uint16_t us..,表示unsigned short
uint8_t uc..表示unsigned int
非标准类型(Type_t) x..表示跟体系结构相关的基本类型,比如8位cpu就是表示8bit
unsigned Type_t ux..表示无符号的Type_t
size_t x...
枚举类型 x...
指针 p...
指向无符号16位整形的 pus...
unsignd char 只能用于处理字符,c..
char *只能用来指向字符串 pc...
函数:
私有函数 static 限制,prv..
API函数以其返回值作为前缀,如 void v...
API函数以其存在于那个文件来作为其前缀,vTaskDelete ,--返回值为void,被写在Task.c里面,功能是Delete
其他未尽,多少都包括,空格,tab,以及一些括号什么的风格,可以直接从代码里面看的出来,反正freertos的核心代码就只有几个文件,很容易就熟悉。不再表,之所以要在注意风格,最主要是方便阅读,做到一看别人的命名就知道,类型,作用域,返回值等等。
Ok,风格就到这,具体的MISRA的那100多条军规,大家可以自己去参考,网上有中文版本的。