谷动谷力

标题: FreeRTOS编码标准、测试和风格指南 [打印本页]

作者: 鸣涧_GC96O    时间: 2021-10-4 00:26
标题: FreeRTOS编码标准、测试和风格指南
本帖最后由 sunsili 于 2021-11-28 20:34 编辑

FreeRTOS编码标准、测试和风格指南
编码标准 / MISRA 合规性
核心 FreeRTOS 源文件(那些对所有端口通用,但不是端口层的)符合MISRA编码标准指南。使用pc-lint链接的 lint 配置文件检查合规性。由于该标准有很多页,并且可以从 MISRA 以很少的费用购买,因此我们没有在此处复制所有规则。
下面列出了与 MISRA 标准的偏差:
FreeRTOS 使用许多不同的编译器构建,其中一些编译器比其他编译器更先进。因此,FreeRTOS 不使用由 C99 标准或自 C99 标准引入 C 语言的任何功能或语法。对此的一个例外是使用stdint.h头文件。该FreeRTOS的/来源/包括目录包含一个名为stdint.readme可以改名stdint.h提供必要建立FreeRTOS的最低stdint类型定义-要你的编译器不提供其自身。


测试
本节介绍对通用代码(位于FreeRTOS/Source目录中的代码,由所有 FreeRTOS 内核端口构建)执行的测试,以及对可移植层代码(位于FreeRTOS/Source子目录中的代码)执行的测试/便携式目录)。
值得注意的是,这些测试的彻底性导致了多次在芯片中发现错误。

命名约定
RTOS 内核和演示应用程序源代码使用以下约定:

数据类型
仅使用 stdint.h 类型和 RTOS 自己的 typedef,以下情况除外:

每个端口定义了四种类型。这些是:

时尚指南
作者: 鸣涧_GC96O    时间: 2021-10-4 00:27
本帖最后由 sunsili 于 2021-11-28 20:37 编辑

FreeRTOS 源代码布局旨在尽可能易于查看和阅读。下面的代码片段首先显示文件布局,然后显示 C 代码格式。

  1. /* 库包含首先... */
  2. #include <stdlib.h>
  3. /* ...紧跟 FreeRTOS 包含... */
  4. #include "FreeRTOS.h"
  5. /* ...紧跟其他包含。*/
  6. #include "HardwareSpecifics.h"
  7. /* #defines 接下来,尽可能用括号括起来。*/
  8. #define A_DEFINITION ( 1 )
  9. /*
  10. * 接下来出现静态(文件私有)函数原型,带有注释
  11. * 这种风格 - 每行以“*”开头。
  12. */
  13. 静态无效 prvAFunction( uint32_t ulParameter );
  14. /* 文件作用域变量是函数定义之前的最后一件事。
  15. 变量注释采用这种风格(每行不以“*”开头)。
  16. */
  17. /* 下面的分隔符用在每个函数的右括号之后,在下一个函数定义开始之前跟一个空行。*/
  18. /*---------------------------------------------- -------------*/

  19. void vAFunction( void )
  20. {
  21.     /* 函数定义在这里 - 注意    大括号后的分隔符。*/
  22. }
  23. /*-------------------------------------------- --------------*/

  24. static UBaseType_t prvNextFunction( void )
  25. {
  26.     /* 函数定义在这里。*/
  27. }
  28. /*-------------------------------------------- --------------*/</p><p>/* 函数名总是写在一行上,包括返回
  29. 类型。与往常一样,左括号前没有空格。
  30. 左括号后有一个空格。右括号前有一个空格。每个逗号后面都有一个空格。参数被赋予
  31. 详细的描述性名称(不像这个例子!)。
  32. 左花括号和右花括号出现在各自的行上,并排在彼此的下方。*/
  33. void vAnExampleFunction( long lParameter1, unsigned short usParameter2 )
  34. {
  35. /* 变量声明不缩进。*/
  36. uint8_t ucByte;
  37.     /* 代码缩进。花括号总是在自己的线上 ,并排在彼此的下方。*/
  38.     for( ucByte = 0U; ucByte < fileBUFFER_LENGTH; ucByte++ )
  39.     {
  40.         /* 再次缩进。*/
  41.     }
  42. }
  43. /* For、while、do 和 if 结构遵循类似的模式。
  44. 左括号前没有空格。
  45. 左括号后有一个空格。右括号前有一个空格。
  46. 每个分号后面都有一个空格(如果有的话)。
  47. 每个运算符前后都有空格。不依赖运算符优先级 -
  48. 始终使用括号来明确优先级。
  49. 除了零之外的幻数总是被替换为常量或#defined 常量。
  50. 左花括号和右花括号出现在各自的行上。*/
  51. for( ucByte = 0U; ucByte < fileBUFFER_LENGTH; ucByte++ )
  52. {
  53. }
  54. while( ucByte < fileBUFFER_LENGTH )
  55. {
  56. }
  57. /* 必须不依赖运算符优先级 -
  58. 多条件决策中的每个条件都必须唯一地括起来,所有
  59. 子-表达式。*/
  60. if( ( ucByte < fileBUFFER_LENGTH ) && ( ucByte != 0U ) )
  61. {
  62.     /* 不依赖运算符优先级的例子!*/
  63.     ulResult = ( ( ulValue1 + ulValue2 ) - ulValue3 ) * ulValue4;
  64. }
  65. /* 条件编译按照任何其他代码进行布局和缩进。*/
  66. #if( configUSE_TRACE_FACILITY == 1 )
  67. {
  68.     /* 将计数器添加到 TCB 中,仅用于跟踪。*/
  69.     pxNewTCB->uxTCBNumber = uxTaskNumber;
  70. }
  71. #endif
复制代码


在左方括号之后和右方
括号之前放置一个空格。
  1. ucBuffer[0] = 0U;
  2. ucBuffer[fileBUFFER_LENGTH - 1U] = 0U;
复制代码


C 结构的格式化






欢迎光临 谷动谷力 (http://bbs.sunsili.com/) Powered by Discuz! X3.2