1 任务状态

alt text

  • 正在运行的任务,被称为”正在使用处理器”,它处于运行状态。在单处理系统中,任何时间里只能有一个任务处于运行状态。

  • 非运行状态的任务,它处于这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()显式让步(手动请求重新调度)时才会发生任务切换。 任务永远不会被抢占,因此不能使用时间切片。

alt text

虚线表示任务处于就绪状态

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中滴答定时器的时间间隔。

alt text

上图中任务优先级:

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