系列文章
FreeRTOS实时操作系统(二)任务创建与任务删除(HAL库)
FreeRTOS实时操作系统(五)进入临界区、任务调度器挂起与恢复
FreeRTOS实时操作系统(七)时间片调度及RTOS的滴答定时器
FreeRTOS实时操作系统(八)任务状态查询及时间统计函数
FreeRTOS实时操作系统(十五)Tickless低功耗模式
临界区代码保护
临界区:是指那些必须要完整运行的,不能被打断的代码
适用于:
1.外设初始化
2.操作系统的代码有很多不能被打断
3.用户自己的需求
一般在中断、任务调度抢占会打断程序。但是在FreeRTOS中,因为任务抢占中断PendSV也在其5-15的优先级管理范围内,只要关闭中断后就完成无法进行任务的抢占和中断。
任务临界区:
进入:taskENTER_CRITICAL()
退出:taskEXIT_CRITICAL()
中断临界区:
进入:taskENTER_CRITICAL_FROM_ISR()
退出:taskEXIT_CRITICAL_FROM_ISR()
注意:可以嵌套使用,但是必须要保持临界区耗时短,且要成对
其实在内部是通过一个累计量来实现嵌套的,本质上还是对中断的屏蔽和打开:
任务调度器的挂起与恢复
对任务管理器的处理,不关闭中断,仅仅防止了任务之间的资源争夺,中断还是可以直接相应
挂起任务调度器:vTaskSuspendAll()
恢复任务调度器:xTaskResumeAll()
当我们的任务临界区比较长的时候,可能会产生延时中断,挂起任务调度器可以应用在任务内部的临界区,这样其他任务无法抢占,但是又能响应中断。
内部分析:
在其内部是利用PendSV中断来实现切换的。
挂起的主要内部函数是:
恢复的主要流程是: