FreeRTOS官方指导文档阅读笔记
基于 161204_Mastering_the_FreeRTOS_Real_Time_Kernel-A_Hands-On_Tutorial_Guide.pdf,可以从FreeRTOS官网下载
本笔记是即时的,一边阅读一边做笔记。它既包含重要的内容和阅读过程中产生的疑问,不包含完整的知识梳理。参考FreeRTOS官网
pdf版本说明
This is the 161204 copy which does not yet cover FreeRTOS V9.0.0, FreeRTOS V10.0.0, or
low power tick-less operation. Check http://www.FreeRTOS.org regularly for additional
documentation and updates to this book. See http://www.FreeRTOS.org/FreeRTOS-V9.html
for information on FreeRTOS V9.x.x. See https://www.freertos.org/FreeRTOS-V10.html for
information on FreeRTOS V10.x.x. Applications created using FreeRTOS V9.x.x onwards can
allocate all kernel objects statically at compile time, removing the need to include a heap
memory manager.
序言
不知道为何,现在我读书都喜欢先看看序言,它能让我对一本书有大致的了解,明白能从书中获得哪些知识,以及让我快速地订制读书计划。
FreeRTOS基本介绍
FreeRTOS以任务(Task)为单位,当系统空闲时,也自动调度空闲任务idle task。idle task会进行一些后台系统动作,诸如处理能力计算、后台检查或者将处理器置于低功耗模式。
电源管理方面,freeRTOS还有一个tick-less模式。这个模式比正常的低功耗模式拥有更低的电量消耗,而且低功耗的时间持续更长。
更灵活的中断处理,freeRTOS允许将中断处理服务例程延迟在开发者编写的task application中运行,或者在freeRTOS的后台程序中运行。
多任务处理,混合多任务处理。通过简单的设计就可以让一个持续的、循环的、事件驱动的处理过程在一个application中实现。另外,硬实时和软实时的实现是可以通过选择适当的任何和优先级。
所谓硬实时就是100%满足实时要求,软实时就是基本上满足实时性。当我们将一个要求硬实时的任务的优先级设置为最高级时,那么可以认为这个的确是一个硬实时实现。
FreeRTOS Features
列举几个比较关心的feature
- 非常灵活的任务优先级控制
- 非常灵活的轻量级的任务通知机制
- 队列
- 二进制和计数信号量
- 互斥与递归互斥
- 软定时器
- 事件组
- 钩子函数
- idle hook function
- 栈溢出检查
- 跟踪记录
- 任务运行时统计信息收集
- 通过软件进行管理的中断堆栈
基本都列出来,我发觉都挺有用的,也许是带着项目的心在阅读,与平时的学习还是不大一样。
开发实验平台
开发实验平台很多,比如可以选择所支持的一种SOC进行(STM32),也可以选择使用Windows模拟器。
windows模拟器相关,参考 http://www.microsoft.com/express ,它不提供实时性。
FreeRTOS源码及工程概览
本章的目的是熟悉freeRTOS的源码结构和Demo,以及熟悉创建一个freeRTOS工程所需要的基本知识。
理解FreeRTOS
FreeRTOS port
FreeRTOS支持20多种编译器,并支持超过3种架构的处理器(比如 ARM就是一种处理器架构)。每一种支持的编译器或者处理器都被称作FreeRTOS的一个port,比如GCC-ARM编译器就是一个port,STM32也是一个port,一个是编译器,另一个则是处理器。
编译
FreeRTOS包含通用代码和port特定代码,每一个port都有对应的demo,而且这些demo都是开箱即用的,无需任何修改就可以编译通过。
FreeRTOSConfig.h
这是一个独立的配置头文件,可以选择性的开启或者关闭一个功能,比如选择某种系统调度策略。它应当放置在application目录下,而不是FreeRTOS系统源码目录。也就是,每一个demo中有一个FreeRTOSConfig.h。
FreeRTOS通用文件
必选文件:
tasks.c, and list.c
可选文件:
- queue.c
包含queue和semaphore(信号量) - timers.c
软件时钟,如果application确切使用时钟,则必须加入编译 - event_groups.c
事件组,如果确切使用,则必须加入编译 - croutine.c
特别针对小型微控制器
FreeRTOS特定port文件
保存在FreeRTOS/Source/portable目录,内部存在一定的等级关系,编译器是上一级目录,处理器则是下一级目录。
三个目录/文件必须添加到编译器 include path中,包括:
- FreeRTOS/Source/include
- FreeRTOS/Source/portable/[compiler]/[architecture]
- FreeRTOSConfig.h
FreeRTOS头文件引用
要使用FreeRTOS API,必须包含FreeRTOS.h,然后就是根据具体的需要加入‘task.h’, ‘queue.h’, ‘semphr.h’, ‘timers.h’ or ‘event_groups.h’。
关于Demo与工程创建
FreeRTOS是基于Windows进行开发和编译的,所以,当demo在linux上进行编译的时候,可能会出现一些莫名其妙的警告信息。
参考Demo有很多好处,最基本的就是演示了FreeRTOS工程如何构建,需要添加哪些头文件。还能达到开箱即用的目的,给出了FreeRTOS API的调用样例。
该章节还介绍了如何基于一个Demo创建一个工程,以及如何从零创建一个工程。基于Demo创建就比较简单,而从零创建,则应当先让工程正常编译,而且可以"裸奔"的之后,再加入FreeRTOS支持。
对于V8.x的版本,heap_n.c需要开发者自己添加,n表示不同的动态内存管理策略。
从V9.0.0开始,heap_n.c不需要额外选择添加,而是通过FreeRTOSConfig.h文件进行配置,决定是否开启动态内存管理功能。由此可见,V9.x之后,内存管理策略已经可以通用,无需开发者选择。
数据类型与FreeRTOS的编码风格
在微处理器上,数据类型往往不能通用,需要用户自定义两个数据类型;FreeRTOS的编码风格决定了FreeRTOS的API看上去是怎样的,都代表了什么意思,熟悉它,有助于阅读源码以及开发。
数据类型
每一个port都有一个独立的portmacro.h,里面定义了两种数据类型。
- TickType_t
Tick表示一个系统滴答。一个系统滴答来自一个周期性的系统中断,叫Tick中断,两个Tick中断之间的时间就是一个滴答周期。而从系统启动到当前所经历的滴答周期叫滴答数,即Tick count。TickType_t就是保存这个Tick count的数据类型。TickType_t的位宽依赖于配置configUSE_16_BIT_TICKS(0/1),可以是无符号16-bit或者无符号32-bit。以1ms作为一个滴答周期,32-bit的TickType_t可以用8年,10ms则可以用80年,才会溢出。 - BaseType_t
基本的数据类型,默认与处理器的位宽等同。由于它非常影响系统性能和使用效率,没有特殊需要不应当修改。
FreeRTOS在使用char时,必定明确指明了有符号还是无符号,而不是默认由编译器决定,因为每个编译器对char的默认处理不尽相同。
变量名称
FreeRTOS在变量名称前面加上前缀的方式表示变量属于什么类型,这仅仅是一个参考前缀,使得代码更加易于阅读。
‘c’ for char, ‘s’ for int16_t (short), ‘l’ int32_t (long), and ‘x’
for BaseType_t and any other non-standard types.
函数名称
格式:前缀 + 所属文件名 + 函数功能
举例:xQueueReceive() returns a variable of type BaseType_t and is defined within queue.c.
内存管理
FreeRTOS拥有5种内存管理方式,FreeRTOS V9.x 之后支持静态分配也可以在运行时动态分配。这里仅仅熟悉V8版本的内存管理方式,如有需要,可以参考官网关于V9 V10的更新内容。
FreeRTOS的内存对象