1、如何学习
市面上流行多款RTOS嵌入式操作系统,学习FreeRTOS需要我们掌握其API函数,要能够读懂FreeRTOS的源码,再对底层实现原理加以了解,最后会通过学会的FreeRTOS知识学习其他的RTOS。
2、编码规范
2.1 数据类型
只有stdint.h和RTOS自己定义的数据类型可以使用,但也有例外情况,如下所示:
①. char:与MISRA编码标准指南一致,char类型变量仅被允许保存ASCII字符 ②. char *:与MISRA编码标准指南一致,char *类型变量仅允许指向ASCII字符串。当标准库函数期望一个char *参数时,这样做可以消除一些编译器警告;特别是考虑到有些编译器将char类型当做signed类型,还有些编译器将char类型当做unsigned类型。
2.1.1 三种类型在移植层被定义
①. TickType_t:如果configUSE_16_BIT_TICKS为非零(条件为真),TickType_t定义为无符号16位类型。如果configUSE_16_BIT_TICKS为零(条件为假),TickType_t定义为无符号32位类型。注:32位架构的微处理器应设置configUSE_16_BIT_TICKS为零。
②. BaseType_t:定义为微处理器架构效率最高的数据类型。比如,在32位架构处理器上,BaseType_t应该定义为32位类型。在16位架构处理器上,BaseType_t应该定义为16位类型。如果BaseType_t定义为char,对于函数返回值一定要确保使用的是signed char,否则可能造成负数错误。
③. UbaseType_t:这是一个无符号BaseType_t类型
2.2 变量名
全称 | 前缀—缩写 |
---|---|
unsigned long | ul |
unsigned short | us |
unsigned char | uc |
基本的Type_t和TickType_t类型 | x(非stdint类型变量) |
UbaseType_t(unsigned BaseType_t) | ux |
size_t类型 | x |
枚举类型变量 | e |
指针类型变量 | 在类型基础上附加前缀p,如pus为指向uint16_t |
与MISRA编码标准指南一致,charl类型变量仅允许保存ASCII字符 | c |
与MISRA编码标准指南一致,char *类型变量仅允许指向ASCII字符 | pc |
2.3 函数名
①. 在文件作用域范围的函数前缀为prv;
②. API函数的前缀为它们的返回类型,当返回为空时,前缀为v;
③. API函数名字起始部分为该函数所在的文件名。比如vTaskDelete函数定义在tasks.c,并且该函数返回空。
2.4 宏
①. 宏的名字起始部分为该宏定义所在的文件名的一部分。比如configUSE_PREEMPTION定义在FreeRTOSConfig.h文件中;
②. 除了前缀,宏剩下的字母全部为大写,两个单词间用下划线(’_’)隔开。eRTOS项目文件结构。
2.5 风格指南
①. 缩进:缩进使用制表符,一个制表符等于4个空格。
②. 注释:注释单行不超过80列,特殊情况除外。不使用C++风格的双斜线(//)注释
③. 布局:FreeRTOS的源代码被设计成尽可能的易于查看和阅读。下面的代码片中,第一部分展示文件布局,第二部分展示C代码设计格式。。
3、FreeRTOS源码结构
源码下载地址:FreeRTOS Real Time Kernel (RTOS) download | SourceForge.net
4、FreeRTOS项目文件
分析以FreeRTOSv9.0.0版本的为例:
选择分析FreeRTOS文件夹下的文件。FreeRTOS-Plus比起FreeRTOS多了一些功能。
FreeRTOS文件夹下有三个文件夹:Demo、License、Source。
Demo:是官方提供的相关例程。
License:是相关许可信息。
Source:FreeRTOS的文件。文件包含的如下图:
其中,include是一些头文件。.c文件就是FreeRTOS的源码,portable文件是支持编译环境的文件。
文件名 | 描述 | 是否必须 |
---|---|---|
croutine.c | 可选,过时了。类似tasks.c ,可以进行多任务调度,另一种方式进行调试 | 否 |
event_groups.c | 可选、提供 event group 功能事件标志组,初级理解,对任务管理的一种补充 | 否 |
list.c | 必须、列表 | 是 |
queue.c | 必须、提供队列操作、信号量(semaphore)操作 | 是 |
stream_buffer.c | 10以后出的,缓冲区 | 是 |
tasks.c | 必须、任务操作 | 是 |
timers.c | 可选、software timer | 否 |
5、FreeRTOS移植到STM32F103C8T6
参考博客: