FreeRTOS 是一款 “开源免费”的实时操作系统,遵循的是 GPLv2+的许可协议。这里说 到的开源,指的是你可以免费得获取到 FreeRTOS 的源代码,且当你的产品使用了 FreeRTOS 且没有修改 FreeRTOS 内核源码的时候,你的产品的全部代码都可以闭源,不用开源,但是当 你修改了 FreeRTOS 内核源码的时候,就必须将修改的这部分开源,反馈给社区,其它应用部 分不用开源。免费的意思是无论你是个人还是公司,都可以免费地使用,不需要掏一分钱。
FreeRTOS框架
FreeRTOS框架介绍
一. 任务
1. 基本属性
1.1 优先级
每个任务分配一个从
0~configMAX_PRIORITIES-1
的优先级,优先级的数字越低表示任务的优先级越低。
- 1.高优先级抢占低优先级:
当一个任务A正在运行,另外一个任务B(优先级高于A)阻塞时间到或者事件触发处于就绪态,那么B会从A那抢占处理器,B开始运行,A停止运行;- 2.时间片轮转:
当宏configUSE_TIME_SLICING
定义为1 的时候多个任务可以共用一个优先级,数量不限。此时处于就绪态的优先级相同的任务就会使用时间片轮转调度器获取运行时间。
FreeRTOS 调度器确保处于就绪态或运行态的高优先级的任务获取处理器使用权,换句话说就是处于就绪态的最高优先级的任务才会运行。
1.2 任务控制块/任务堆栈
- 1.任务控制块:
FreeRTOS的每个任务都有一些属性需要存储,FreeRTOS把这些属性集合到一起用一个结构体来表示,这个结构体叫做任务控制块。
属性:任务名字,优先级,任务堆栈大小,任务句柄等。- 2.任务堆栈:
FreeRTOS之所以能正确的恢复一个任务的运行就是因为有任务堆栈在保驾护航,任务调度器在进行任务切换的时候会将当前任务的现场 (CPU寄存器值等 )保存在此任务的任务堆栈中,等到此任务下次运行的时候就会先用堆栈中保存的值来恢复现场 ,恢复现场以后任务就会接着从上次中断的地方开始运行。
2. 状态
- 1.运行态:
当一个任务正在运行时,那么就说这个任务处于运行态, 处于运行态的任务就是当前正在使用处理器的任务。 如果使用的是核处理器的话那么不管在任何时刻永远都只有一个任务处于运行态。- 2.非运行态:
- 就绪态:
处于就绪态的任务是那些已经准备就绪(这些任务没有被阻塞或者挂起 可以运行的任务,但是处于就绪态的任务还没有运行,因为有一个同优先级或者更高优先级的任务正在运行!- 阻塞态:
- 如果一个任务当前正在等待某个外部事件的话就说它处于阻塞态,比如说如果某个任务调用了函数
vTaskDelay()
的话就会进入阻塞态, 直到延时周期完成。- 任务在等待队列、信号量、事件组、通知或互斥信号量的时候也会进入阻塞态 。任务进入阻塞态会有一个超时时间,当超过这个超时时间任务就会退出阻塞态,即使所等待的事件还没有来临!
- 挂起态:
像阻塞态一样,任务进入挂起态以后也不能被调度器调用进入运行态,但是进入挂起态的任务没有超时时间。任务进入和退出挂起态通过调用函数vTaskSuspend()
和xTaskResume()
3. 操作
创建相对于删除;挂起相对于恢复
二. 机制
1. 队列
- 所有的通信和同步机制都是基于队列实现的
- 队列不但可以传递数组,也可以传递结构体
2. 信号量
信号量是深度为1的队列。
3. 任务通知
任务通知来代替信号量、消息队列、事件标志组等这些东西。使用任务通知的话效率会更高。
4. 低功耗
4.1. 低功耗模式:
- sleep:睡眠
- stop:停止
- standby:待机
4.2.空闲任务的钩子函数实现的低功耗
- 1.钩子函数
通过空闲任务钩子函数(或称回调,hook, or call-back),可以直接在空闲任务中添加应用程序相关的功能。空闲任务钩子函数会被空闲任务每循环一次就自动调用一次。通常空闲任务钩子函数被用于:
- 执行低优先级,后台或需要不停处理的功能代码。
- 测试处系统处理裕量(空闲任务只会在所有其它任务都不运行时才有机会执行,所
以测量出空闲任务占用的处理时间就可以清楚的知道系统有多少富余的处理时
间)。- 将处理器配置到低功耗模式——提供一种自动省电方法,使得在没有任何应用功能
需要处理的时候,系统自动进入省电模式。
- 2.将处理器设置为低功耗模式
FreeRTOS是通过在处理器处理空闲任务的时候将处理器设置为低功耗模式来降低能耗。一般会在空闲任务的钩子函数中执行低功耗相关处理,比如设置处理器进入低功耗模式(上面4.1提到的三种方式)、关闭其他外设时钟、降低系统主频等等。
4.2. Tickless 模式
FreeRTOS系统提供的低功耗模式,当处理器进入空闲任务周期以后就关闭系统节拍中断(滴答定时器中断),只有当其他中断发生或者其他任务需要处理的时侯处理器才会从低功耗模式中唤醒。
5. 内存管理列表和列表项
列表是FreeRTOS 中的一个数据结构,概念上和链表有点类似,列表被用来跟踪FreeRTOS中的任务。
6. 内存管理
内存管理是一个系统基本组成部分,FreeRTOS中大量使用到了内存管理,比如创建任务、信号量、队列等会自动从堆中申请内存。用户应用层代码也可以 FreeRTOS提供的内存管理函数来申请和释放内存。
三. API函数
FreeRTOS API函数及应用详情请阅读下面章节
第零章:ESP32应用程序的启动流程
第一章:任务创建、删除、延时
第二章:任务优先级
第三章:任务状态
第四章:显示任务详细信息
第五章:查看任务堆栈空间
第六章:队列
第七章:软件定时器
第八章:二值信号量
第九章:计数型信号量
第十章:互斥信号量
第十一章:递归互斥量
第十二章:事件标志组
…
基于 Michael_ee 老师学习 ESP32_FreeRTOS