01_FreeRTOS基础知识

目录

裸机与RTOS介绍

裸机与RTOS特点

FreeRtos简介

任务调度简介

抢占式调度

时间片调度

协程式调度

任务状态


裸机与RTOS介绍

假设小明在打游戏,此时女盆友微信回复了信息。

裸机:在裸机上实现是等这游戏打完之后,在去回复女朋友的信息,假设游戏刚刚开始打完需要半小时,那就必须等半小时候才能回复女朋友的信息,此时女朋友会觉得不在乎她,回信息辣么久。

While(1)

{

        打游戏();

        回复信息();

}

RTOS:在RTOS上实现是通过时间片来执行的,内核system定时器中断,获取时间戳,我们可以设置几次中断认为是一个时间片时间,假设1个时间片是1ms,那小明在打游戏1ms游戏的时候,就回去回复信息1ms,不需要回复信息的时候,就继续打游戏。 

Void main(void)

{

        /*创建打游戏任务*/

        xTaskCreate(打游戏);

        /*创建回复信息任务*/

        xTaskCreate(回复信息);

}

Void 游戏(void)

{

        While(1)

        {

                打游戏();

        }

}

Void 回复信息(void)

{

        While(1)

        {

                回复信息();

        }

}

裸机与RTOS特点

裸机:裸机又称为前后台系统,前台系统指的中断服务函数,后台系统指的大循环,即应用程序

1.实时性差(应用程序)轮流执行

2.delay空等待,CPU不执行其他代码

3.结构臃肿实现功能都放在无限循环

01_FreeRTOS基础知识_第1张图片

RTOS:RTOS全称为:Real Time OS,就是实时操作系统,强调的是:实时性

1.分而治之,实现功能划分为多个任务

2.延时函数,任务调度

3.抢占式,高优先级任务抢占低优先级任务

4.任务推栈,每个任务都是有自己的栈空间

注意:中断可以打断任意任务,任务可以同等优先级

01_FreeRTOS基础知识_第2张图片

 

FreeRtos简介

FreeRTOS是一个免费的嵌入式实时操作系统

1.免费开源商业产品使用,无潜在商业风险,无须担心。

2.可裁剪FreeRTOS的核心代码9000+行,包含在3个.c文件中。

3.简单易用,可移植性非常好

4.优先级不限制,任务优先级分配没有限制,多任务可同一优先级

5.任务不限,可创建的实时任务数量没有软件限制

6.抢占/协程/时间片,支持抢占式,协程式,时间片流转任务调度

7.FreeRTOS官网:https://www.freertos.org/

01_FreeRTOS基础知识_第3张图片

 

任务调度简介

调度器就是使用相关的调度算法来决定当前需要执行的哪个任务

FreeRTOS一共支持三种任务调度方式

抢占式调度

抢占式调度:主要是针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务(任务优先级数值越大,优先级越高)

运行条件:

1.创建三个任务: Task1、Task2、Task3

2. Task1、 Task2、 Task3的优先级分别为1、 2、3;在FreeRTos中任务设置的数值越大,优先级越高,所以TASK3的优先级最高。

01_FreeRTOS基础知识_第4张图片

运行过程如下:

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个任务同等优先级

01_FreeRTOS基础知识_第5张图片

运行过程如下:

1.首先Task1运行完一个时间片后,切换至Task2运行

2.Task2运行完一个时间片后,切换至Task3运行

3.Task3运行过程中(还不到一个时间片),Task3阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务Task1

 

总结:1.同等优先级任务,流执行;时间片流转2.一个时间片大小,取决为滴答定时器中断周期3.注意没有用完的时间片不会再使用,下次任务Task3得到执行还是按照一个时间片的时钟节拍运行。

协程式调度

协程式调度:当前执行任务将会一直运行,同时高优先级的任务不会抢占低优先级任务FreeRTOS现在虽然还支持,但是官方已经表示不再更新协程式调度

任务状态

FreeRTOS中任务共存在4种状态

运行态:正在执行的任务,该任务就处于运行态,注意在STM32中,同一时间仅一个任务处于运行态

就绪态:如果该任务已经能够被执行,但当前还未被执行,那么该任务处于就绪态

阻塞态:如果一个任务因延时或等待外部事件发生,那么这个任务就处于阻塞态

挂起态:类似暂停,调用函数 vTaskSuspend() 进入挂起态,需要调用解挂函数vTaskResume()才可以进入就绪态

四种任务状态之间的转换图:

01_FreeRTOS基础知识_第6张图片

 

总结:

1.仅就绪态可转变成运行态。

2.其他状态的任务想运行,必须先转变成就绪态。

3.这四种状态中,除了运行态,其他三种任务状态的任务都有其对应的任务状态列表

4.就绪列表pxReadyTasksLists[x],其中x代表任务优先级数值,在初始化的时候有32个优先级列表0到31,每个优先级下面又可以有多个任务,每次都是把列表优先级最高的任务转为运行态。判断就绪列表用32位的变量表示了32个优先列表是否有任务,当某个位,置一时,代表所对应的优先级就绪列表有任务存在调度器总是在所有处于就绪列表的任务中,选择具有最高优先级的任务来执行相同优先级的任务会连接在同一个就绪列表上,会按顺序执行。

5.阻塞列表pxDelayedTaskList

6.挂起列表xSuspendedTaskList

你可能感兴趣的:(FreeRTOS,单片机,嵌入式硬件,FreeRTOS)