freertos 准备工作和思考
freertos操作系统
freertos操作系统:可以理解为一个大程序,这个大程序里面有很多任务(函数),这个大程序会按照优先级或事件发生的先后来控制各个任务有条不紊的运行。类似于一个大循环,里面有很多子函数,但是子函数的运行不是按照编程的先后顺序运行,而是由调度器控制,来决定哪个任务运行,哪个任务阻塞(休息)。
源码分析建议
首先对操作系统有个基本认识,知道堆、栈、任务、调度、内存管理等基本概念。建议看操作系统相关书籍。如果是有学习过其他操作系统经验的,可以直接上手freertos,freertos的源码还是相对容易分析的。
首先学会使用 freertos,然后深入学习freertos源码,有助于更好的使用。
操作系统的源码,为了适配更多硬件,实现更多的方案,通常存在很多条件编译,学会抓住主干分析。
freertos 源码阅读
freertos 命名规则
知道命名规则之后,对分析代码很有用,知道一个符号来自哪里,是函数还是宏定义,有没有返回值,等,都可以从函数名看出来。
变量
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,比如 BaseType_t 和
5. TickType_t 定义的变量。
6. stdint.h 文件中未定义的无符号变量类型,在定义变量时要加上前缀 u,比如 UBaseType_t 定义的变量要加上前缀 ux。
7. size_t 定义的变量也要加上前缀 ux。
8. 枚举变量会加上前缀 e。
9. 指针变量会加上前缀 p,比如 uint16_t 定义的指针变量会加上前缀 pus。
10. 根据 MISRA 代码规则,char 定义的变量只能用于 ASCII 字符,前缀使用 c。
11. 根据 MISRA 代码规则,char *定义的指针变量只能用于 ASCII 字符串,前缀使用 pc。
函数
1. 加上了 static 声明的函数,定义时要加上前缀 prv,这个是单词 private 的缩写。
2.带有返回值的函数,根据返回值的数据类型,加上相应的前缀,如果没有返回值,即 void 类型,函数的前缀加上字母 v。
根据文件名,文件中相应的函数定义时也将文件名加到函数命名中,比如 tasks.c 文件中函数vTaskDelete,函数中的 task 就是文件名中的 task。
宏定义
1.根据宏定义所在的文件,文件中的宏定义声明时也将文件名加到宏定义中,比如宏定义
configUSE_PREEMPTION 是定义在文件 FreeRTOSConfig.h 里面。 宏定义中的 config 就是文件名中的 config。 另外注意,前缀要小写。
2.除了前缀,其余部分全部大写,同时用下划线分开。
阅读工具
建议使用 source insight 阅读源码
结合书籍
《cortex-m3权威指南》 必看
《freertos开发手册》
《freertos源码一份》。freertos官网
《Mastering the FreeRTOS™ Real Time Kernel》
疑问
在成功移植freertos之后,提出了如下疑问?带着疑问学习。
- freertos是实时操作系统,它的实时性从哪里体现,源码中哪里实现,相比于Linux有什么区别?
- 抢占式内核的任务调度,一个任务等待事件发生后,哪一时刻出发任务切换?由谁来完成?
- 任务切换是如何实现的,cortex M3中的任务切换 需要做哪些事?
- freertos 的内存管理,ucheap这个大数组是什么?freertos中的任务栈和堆在哪里分配,怎么分配,之间是什么关系?
参考资料
freertos
《cortex M3 权威指南》
《freertos 开发手册》
公众号:嵌入式软件和硬件