FreeRTOS 操作系统学习(三) 调度

                                                              FreeRTOS 操作系统学习

2  调度

        任务调度的目的旨在决定某个时刻哪个任务可以由“就绪(Ready)”态进入运行状态。FreeRTOS 通过在任务创建时赋予任务不同的优先级来实现这一调度(参考 1.2章节)。任务优先级是调度器决定任务切换的唯一指标。

       调度器会在每个时钟节拍中断产生时判断一次哪个任务需要被唤醒,哪个需要进入就绪态。如图3

                                                                      

                                                     图3  节拍中断产生时判断一次哪个任务需要被唤醒,哪个需要进入就绪态

2.1 优先级

     FreeRTOS通过任务优先级的处理来实现多任务调度。优先级 是任务在创建时被赋予的一个数值,也可以通过vTaskPriorityGet()  vTaskPrioritySet() 函数来读取或设置(参考 FreeRTOS manual). 没有优先级的自动管理,这意味着除非程序修改,否则任务始终保持固定的优先级运行。优先级的值越小意味着优先级越低。优先级0是任务可以具有的最低优先级,
此级别应严格保留用于空闲任务。应用程序中的最后一个可用优先级(较高的值)是可用于任务的最高优先级。FreeRTOS对它处理的优先级数量没有限制。最大优先级数在FreeRTOSConfig.h的MAX_PRIORITIES常量中定义(请参阅第8.1节),硬件限制(MAX_PRIORITIES类型的宽度)。如果为任务分配了一个大于MAX_PRIORITIES的值,则FreeRTOS会将其值默认为MAX_PRIORITIES – 1。图4给出了在FreeRTOS中运行的应用程序的示例。任务1和任务3是基于事件的任务(当事件发生时,开始运行,然后等待事件再次发生),任务2是周期性的空闲任务确保始终有任务在运行。

      通过此任务管理,可以实现“单调速率调度(RMS)”以进行任务调度 : 频率较高的任务被赋予较高的优先级,而频率较低的任务则应享有较低的优先级。基于事件或连续任务会被定期任务抢占

                                  

                                                                                    图4 FreeRTOS应用时间表示意图

2.2  同优先级任务

       创建多个相同的优先级任务,对于调度器而言将同等对待: 如果其中有两个同时处于“就绪”态,调度器会把时间平均分给这两个同优先级的任务:调度器在每个时钟节拍都会就绪任务中选择一个优先级最高的任务切入运行态。这实现了“轮转调度(Round Robin)”其中调度的间隙即每个时钟节拍之间的时间。 此值在FreeRTOSConfig.h中的TICK_RATE_HZ常量中设置(第8.1节)。

                                                

                                                                                           图5  同优先级任务调度示意

     2.3 饥饿

           FreeRTOS中没有实现防止任务饥饿的机制 : 程序员必须确保没有优先级更高的任务占用所有运行时间。让空闲任务运行也是一个好主意,因为它可以处理一些重要的工作,例如从已删除的任务中释放内存,或者将设备切换到睡眠模式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章