【FreeRTOS 应用开发笔记】任务管理(四)

一、任务管理相关的基本概念

1、任务的调度机制:FreeRTOS 中的任务调度机制是基于优先级的全抢占式调度,高优先级的任务可打断低优先级任务,低优先级任务必须在高优先级任务阻塞或结束后才能得到调度。相同优先级的任务采用时间片轮转方式进行调度(也就是通常说的分时调度器),时间片轮转调度仅在当前系统中无更高优先级就绪任务存在的情况下才有效。为了保证系统的实时性,系统尽最大可能地保证高优先级的任务得以运行。任务调度的原则是一旦任务状态发生了改变,并且当前运行的任务优 先级小于优先级队列组中任务最高优先级时,立刻进行任务切换(除非当前系统处于中断 处理程序中或禁止任务切换的状态)。

2、任务状态:

就绪(Ready):该任务在就绪列表中,就绪的任务已经具备执行的能力,只等 待调度器进行调度,新创建的任务会初始化为就绪态。

运行(Running):该状态表明任务正在执行,此时它占用处理器,FreeRTOS 调 度器选择运行的永远是处于最高优先级的就绪态任务,当任务被运行的一刻,它 的任务状态就变成了运行态。

阻塞(Blocked):如果任务当前正在等待某个时序或外部中断,我们就说这个任 务处于阻塞状态,该任务不在就绪列表中。包含任务被挂起、任务被延时、任务 正在等待信号量、读写队列或者等待读写事件等。

挂起态(Suspended):处于挂起态的任务对调度器而言是不可见的。

我们可以这么理解挂起态与阻塞态的区别,当任务有较长的时间不允许运行的时候,我们可以挂起任务,这样子调度器就不会管这个任务的任何信息,直到我们调用恢复任务的 API 函数;而任务处于阻塞态的时候,系统还需要判断阻塞态的任务是否超时,是否可以解除阻塞。

二、常用的任务函数。(更详细的用法以及函数源码可以参考《FreeRTOS 内核实现与应用开发实战指南 》)

函数 用法
vTaskSuspend()
用于挂起指定任务,通过传递 NULL 来挂起任务自己
vTaskSuspendAll() 将所有的任务都挂起,即挂起任务调度器
vTaskResume()
用于恢复指定的被挂起的任务
xTaskResumeFromISR()
与 vTaskResume()一样都是用于恢复被挂起的任务,不一样的
是 xTaskResumeFromISR() 专 门 用 在 中 断 服 务 程 序 中。
xTaskResumeAll()
用于恢复被挂起的任务调度器,调用了多少次 vTaskSuspendAll()函数就必须同样调用多少次 xTaskResumeAll()函数。
vTaskDelete()
用于删除一个任务。当一个任务删除另外一个任务时,形参为要删除任 务创建时返回的任务句柄,如果是删除自身, 则形参NULL。(需要在FreeRTOSConfig.h 中把INCLUDE_vTaskDelete 定义为 1
vTaskDelay()
vTaskDelay()延时是相对性的延时,它指定的延时时间是从调用vTaskDelay()结束后开始计算的,经过指定的时间后延时结束。(
需要在 FreeRTOSConfig.h 中把 INCLUDE_vTaskDelay 定义为 1 来使能。
vTaskDelayUntil()
vTaskDelayUntil() 延时是绝对的,适用于周期性执行的任务。当 (*pxPreviousWakeTime + xTimeIncrement)时间到达后, vTaskDelayUntil() 函数立刻返回,如果任务是最高优先级的,
那么任务会立马解除阻塞,所以说 vTaskDelayUntil()函数的延时是绝对性的。
xTimeIncrement :任务周期时间。
pxPreviousWakeTime :上一次唤醒任务的时间点。
xTimeToWake :本次要唤醒任务的时间点。
xConstTickCount :进入延时的时间点。

三、任务设计要点:

中断服务函数:中断服务函数是一种需要特别注意的上下文环境,它运行在非任务的执行环境下(一般为芯片的一种特殊运行模式(也被称作特权模式)),在这个上下文环境中不能使用挂起当前任务的操作,不允许调用任何会阻塞运行的 API 函数接口。另外需要注意的是,中 断服务程序最好保持精简短小,快进快出,一般在中断服务函数中只做标记事件的发生,然后通知任务,让对应任务去执行相关处理,因为中断服务函数的优先级高于任何优先级的任务,如果中断处理时间过长,将会导致整个系统的任务无法正常运行。

任务:如果一个任务只有就绪态而无阻塞态,势必会影响到其他低优先级任务的执行,所以在进行任务设计时,就应该保证任务在不活跃的时候,任务可以进入阻塞态以交出 CPU 使用权。在实际设计中,一般会将紧急的处理事件的任务优先级设置得高一些。

空闲任务:用户可以通过空闲任务钩子方式,在空闲任务上钩入自己的功能函数。通常这个空闲任务钩子能够完成一些额外的特殊功能,例如系统运行状态的指示,系统省电模式等。除了空闲任务钩子,FreeRTOS 系统还把空闲任务用于一些其他的功能,比如当系统删除一个任务或一个动态任务运行结束时,在执行删除任务的时候,并不会释放任务的内存空间,只会将任务添加到结束列表中,真正的系统资源回收工作在空闲任务完成,空闲任务是唯一一个不允许出现阻塞情况的任务,因为 FreeRTOS 需要保证系统永远都有一个可运行的任务。

任务的执行时间:任务的执行时间一般是指两个方面,一是任务从开始到结束的时间,二是任务的周期。在我们设计的时候,必须考虑任务的时间,一般来说处理时间更短的任务优先级应设置更高一些。

猜你喜欢

转载自blog.csdn.net/qq_29031103/article/details/121009105
今日推荐