2020,重新学习一遍FreeRTOS收益良多,比前两年学习时更能体会FreeRTOS代码的优缺点。
FreeRTOS 于 2018 年被亚马逊收购, 改名为 AWS FreeRTOS,版本号升级为 V10。V10 版本相比于 V9 就是加入了一
些物联网相关的组件,内核基本不变。 亚马逊收购 FreeRTOS 也是为了进军眼下炒的火热的物联网和人工智能。
下载以往版本的可从托管网址: https://sourceforge.net/projects/freertos/files/FreeRTOS/
在 FreeRTOS 中, 使用的数据类型虽然都是标准 C 里面的数据类型,但是针对不同的处理器,对标准 C 的数据类型又进行了重定义。这些数据类型重定义在 portmacro.h 这个头文件中。
FreeRTOS文件定义变量会将变量类型当作前缀放在变量名上。常见类型前缀有:
采用“返回值类型+所在文件名+自定义”,如:vSemaphoreCreateBinary()函数的返回值为 void 型, 在 semphr.h 这个文件中定义。注:私有函数前缀“prv”
格式:小写前缀(该宏所在头文件定义)+大写命名
特殊通用宏:
注:任务之所以是独立互不干扰的,主要是因为每个任务都分配了独立的栈空间。
关于中断保护嵌套,即利用中断返回值,实现逐级恢复退出;
阻塞延时是利用Systick定时器计时。任务进入阻塞延时,是从就绪链表退出,进入延时链表,同时取消其在优先级的位置。
在 FreeRTOS 中,数字优先级越小,逻辑优先级也越小,这与RT-Thread 和 μC/OS 刚好相反。
优先级有两种方式:
1.通用方式:不限优先级,uxTopReadyPriority 是一个在 task.c 中定义的静态变量, 用于表示创建的任务的最高
优先级,
2.前导零的指令CLZ:Cprtex-M有指令,更高效,但优先级限制在32位
所谓时间片就是同一个优先级下可以有多个任务,每个任务轮流地享有相同的 CPU 时间, 享有 CPU 的
时间我们叫时间片。(每个优先级下还有链表挂着任务)
共有四种状态:就绪态、阻塞态、运行态、挂起态(vTaskSuspend())
用于任务之间同步或临界资源的互斥访问,有阻塞任务功能。
代码位于semphr.h,基于Queue,主要函数接口:
1、创建信号量
xSemaphoreCreateBinary()
xSemaphoreCreateCounting ()
2、删除信号量
vSemaphoreDelete()
3、信号量释放
xSemaphoreGive()(任务)
xSemaphoreGiveFromISR()(中断)
4、信号量获取函数
xSemaphoreTake()(任务)
xSemaphoreTakeFromISR()(中断)
一个任务可以等待多个事件的发生:可以是任意一个事件发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件处理。同样,也可以是多个任务同步多个事件。
事件只与任务相关联,事件相互独立,一个 32 位的事件集合(EventBits_t 类型的变量, 实际可用与表示事件的只有 24 位),用于标识该任务发生的事件类型,其中每一位表示一种事件类型(0 表示该事件类型未发生、 1 表示该事件类型已经发生),一共 24 种事件类型。
见《FreeRTOS学习笔记NO2》