#每日话题# #有奖活动# #技术资源# # FreeRTOS操作系统学习 
 
 
# 前言 
 
 
FreeRTOS 中有一些函数只供系统内核使用,用户应用程序一般不允许使用,这些 API 函 数就是系统内核控制函数。 
 
# 一、函数合集 
 
 
```c 
taskYIELD() 任务切换。 
taskENTER_CRITICAL() 进入临界区,用于任务中。 
taskEXIT_CRITICAL() 退出临界区,用于任务中。 
taskENTER_CRITICAL_FROM_ISR() 进入临界区,用于中断服务函数中。 
taskEXIT_CRITICAL_FROM_ISR() 退出临界区,用于中断服务函数中。 
taskDISABLE_INTERRUPTS() 关闭中断。 
taskENABLE_INTERRUPTS() 打开中断。 
vTaskStartScheduler() 开启任务调度器。 
vTaskEndScheduler() 关闭任务调度器。 
vTaskSuspendAll() 挂起任务调度器。 
xTaskResumeAll() 恢复任务调度器。 
vTaskStepTick() 设置系统节拍值。 
``` 
关闭任务任务调度器函数不用再STM32F1上 
# 二、使用方法 
具体的使用会在后续博客介绍。 
 
## 1.函数 vTaskSuspendAll() 
挂起任务调度器,调用此函数不需要关闭可屏蔽中断即可挂起任务调度器 
 
```c 
void vTaskSuspendAll( void ) 
{ 
++uxSchedulerSuspended; 
} 
``` 
此函数只是简单的将变量 uxSchedulerSuspended 加一,uxSchedulerSuspended 是挂起嵌套计数器,调度器挂起是支持嵌套的。使用函数xTaskResumeAll()可以恢复任务调度器,调用了几次 vTaskSuspendAll()挂起调度器,同样的也得调用几次 xTaskResumeAll()才会最终恢复任务调度器。 
 
假设现在有这样一种情况,任务 1 的优先级为 10,此时任务 1 由于等待队列(关于队列的知识后面会有专门的章节讲)TestQueue 而处于阻塞态。但是有段其他的代码调用函数vTaskSuspendAll()挂起了任务调度器,在还没有调用 xTaskResumeAll()恢复任务调度器之前,有个在外部中断发生了,在中断服务程序里面调用函数 xQueueSendFromISR()向任务 1 发送了队列 TestQueue。如果任务调度器没有阻塞的话函数 xQueueSendFromISR()会使任务 1 进入就绪态,也就是将任务 1 添加到优先级 10 对应的就绪列表 pxReadyTasksLists[10]中,这样当任务切换的时候任务 1 就会运行。但是现在任务调度器由于函数 vTaskSuspendAll()而挂起,这个时候任务 1 就不是添加到任务就绪列表 pxReadyTasksLists[10]中了,而是添加到另一个叫做xPendingReadyList 的列表中,xPendingReadyList 是个全局变量,在文件 tasks.c 中有定义。当调用函数 xTaskResumeAll()恢复调度器的时候就会将挂到列表 xPendingReadyList 中的任务重新移动到它们所对应的就绪列表 pxReadyTasksLists 中。 
# 总结 
FreeRTOS中内核控制函数是控制系统内部使用的,虽然不多,但是合理运用可以达到事半功倍的效果。 
 
 |   
     
  
 |