本节主要需要掌握以下内容:
1,临界段代码保护简介(熟悉)
2,临界段代码保护函数介绍(掌握)
3,任务调度器的挂起和恢复(熟悉)
4,课堂总结(掌握)
一、临界段代码保护简介(熟悉)
什么是临界段:临界段代码也叫做临界区,是指那些必须完整运行,不能被打断的代码段
适用场合如:
- 外设:需严格按照时序初始化的外设:IIC、SPI等等
- 系统:系统自身需求
- 用户:用户需求
问题1:什么可以打断当前程序的运行?
answer:中断和任务调度
问题2:那如何程序不被打断呢?
answer:关中断!那么中断就打断不了当前任务了,而任务调度也就不能了。因为PendSV就是实现任务切换的一个中断,而这个中断我们设置的是最低优先级。那么我们直接关中断,那么最低优先级的中断PendSV也就无法响应了。
二,临界段代码保护函数介绍(掌握)
FreeRTOS 在进入临界段代码的时候需要关闭中断,当处理完临界段代码以后再打开中断。
保证临界区代码不会被打断。
函数 | 描述 |
taskENTER_CRITICAL() | 任务级进入临界段,其实就是关中断 |
taskEXIT_CRITICAL() | 任务级退出临界段,其实就是开中断 |
taskENTER_CRITICAL_FROM_ISR() | 中断级进入临界段,其实就是关中断 |
taskEXIT_CRITICAL_FROM_ISR() | 中断级退出临界段,其实就是开中断 |
其实底层就调用的 开关中断函数,感兴趣的小伙伴可以跟进去看!
任务级临界区调用格式示例:
中断级临界区调用格式示例:
特点:
- 成对使用
- 支持嵌套
- 尽量保持临界段耗时短(关中断太久了,就会造成中断延时,在一些系统里是不被允许的)并且 临界区是直接屏蔽了中断,系统任务调度靠中断,ISR也靠中断
三,任务调度器的挂起和恢复(熟悉)
挂起任务调度器, 调用此函数不需要关闭中断
函数 | 描述 |
vTaskSuspendAll() | 挂起任务调度器 |
xTaskResumeAll() | 恢复任务调度器 |
使用格式示例:
1、与临界区不一样的是,挂起任务调度器,未关闭中断;
2、它仅仅是防止了任务之间的资源争夺,中断照样可以直接响应;
3、挂起调度器的方式,适用于临界区位于任务与任务之间;既不用去延时中断,又可以做到临界区的安全