0,freeRTOS基础知识
freeRTOS基础知识
注:本文为正点原子“手把手教你freeRTOS系统”视频的总结文字。
1.裸机与RTOS对比
裸机也称前后台系统,前台系统指的是终端服务函数,后台系统指的是while(1)大循环。
特点:
实时性差,只有一个while(1)进行轮询循环。
delay函数空等待,不能做其他任务。
所有功能都放在一个无限循环函数中。
RTOS(Real Time OS,实时操作系统),对比裸机更强调其实时性,以及CPU资源的使用效率。
特点:
将功能划分为多个任务,每个任务以时间片为最小时间单位,交替运行,宏观上而看作多个任务同步运行。
具有独特的延时函数,不会让函数空等待,而是把CPU资源让出给其他任务使用。
任务分高优先级-低优先级,高优先级任务会抢占低优先级任务。多个任务可以挂载在同一个优先级下。
每个任务都有自己的栈空间,用于保存局部变量和任务上下文信息。
中断不属于软件优先级划分内容,属于硬件中断,可以打断所有优先级的任务。
高优先级的任务不可以一直运行,否则会一直抢占CPU资源,使得低优先级任务无法运行。
2.freeRTOS特点
RTOS有很多,如分别为μClinux、μC/OS-II、eCos、FreeRTOS、mbed OS、RTX、Vxworks、QNX、NuttX,而国产的嵌入式操作系统包括都江堰操作系统(djyos)、Alios Things、Huawei LiteOS、RT-Thread、SylixOS。相对于C/OS-II、 embOS等商业操作系统,FreeRTOS操作系统是完全免费的操作系统,具有源码公开、可移植、可裁减、调度策略灵活的特点,可以方便地移植到各种单片机上运行,其最新版本为6.0版。作为一个轻量级的操作系统,FreeRTOS提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS内核支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,CPU总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享CPU的使用时间。
FreeRTOS的不足:
相对于常见的μC/OS—II操作系统,FreeRTOS操作系统既有优点也存在不足。其不足之处, 一方面体现在系统的服务功能上,如FreeRTOS只提供了消息队列和信号量的实现,无法以后进先出的顺序向消息队列发送消息;另一方 面,FreeRTOS只是一个操作系统内核,需外扩第三方的GUI(图形用户界面)、TCP/IP协议栈、FS(文件系统)等才能实现一个较复杂的系统, 不像μC/OS-II可以和μC/GUI、μC/FS、μC/TCP-IP等无缝结合。
选择freeRTOS的原因:
免费开源,无需担心商业风险。
核心代码量小,最核心的freeRTOS代码仅有9000行左右,并且支持裁剪。
简单易用,可以移植性好。
支持抢占式、携程式、时间片流转任务调度
3.freeRTOS的任务
3.1任务调度
调度器即使用相关调度算法来决定当前需要执行哪个任务。
调度方式 | 适用情况 | 说明 | 备注 |
---|---|---|---|
抢占式调度 | 优先级不同 | 优先级高的任务抢占优先级低的任务 | 数字大优先级高 |
时间片调度 | 优先级相同 | 多个优先级相同的任务同时运行 | 多任务轮询 |
协程式调度 | 优先级不同 | 当前执行任务已知运行,但高优先级任务不会抢占低优先级 | 实时性较差 |
注:协程式调度官方已不更新。
抢占式调度:
低优先级切换低高先级(条件):低优先级任务运行,高优先级任务就绪(非阻塞)就会抢占低优先级的运行。
高优先级切换低优先级(条件):高优先级任务阻塞状态(系统延时或等待信号量等),切换为低优先级任务(此时优先级次高的任务)运行。
时间片调度:
相同优先级的任务轮流使用CPU时间(时间片),在freeRTOS中一个时间片即SysTick(滴答定时器)中断周期。
如果Task3在运行时突然进入阻塞状态(系统延时或等待信号量等),则直接切换为Task1进行(不论此时Task3时间片进行的时间,全部丢掉,没有用完的时间片不会再使用)。
3.2任务状态
freeRTOS任务的四种状态:
-
运行态:正在执行的任务就处于运行态,对于单核CPU同一时间仅有一个任务处于运行态。
-
就绪态:该任务能够被执行,但当前还未被执行,那么该状态处于就绪态。
-
阻塞态:由于任务延时/等待外部事件发生,那么此任务处于阻塞态。
-
挂起态:类似暂停,调用函数vTasSuspend()进入挂起态,需要用解挂函数vTasResume()才可以进入就绪态。
任务的四种状态转换要点: -
仅就绪态可转为运行态。
-
其他状态想运行必须先转变为就绪态。
3.3任务状态列表
- 运行态:运行态无列表。
- 就绪态:就绪列表。pxReadyTasksLists[x],其中x代表任务优先级数值(0-31,数字大的优先级高)。
- 阻塞态:阻塞列表。pxDelayedTasksLists[x]。
- 挂起态:挂起列表。pxSuspendedTasksLists[x]。
特点:
任务调度器总在就绪列表中移动。
任务想运行,需要将列表转为就绪态,然后根据就序列表从高优先级到低优先级执行。
相同优先级的任务会连接到同一个就绪列表位中。