FreeRTOS
裸机
不带任何操作系统
只能先打完游戏回复信息
- 实时性差,程序轮流执行
- delay空等待,CPU不执行其他代码
- 结构臃肿,实现功能都在while循环
RTOS
实时操作系统
会执行打游戏一个时间片再回复信息一个时间片交替执行
在宏观下人类不能发现切换
- 分而治之,实现功能划分为多个任务
- 延时函数,任务调度
- 抢占式,高优先级任务抢占低优先级任务
- 任务堆栈,每个任务都有自己的栈空间
- 中断可以打断任意任务
- 任务的优先级是软件实现,中断优先级是内核实现
- 任务之间可以同等优先级
FreeRTOS
FreeRTOS是一个免费的嵌入式实时操作系统
- 免费开源
- 可裁剪
- 简单易用,可移植性非常好
- 优先级不限,多任务可同一优先级
- 可创建的实时任务数量没有软件限制
- 支持抢占,协程、时间片流转任务调度
核心文件
调度方式
抢占式调度
每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务
- 数值越大优先级越高
- 高优先级的任务优先执行
- 高优先级的任务不停止,低优先级的任务就无法执行
- 被抢占的任务将会进入就绪态
时间片调度
主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务
同等优先级任务轮流享有相同的CPU时间,叫做时间片,再freertos中,一个时间片就是SysTick中断周期
- 同等优先级任务,轮流执行,时间片流转
- 一个时间片大小,取决为滴答定时器中断周期
- 没有用完的时间片不会再使用,下次任务还是按照一个时间片的时钟节拍运行
协程式调度
当前正在执行任务会一直运行,不能被抢占,适合RAM比较小的MCU
任务的状态
- 仅有就绪态可以转变成运行态
- 优先级高的就绪态的任务先运行
- 其他的状态的任务想运行必须先变成就绪态
状态列表
除了运行态,都有任务列表,类似于链表
运行态,都有任务列表,类似于链表
-
就绪列表 pxReadyTasksLists[x],其中x代表任务优先级数值
-
阻塞列表 pxDelayTasksLists[x]
-
挂起列表 xSuspendedTasksLists[x]