内核控制函数
函数 taskYIELD()
此函数用于进行任务切换, 此函数本质上是一个宏。
临界区
代码保护,在临界区的任务拒绝任务调度的打断。如读取IIC数据,不能被打断,需进入临界区。
函数 | 描述 |
---|---|
taskYIELD() | 任务切换。 |
taskENTER_CRITICAL() | 进入临界区,用于任务中。 |
taskEXIT_CRITICAL() | 退出临界区,用于任务中。 |
taskENTER_CRITICAL_FROM_ISR() | 进入临界区,用于中断服务函数中。 |
taskEXIT_CRITICAL_FROM_ISR() | 退出临界区,用于中断服务函数中。 |
taskDISABLE_INTERRUPTS() | 关闭中断(对5-15优先级的中断有效)。 |
taskENABLE_INTERRUPTS() | 打开中断(对5-15优先级的中断有效)。 |
vTaskStartScheduler() | 开启任务调度器。 |
vTaskEndScheduler() | 关闭任务调度器(stm32不适用,可能仅用于x86)。 |
vTaskSuspendAll() | 挂起任务调度器(数值加加)。 |
xTaskResumeAll() | 恢复任务调度器(挂起几次,恢复也几次)。 |
vTaskStepTick() | 设置系统节拍值 |
什么是临界段?
临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段,比如有的外设的初始化需要严格的时序,初始化过程中不能被打断。FreeRTOS在进入临界段代码的时候需要迸闭中断,当处理完临界段代码以后再打开中断。
API函数:
函数 | 描述 |
---|---|
taskENTER_CRITICAL() | 任务级进入临界段 |
taskEXIT_CRITICAL() | 任务级退出临界段 |
taskENTER_CRITICAL_FROM_ISR() | 中断级进入临界段 |
taskEXIT_CRITICAL_FROM_ISR() | 中断级退出临界段 |
特点:成对出现、快进快出:
uxCriticalNesting++;调用几次进入,就需要几次退出。
代码示例:
任务级:
taskENTER_CRITICAL();
// user code
taskEXIT_CRITICAL();
中断级:
uint32_t status_value = 0;
status_value = taskENTER_CRITICAL_FROM_ISR();
// user code
taskEXIT_CRITICAL_FROM_ISR(status_value);