目录
裸机与RTOS介绍
裸机与RTOS特点
FreeRtos简介
任务调度简介
抢占式调度
时间片调度
协程式调度
任务状态
假设小明在打游戏,此时女盆友微信回复了信息。
裸机:在裸机上实现是等这游戏打完之后,在去回复女朋友的信息,假设游戏刚刚开始打完需要半小时,那就必须等半小时候才能回复女朋友的信息,此时女朋友会觉得不在乎她,回信息辣么久。
While(1)
{
打游戏();
回复信息();
}
RTOS:在RTOS上实现是通过时间片来执行的,内核system定时器中断,获取时间戳,我们可以设置几次中断认为是一个时间片时间,假设1个时间片是1ms,那小明在打游戏1ms游戏的时候,就回去回复信息1ms,不需要回复信息的时候,就继续打游戏。
Void main(void)
{
/*创建打游戏任务*/
xTaskCreate(打游戏);
/*创建回复信息任务*/
xTaskCreate(回复信息);
}
Void 游戏(void)
{
While(1)
{
打游戏();
}
}
Void 回复信息(void)
{
While(1)
{
回复信息();
}
}
裸机:裸机又称为前后台系统,前台系统指的中断服务函数,后台系统指的大循环,即应用程序。
1.实时性差(应用程序)轮流执行
2.delay空等待,CPU不执行其他代码
3.结构臃肿实现功能都放在无限循环
RTOS:RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性。
1.分而治之,实现功能划分为多个任务
2.延时函数,任务调度
3.抢占式,高优先级任务抢占低优先级任务
4.任务推栈,每个任务都是有自己的栈空间
注意:中断可以打断任意任务,任务可以同等优先级
FreeRTOS是一个免费的嵌入式实时操作系统
1.免费开源商业产品使用,无潜在商业风险,无须担心。
2.可裁剪FreeRTOS的核心代码9000+行,包含在3个.c文件中。
3.简单易用,可移植性非常好
4.优先级不限制,任务优先级分配没有限制,多任务可同一优先级
5.任务不限,可创建的实时任务数量没有软件限制
6.抢占/协程/时间片,支持抢占式,协程式,时间片流转任务调度
7.FreeRTOS官网:https://www.freertos.org/
调度器就是使用相关的调度算法来决定当前需要执行的哪个任务
FreeRTOS一共支持三种任务调度方式
抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务(任务优先级数值越大,优先级越高)。
运行条件:
1.创建三个任务: Task1、Task2、Task3
2. Task1、 Task2、 Task3的优先级分别为1、 2、3;在FreeRTos中任务设置的数值越大,优先级越高,所以TASK3的优先级最高。
运行过程如下:
1.首先Task1在运行中,在这个过程中ask2就绪了,在抢占式调度器的作用下Task2会抢占Task1的运行。
2.Task2运行过程中,Task3就绪了,在抢占式调度器的作用下Task3会抢占Task2的运行。
3.Task3运行过程中,Task3阻塞了(系统延时或等待信号量等),此时就绪态中,优先级最高的任务Task2执行。
4.Task3阻塞解除了(延时到了或者接收到信号量),此时Task3恢复到就绪态中,抢占TasK2的运行。
总结1.高优先级任务,优先执行。2.高优先级任务不停止,低优先级任务无法执行。3.被抢占的任务将会进入就绪态。
时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务。同等优先级任务轮流地享有相同的CPU时间(可设置),叫时间片,在FreeRTOS中,一个时间片就等于SysTick中断周期。
运行条件:
1.创建三个任务: Task1、 Task2、 Task3
2.Task1、Task2、Task3的优先级均为1; 即3个任务同等优先级
运行过程如下:
1.首先Task1运行完一个时间片后,切换至Task2运行。
2.Task2运行完一个时间片后,切换至Task3运行。
3.Task3运行过程中(还不到一个时间片),Task3阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务Task1。
总结:1.同等优先级任务,流执行;时间片流转。2.一个时间片大小,取决为滴答定时器中断周期。3.注意没有用完的时间片不会再使用,下次任务Task3得到执行还是按照一个时间片的时钟节拍运行。
协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务FreeRTOS现在虽然还支持,但是官方已经表示不再更新协程式调度
FreeRTOS中任务共存在4种状态
运行态:正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态。
就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态。
阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态。
挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态。
四种任务状态之间的转换图:
总结:
1.仅就绪态可转变成运行态。
2.其他状态的任务想运行,必须先转变成就绪态。
3.这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表。
4.就绪列表pxReadyTasksLists[x],其中x代表任务优先级数值,在初始化的时候有32个优先级列表0到31,每个优先级下面又可以有多个任务,每次都是把列表优先级最高的任务转为运行态。判断就绪列表用32位的变量表示了32个优先列表是否有任务,当某个位,置一时,代表所对应的优先级就绪列表有任务存在。调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行。相同优先级的任务会连接在同一个就绪列表上,会按顺序执行。
5.阻塞列表pxDelayedTaskList
6.挂起列表xSuspendedTaskList