FreeRTOS 中有一些函数只供系统内核使用,用户应用程序一般不允许使用,这些 API 函 数就是系统内核控制函数。内核控制的一些功能需要移植层提供,为了方便移植,这些API函数用宏来实现,比如上下文切换、进入和退出临界区、禁止和使能可屏蔽中断。内核控制函数还包括启动和停止调度器、挂起和恢复调度器以及用于低功耗模式的调整系统节拍函数。
函数 | 描述 |
---|
taskYIELD() | 任务切换。 | taskENTER_CRITICAL() | 进入临界区,用于任务中。 | taskEXIT_CRITICAL() | 退出临界区,用于任务中。 | taskENTER_CRITICAL_FROM_ISR() | 进入临界区,用于中断服务函数中。 | taskEXIT_CRITICAL_FROM_ISR() | 退出临界区,用于中断服务函数中。 | taskDISABLE_INTERRUPTS() | 关闭中断。 | taskENABLE_INTERRUPTS() | 打开中断。 | vTaskStartScheduler() | 开启任务调度器。 | vTaskEndScheduler() | 关闭任务调度器。 | vTaskSuspendAll() | 挂起任务调度器。 | xTaskResumeAll() | 恢复任务调度器。 | vTaskStepTick() | 设置系统节拍值。 |
强制上下文切换宏
- taskYIELD()
用于强制上下文切换的宏。在中断服务程序中的等价版本为 portYIELD_FROM_ISR,这也是个宏,其实现取决于移植层。 用于上下文切换的实际代码由移植层提供。对于Cortex-M3硬件,这个宏会引起PendSV中断。
临界区
-
taskENTER_CRITICAL() 用于进入临界区的宏。在临界区中不会发生上下文切换。 -
taskEXIT_CRITICAL() 用于退出临界区的宏。 -
taskENTER_CRITICAL_FROM_ISR() 进入临界区,用于中断服务函数中,此函数本质上是一个宏 -
taskEXIT_CRITICAL_FROM_ISR() 退出临界区,用于中断服务函数中,此函数本质上是一个宏
可屏蔽中断
- taskDISABLE_INTERRUPTS()
关闭可屏蔽的中断,此函数本质上是一个宏。禁止所有RTOS可屏蔽中断。在调用宏taskENTER_CRITICAL进入临界区时,也会间接调用该宏禁止所有RTOS可屏蔽中断。 - taskENABLE_INTERRUPTS()
打开可屏蔽的中断,此函数本质上是一个宏。使能所有RTOS可屏蔽中断。在调用宏taskEXIT_CRITICAL退出临界区时,也会间接调用该宏使能所有RTOS可屏蔽中断。
调度器
- vTaskStartScheduler()
开启任务调度器 - vTaskEndScheduler()
关闭任务调度器,一般不使用。仅用于x86硬件架构中。 停止RTOS内核系统节拍时钟。所有创建的任务自动删除并停止多任务调度。 - vTaskSuspendAll()
挂起任务调度器,调用此函数不需要关闭可屏蔽中断即可挂起任务调度器。 挂起调度器,但不禁止中断。当调度器挂起时,不会进行上下文切换。调度器挂起后,正在执行的任务会一直继续执行,内核不再调度(意味着当前任务不会被切换出去),直到该任务调用了xTaskResumeAll ()函数。 内核调度器挂起期间,那些可以引起上下文切换的API函数(如vTaskDelayUntil()、xQueueSend()等)决不可使用。 - xTaskResumeAll()
恢复因调用vTaskSuspendAll()函数而挂起的实时内核调度器。xTaskResumeAll()仅恢复调度器,它不会恢复那些被vTaskSuspend()函数挂起的任务。 返回pdTRUE 表示恢复调度器引起了一次上下文切换,否则,返回pdFALSE。
调整系统节拍
- vTaskStepTick()
此 函 数 在 使 用 FreeRTOS 的 低 功 耗 tickless 模 式 的 时 候 会 用 到 , 即 宏 configUSE_TICKLESS_IDLE 为 1。当使能低功耗 tickless 模式以后在执行空闲任务的时候系统 时钟节拍中断就会停止运行,系统时钟中断停止运行的这段时间必须得补上,这个工作就是由 函数 vTaskStepTick()来完成的,此函数在文件 tasks.c 中有如下定义:
void vTaskStepTick( const TickType_t xTicksToJump )
{
configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime );
xTickCount += xTicksToJump; (1)
traceINCREASE_TICK_COUNT( xTicksToJump );
}
函数参数 xTicksToJump 是要加上的时间值,系统节拍计数器 xTickCount 加上这个时 间值得到新的系统时间。关于 xTicksToJump 这个时间值的确定后面在讲解 FreeRTOS 的低功耗 模式的时候会详细的讲解。
|