Freertos基本概念----(猫和老鼠)

1.实时操作系统与非实时操作系统的区别

Freertos基本概念----(猫和老鼠)_第1张图片

FreeRTOS中优先级的数值越小,代表该任务的优先级越低,最低优先级为0

解释:哈皮狗的优先级最高 次之是汤姆猫 最后是杰瑞鼠 之后依然用这个例子

Freertos基本概念----(猫和老鼠)_第2张图片
Freertos基本概念----(猫和老鼠)_第3张图片
现在有一块大肥肉,哈皮狗 汤姆猫 杰瑞鼠都想吃 那么谁先吃呢?
杰瑞鼠看到了一块大肥肉(CPU),迫不及待的就去吃,刚吃一口,汤姆猫来了,杰瑞鼠立刻溜之大吉。汤姆猫开始享受美味,汤姆猫吃饱了离开了/汤姆猫被主人叫走离开了,杰瑞鼠才能继续吃这块肉,你要是问我?汤姆猫要是把肉吃完了,,,,,,你走!
在实时操作系统中,低优先级任务1正在执行,高优先级任务2来了,立刻执行高优先级任务2,只有高优先级任务2执行完或者主动挂起了,任务一才能执行。

Freertos基本概念----(猫和老鼠)_第4张图片
Freertos基本概念----(猫和老鼠)_第5张图片
杰瑞鼠正在吃肉,汤姆猫还被主人抱着,只有杰瑞鼠吃饱了或者去睡觉了,这块肉才能让汤姆猫吃,同理,最后才轮到哈皮狗来吃 。

在非实时操作系统中,CPU不能被抢占,就算高优先级任务就绪了,也要等着低优先级任务挂起/执行完才能够得到CPU的使用权。

你自己想想实时操作系统重要不?比如:你正在开车,正在打开窗户,突然间前面是红灯/一辆车,你想踩刹车,但是窗户正在打开,不让执行刹车命令,后果是啥?

2.FreeRTOS操作系统功能

Freertos基本概念----(猫和老鼠)_第6张图片

优先级调度算法:哈皮狗吃完 汤姆猫吃 汤姆猫吃完 杰瑞鼠吃,总是让优先级高的先吃
轮换调度算法:汤姆猫跟杰瑞鼠成为了好朋友,处于同一优先级了。那么肉就可以一起吃

Freertos基本概念----(猫和老鼠)_第7张图片

3.任务调度机制的实现

任务调度机制是嵌入式实时操作系统的一个重要概念,也是其核心技术。对于可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的 CPU使用权,提高了系统的实时响应能力。
解释:哈皮狗来了,汤姆猫你就立刻给我gun。
Freertos基本概念----(猫和老鼠)_第8张图片

4.FreeRTOS 支持的调度方式

抢占式调度时间片调度合作式调度。 实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少。

抢占式调度:每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或遇到阻塞式的 API 函数,比如 vTaskDelay

时间片调度:每个任务都有相同的优先级,任务会运行固定的时间片个数或者遇到阻塞式的 API 函数,比如vTaskDelay,才会执行同优先级任务之间的任务切换。
解释:三个都是朋友了,哈皮狗吃3分钟后,汤姆猫吃2分钟,杰瑞鼠吃1分钟。
Freertos基本概念----(猫和老鼠)_第9张图片

5.什么是调度器?

调度器就是使用相关的调度算法来决定当前需要执行的任务。所有的调度器有一个共同的特性:

1.调度器可以区分就绪态任务和挂起任务(由于延迟,信号量等待,邮箱等待,事件组等待等原因而使得任务被挂起)。
2.调度器可以选择就绪态中的一个任务,然后激活它(通过执行这个任务)。 当前正在执行的任务是运行态的任务
3.不同调度器之间最大的区别就是如何分配就绪态任务间的完成时间。

嵌入式实时操作系统的核心就是调度器和任务切换,调度器的核心就是调度算法。任务切换的实现在不同的嵌入式实时操作系统中区别不大,基本相同的硬件内核架构,任务切换也是相似的。调度算法就有些区别了。
解释:调度器就相当于猫和老鼠中的主人,我让你吃你就吃,让你睡你就睡,就算你正在吃也可以让你离开。
Freertos基本概念----(猫和老鼠)_第10张图片

6.抢占式调度器基本概念

抢占式调度才是Freertos的重中之重。

你想,在抢占式调度的情况下,最高优先级到来了,就立刻执行最高的优先级,总是把最重要的放到第一位。

使用抢占式调度器,使得最高优先级的任务什么时候可以得到 CPU 的控制权并运行是可知的,同时使得任务级响应时间得以最优化。

总结:每个任务都被分配了不同的优先级,抢占式调度器会获得就绪列表中优先级最高的任务,并运行这个任务。
Freertos基本概念----(猫和老鼠)_第11张图片

7.FreeRTOS 抢占式调度器的实现

如果用户在 FreeRTOS 的配置文件 FreeRTOSConfig.h 中禁止使用时间片调度, 那么每个任务必须配置不同的优先级。
Freertos基本概念----(猫和老鼠)_第12张图片
杰瑞鼠开始吃,汤姆猫来了。
杰瑞鼠跑,汤姆猫吃。
汤姆猫吃了一会,糟糕,哈皮狗来了,赶快溜。
哈皮狗吃着,主人叫了一声离开了。
汤姆猫见状,立马飞奔去吃,杰瑞鼠打不过只好看着。
汤姆猫吃着一看哈皮狗来了,跑呀,,,
哈皮狗继续吃。
Freertos基本概念----(猫和老鼠)_第13张图片

官话: 创建 3 个任务 Task1(杰瑞鼠),Task2(汤姆猫) 和 Task3(哈皮狗)。
1 .任务 Task1 在运行中,运行过程中由于 Task2 就绪,在抢占式调度器的作用下任务 Task2 抢占 Task1 的执行。 Task2 进入到运行态,Task1由运行态进入到就绪态。
2 .任务 Task2 在运行中,运行过程中由于 Task3 就绪,在抢占式调度器的作用下任务 Task3 抢占 Task2 的执行。 Task3 进入到运行态,Task2 由运行态进入到就绪态。
3 .任务 Task3 运行过程中调用了阻塞式 API函数,比如 vTaskDelay,任务 Task3 被挂起,在抢占式调度器的作用下查找到下一个要执行的最高优先级任务是 Task2,任务 Task2 由就绪态进入到运行态。
4 . 任务 Task2 在运行中,运行过程中由于 Task3 再次就绪,在抢占式调度器的作用下任务 Task3 抢占 Task2 的执行。 Task3 进入到运行态,Task2 由运行态进入到就绪态。

8.时间片调度器基本概念

时间片调度适合用于不要求任务实时响应的情况,Round-robin 调度算法需要给同优先级的任务分配一个专门的列表,用于记录当前就绪的任务,并为每个任务分配一个时间片(也就是需要运行的时间长度,时间片用完了就进行任务切换)。

在 FreeRTOS 操作系统中只有同优先级任务才会使用时间片调度,另外还需要用户在 FreeRTOSConfig.h 文件中使能宏定义:
#define configUSE_TIME_SLICING 1 默认情况下,此宏定义已经在 FreeRTOS.h 文件里面使能了,用户可以不用在 FreeRTOSConfig.h 文件中再单独使能。

Freertos基本概念----(猫和老鼠)_第14张图片
规定狗猫鼠都只能吃10s
杰瑞鼠吃10s,汤姆猫吃。
汤姆猫吃7s时,主人叫走了。还少吃3s,没办法。
立刻,哈皮狗吃10s。
接着再从杰瑞鼠开始吃。
注意:下一轮吃的时候,汤姆猫没被叫走的话,也是吃10s。
Freertos基本概念----(猫和老鼠)_第15张图片

官话:创建 3 个任务 Task1(杰瑞鼠),Task2(汤姆猫) 和 Task3(哈皮狗)。
每个任务分配的时间片大小是 10个系统时钟节拍。
1.先运行任务 Task1,运行够 10 个系统时钟节拍后,通过时间片调度切换到任务 Task2。
2. 任务 Task2 运行够 7个系统时钟节拍后,调用了阻塞式 API 函数,调用函数时,虽然 10 个系统时钟节拍的时间片大小还没有用完,此时依然会通过时间片调度切换到下一个任务 Task3。(注意,没有用完的时间片不会再使用,下次任务 Task3 得到执行还是按照 10个系统时钟节拍运行)
3. 任务 Task3 运行够 10个系统时钟节拍后,通过时间片调度切换到任务 Task1。

总结:时间片调度和抢占式调度我们一般都是开启了的,这样优先级相同时,使用时间片调度,优先级不同时,使用抢占式调度。默认情况下,在 freertos.h 中使能了时间片调度。而抢占式调度需要我们用户自己开启,一般在 freertosconfig.h 中使能
Freertos基本概念----(猫和老鼠)_第16张图片
Freertos基本概念----(猫和老鼠)_第17张图片

9. 时间管理的实现

Freertos基本概念----(猫和老鼠)_第18张图片
汤姆猫吃到xTickCount=7s时,被叫走了。
汤姆猫离开了xTicksToDelay s,回来了,
此时是xTimeToWake 。
把这个时间记录下来
如果再从新开始吃,
没有溢出:xTimeToWake >xTickCount
发生溢出:xTimeToWake Freertos基本概念----(猫和老鼠)_第19张图片

官话:FreeRTOS 提供的典型时间管理函数是 vTaskDelay(),调用此函数可以实现将任务延时一段特定时间的功能。
FreeRT0S 中,若一个任务要延时 xTicksToDelay 个时钟节拍,系统内核会把当前系统已运行的时钟节拍总数(定义为 xTickCount,32 位长度)加上 xTicksToDelay 得到任务下次唤醒时的时钟节拍数
xTimeToWake。然后,内核把此任务的任务控制块从就绪链表中删除,把 xTimeToWake 作为结点值赋予任务的xItemValue,再根据 xTimeToWake 的值把任务控制块按照顺序插入不同的链表。
若 xTimeToWake >xTickCount,即计算中没有出现溢出,内核把任务控制块插入到 pxDelayedTaskList 链表;
若 xTimeToWak e

10.内存分配策略

每当任务、队列和信号量创建的时候,FreeRTOS 要求分配一定的 RAM。虽然采用 malloc()和 free()函数可以实现申请和释放内存的功能,但这两个函数存在以下缺点:
并不是在所有的嵌入式系统中都可用,要占用不定的程序空间,可有着人性欠缺以及执行时间具有不可确定性等缺点。为此,除了可采用
malloc()和 free()函数外,FreeRTOS 还提供了另外两种内存分配的策略,用户可以根据实际需要选择不同的内存分配策略。

第 1 种方法是,按照需求内存的大小简单地把一大块内存分割为若干小块,每个小块的大小对应于所需求内存的大小。这样做的好处是比较简单,执行时间可严格确定,适用于任务和队列全部创建完毕后再进行内核调度的系统;这样做的缺点是,由于内存不能有效释放,系统运行时应用程序并不能实现删除任务或队列。
Freertos基本概念----(猫和老鼠)_第20张图片
哈皮狗吃的多分的多,汤姆猫中等就次之,杰瑞鼠吃的少就分的少,正好对应各自的需求。

第 2 种方法是,采用链表分配内存,可实现动态的创建、删除任务或队列。系统根据空闲内存块的大小按从小到大的顺序组织空闲内存链表。当应用程序申请一块内存时,系统根据申请内存的大小按顺序搜索空闲内存链表,找到满足申请内存要求的最小空闲内存块。为了提高内存的使用效率,在空闲内存块比申请内存大的情况下,系统会把此空闲内存块一分为二。一块用于满足申请内存的要求,一块作为新的空闲内存块插入到链表中。
Freertos基本概念----(猫和老鼠)_第21张图片
比如:一块肉30斤,分了3份。5斤,10斤,15斤
汤姆猫的饭量是8斤。所以分给汤姆猫的是10斤肉,
但是还有两斤吃不完,那就当作了空闲的肉。

总结:

参考:微信公众号 “硬件十万个为什么”
欢迎指正!
Freertos基本概念----(猫和老鼠)_第22张图片

你可能感兴趣的:(FreeRTOS,操作系统,freertos,单片机)