一、裸机与RTOS
我们使用的32板子是裸机,又称前后台系统。裸机有如下缺点:
1、实时性差。只能一步一步执行任务,比如在一个while循环中,要想执行上一个任务,就必须把下面的任务执行完,循环一遍后才能执行这个任务;
2、浪费资源。在程序delay延时的时候会进入空等待,此时CPU不执行其他代码;
3、结构臃肿。实现的功能都放在无限循环中。
但RTOS(Real Time OS),实时操作系统就可以解决这些问题。RTOS有以下特点:
1、分而治之。实现的功能可以划分为多个任务;
2、任务调度。在延时函数时,不会进入空等待,而是让CPU执行其他任务;
3、抢占式。高优先级的任务可以抢占低优先级的任务;
4、任务堆栈。每个任务都有自己的栈空间,用于保存局部变量以及任务的上下文信息。
注意:中断可以打断任意任务;任务可以同等优先级。
二、任务调度
1、任务调度器
使用相关的调度算法来决定当前需要执行的任务
2、调度方式
①抢占式调度:
主要针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务先执行,高优先级的任务可以抢占低优先级的任务;
注意:
高优先级的任务优先执行;
高优先级的任务不停止,低优先级的任务无法执行;
被抢占的任务将进入就绪态
②时间片调度:
主要针对优先级相同的任务,优先级任务相同的时候,任务调度器在每一个系统时钟节拍到的时候切换任务,即每一个任务执行一个滴答定时器中断周期的时间,然后执行别的任务;
注意:
同等优先级任务会轮流执行,时间片流转;
一个时间片大小取决于滴答定时器中断频率;
如果任务被中途打断或阻塞,没有用完的时间片不会再次使用,而是直接跳过。
③协程式调度(了解即可):
一个任务执行完后才能执行另一个任务,且不能被抢占。
三、任务状态
1、FreeRTOS的任务状态
①运行态:即正在执行的任务,STM32中,同一时间只有一个任务处于运行态;
②就绪态:任务已经能够被执行但还未执行;
③阻塞态:任务因延时或等待外部事件发生;
④挂起态:类似暂停,调用vTaskSuspend()进入挂起态,调用vTaskResume()解挂函数解除挂起态。
注意:
①:挂起态解除后会进入就绪态;
②:仅就绪态才可以转变为运行态;
③:其他状态想要运行,必须先转变为就绪态。
2、状态之间的转换
四、状态列表
这四种状态中,除了运行态,其他三种任务状态都有对应的任务状态列表:就绪列表(pxReadyTasksList[x]);阻塞列表(pxDelayedTaskList[x]);挂起列表(xSuspendedTaskList[x])其中x代表任务优先级数值,为0~31。
而任务调度器总是在所有处于就绪列表的任务中,选择优先级最高的任务来执行,如果优先级相同,就使用时间片调度,“同时”执行同一优先级的任务。