临界段代码保护
临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段
适用场合
- 外设:需严格按照时序初始化的外设:I2C、SPI等等
- 系统:系统自身需求
- 用户:用户需求
临界段代码保护函数
FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断
临界区是直接屏蔽了中断,系统任务调度靠中断,ISR也靠中断
函数
特点
- 成对使用
- 支持嵌套(与单纯的开关中断最大的区别)
- 尽量保持临界段耗时短
任务调度器的挂起和恢复
挂起任务调度器, 调用此函数不需要关闭中断
函数
特点
- 与临界区不一样的是,挂起任务调度器,未关闭中断;
- 它仅仅是防止了任务之间的资源争夺,中断照样可以直接响应;
- 挂起调度器的方式,适用于临界区位于任务与任务之间;既不用去延时中断,又可以做到临界区的安全
调度器挂起和恢复API函数
1、挂起任务调度器:vTaskSuspendAll()
调用一次挂起调度器,该变量uxSchedulerSuspended就加一
变量uxSchedulerSuspended的值,将会影响Systick触发PendSV中断,即影响任务调度
2、恢复任务调度器:xTaskResumeAll()
调用一次恢复调度器,该变量uxSchedulerSuspended就减一 ,如果等于0,则允许调度
- 将所有在xPendingReadyList中的任务移到对应的就绪链表中
- 移除等待就绪列表中的列表项,恢复至就绪列表,直到xPendingReadyList列表为空
二者 最大 区别
临界段代码保护函数,关闭中断;关中断 意味着完整使用代码段,不受干扰,速度很快
挂起任务调度器,未关闭中断;不关 意味着只是将任务与任务之间隔开,中断同样可以响应