二、FreeRTOS——任务管理
1 任务状态
-
正在运行的任务,被称为”正在使用处理器”,它处于运行状态。在单处理系统中,任何时间里只能有一个任务处于运行状态。
-
非运行状态的任务,它处于这3中状态之一:阻塞(Blocked)、暂停(Suspended)、就绪(Ready)。
-
就绪态(Ready)的任务,可以被调度器挑选出来切换为运行状态,调度器永远都是挑选最高优先级的就绪态任务并让它进入运行状态。
-
阻塞状态的任务,它在等待”事件”,当事件发生时任务就会进入就绪状态。事件分为两类:时间相关的事件、同步事件。所谓时间相关的事件,就是设置超时时间:在指定时间内阻塞,时间到了就进入就绪状态。使用时间相关的事件,可以实现周期性的功能、可以实现超时功能。同步事件就是:某个任务在等待某些信息,别的任务或者中断服务程序会给它发送信息。怎么”发送信息”?方法很多,有:任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)等。这些方法用来发送同步信息,比如表示某个外设得到了数据。
-
2 任务调度
FreeRTOS操作系统支持三种调度方式:
-
抢占式调度(Pre-emptive)
-
时间片调度(time slice)
-
合作式调度(co-operative)
实际应用主要是抢占式调度和时间片调度结合的调度方法,合作式调度用到的很少。通过在 FreeRTOSConfig.h
中设置以下宏定义,从而实现调度方式的设定。
-
configUSE_PREEMPTION:可否抢占?高优先级的任务能否优先执行
-
configUSE_TIME_SLICING:可抢占的前提下,同优先级的任务是否轮流执行
-
configUSE_TICKLESS_IDLE:用于关闭Tick中断来实现省电
-
configIDLE_SHOULD_YIELD:在”可抢占”+”时间片轮转”的前提下,进一步细化:空闲任务是否让步于用户任务
2.1 抢占式调度(Pre-emptive)
configUSE_PREEMPTION:配置为 1 则说明支持抢占式调度,否则称之为协作式调度;
CPU总是运行多个任务中优先级别最高的那个任务,即使CPU正在运行某个低级别的任务,当有更高优先级别的任务准备就绪时,更高优先级别的任务就会剥夺正在运行任务的CPU使用权,从而使自己获得CPU的使用权。
2.2 合作式调度(co-operative)
configUSE_PREEMPTION:配置为 0,合作式调度不能使用时间切片
使用合作调度器时,只有在Running状态任务进入Blocked状态,或者Running状态任务通过调用taskYIELD()显式让步(手动请求重新调度)时才会发生任务切换。 任务永远不会被抢占,因此不能使用时间切片。
虚线表示任务处于就绪状态
task 1 具有最高优先级。 它以阻塞状态开始,等待信号量。在时间 t3 一个中断给出信号量,导致任务 1 离开阻塞状态并进入就绪状态。但是在co-operative调度模式下task1并不会立即执行,因为task3还在占用调度器。
task 2:在时间 t2 task2 是最高优先级的就绪状态任务,但由于是co-operative调度模式,task2并不会立即执行,除非task3进入阻塞状态或者调用taskYIELD()。在T4,task3调用taskYIELD()让出调度器,但此时task 1 是最高优先级的就绪状态任务,所以任务 2 并没有真正执行,直到任task1 在 t5 重新进入阻塞状态。
2.3 时间片调度(time slice)
configUSE_TIME_SLICING:配置为 1
在FreeRTOS操作系统中只有同优先级任务才会使用时间片调度。最常用的的时间片调度算法就是Round-robin调度算法(时间片轮转),freertos就是用的该算法。一个时间片等于freertos中滴答定时器的时间间隔。
上图中任务优先级:
Task1 = Task2 = Task3 = Task4
先运行Task1,运行够一个时间片后,通过时间片调度切换到Task2。Task2 运行够一个时间片后,通过时间片调度切换到Task3。
Task3 在运行期间调用了阻塞式 API 函数,虽然一个时间片还没有用完,此时依然会通过时间片调度切换到下一个任务 Task4。 (注意,没有用完的时间片不会再使用,下次任务 Task3 得到执行还是按照 一个时间片运行),任务 Task4 运行够一个时间片后,通过时间片调度切换到任务 Task1。
https://shequ.stmicroelectronics.cn/thread-634308-1-1.html
https://www.freertos.org/zh-cn-cmn-s/Documentation/01-FreeRTOS-quick-start/01-Beginners-guide/01-RTOS-fundamentals
https://blog.csdn.net/weixin_46461874/article/details/137887346
https://blog.csdn.net/weixin_46461874/article/details/128447675
https://blog.csdn.net/weixin_46461874/article/details/128302563
https://blog.csdn.net/o0onlylove0o/article/details/127823517
https://blog.csdn.net/qq_56869120/article/details/145110269
https://blog.csdn.net/qq_51963216/article/details/141999410
https://zhuanlan.zhihu.com/p/636486951