freeRTOS操作系统任务调度方式

任务调度的方式:

一.抢占式

        如果用户在 FreeRTOS 的配置文件 FreeRTOSConfig.h 中禁止使用时间片调度, 那么每个任务必须配置不同的优先级。当 FreeRTOS 多任务启动执行后,基本会按照如下的方式去执行:
        1.首先执行的最高优先级的任务 Task1, Task1 会一直运行直到遇到系统阻塞式的 API 函数,比如延迟,事件标志等待,信号量等待,Task1 任务会被挂起,也就是释放 CPU 的执行权,让低优先级的任务得到执行。
        2.FreeRTOS 操作系统继续执行任务就绪列表中下一个最高优先级的任务 Task2,Task2 执行过程中有两种情况:
            (1) Task1由于延迟时间到, 接收到信号量消息等方面的原因, 使得 Task1从挂起状态恢复到就绪态,在抢占式调度器的作用下,Task2 的执行会被 Task1 抢占。
            (2)Task2 会一直运行直到遇到系统阻塞式的 API 函数,比如延迟,事件标志等待,信号量等待, Task2任务会被挂起,继而执行就绪列表中下一个最高优先级的任务。
   

        如果用户创建了多个任务并且采用抢占式调度器的话,基本都是按照上面两条来执行。 根据抢占式调度器,当前的任务要么被高优先级任务抢占,要么通过调用阻塞式 API 来释放 CPU 使用权让低优先级任务执行,没有用户任务执行时就执行空闲任务。

        简而言之,就是如果高优先级任务一直处于ready状态的话,那么低优先级的任务将会一直无法执行。

        举例说明:

        运行条件:
            *创建 3 个任务 Task1,Task2 和 Task3。
            *Task1 的优先级为 1,Task2 的优先级为 2,Task3 的优先级为 3。 FreeRTOS 操作系统是设置的数值越小任务优先级越低,故 Task3 的优先级最高,Task1 的优先级最低。

        运行过程描述如下:   此时任务 Task1 在运行中,运行过程中由于 Task2 就绪,在抢占式调度器的作用下任务 Task2 抢占Task1 的执行。 Task2 进入到运行态,Task1 由运行态进入到就绪态。
                                           任务 Task2 在运行中,运行过程中由于 Task3 就绪,在抢占式调度器的作用下任务 Task3 抢占 Task2的执行。 Task3 进入到运行态,Task2 由运行态进入到就绪态。
                                           任务 Task3 运行过程中调用了阻塞式 API 函数,比如 vTaskDelay,任务 Task3 被挂起,在抢占式调度器的作用下查找到下一个要执行的最高优先级任务是 Task2,任务 Task2 由就绪态进入到运行态。
                                           任务 Task2 在运行中,运行过程中由于 Task3 再次就绪,在抢占式调度器的作用下任务 Task3 抢占Task2 的执行。 Task3 进入到运行态,Task2 由运行态进入到就绪态。
        上面就是一个简单的不同优先级任务通过抢占式调度进行任务调度和任务切换的过程。

 

 

2.时间片轮转

        在 FreeRTOS 操作系统中只有同优先级任务才会使用时间片调度,另外还需要用户在FreeRTOSConfig.h 文件中使能宏定义:  #define configUSE_TIME_SLICING 1

        时间片轮转,只针对同一优先级的任务,这个理论上不需要你主动进入 block 状态,因为时间片一到,就会被强制切换到下一个就绪任务(同一优先级)

        运行条件:
         这里仅对时间片调度进行说明。
         创建 4 个同优先级任务 Task1,Task2,Task3 和 Task4。
         每个任务分配的时间片大小是 5 个系统时钟节拍。
        运行过程描述如下:
         先运行任务 Task1,运行够 5 个系统时钟节拍后,通过时间片调度切换到任务 Task2。
         任务 Task2 运行够 5 个系统时钟节拍后,通过时间片调度切换到任务 Task3。
         任务 Task3 在运行期间调用了阻塞式 API 函数,调用函数时,虽然 5 个系统时钟节拍的时间片大小
        还没有用完,此时依然会通过时间片调度切换到下一个任务 Task4。 (注意,没有用完的时间片不会再使用,下次任务 Task3 得到执行还是按照 5 个系统时钟节拍运行)
        任务 Task4 运行够 5 个系统时钟节拍后,通过时间片调度切换到任务 Task1。
       上面就是一个简单的同优先级任务通过时间片调度进行任务调度和任务切换的过程。

 

 

补充:

    时间片调度和抢占式调度我们一般都是开启了的,这样优先级相同时,使用时间片调度,优先级不同时,使用抢占式调度。

    ucos的任务优先级和freeRTOS的任务优先级不一样:ucos:数值越小,优先级越高

                                                                                         freertos:数值越小,优先级越小

 

 

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值