STM32F1+HAL库+FreeTOTS学习6——临界段代码保护函数
上一期我们学习了FreeRTOS的内核中断管理以及中断屏蔽控制函数,下面我们来学习临界端代码保护函数的使用
临界段
临界段也叫临界区,指的是必须完整运行完,不能被任务调度、中断等事件打断的代码段,适用于一些需严格按照时序初始化的外设、比如IIC、SPI等,还有就是一些系统自身的需要、用户需求等。。。
在我们之前操作系统的代码中,开始任务创建其他任务也用到了临界段代码保护函数,如图:
下面我们来了解一下具体的用法:
临界段代码保护函数
临界段代码保护函数中关闭任务调度,并且屏蔽中断响应
函数 | 描述 |
---|---|
taskENTER_CRITICAL() | 任务级进入临界段 |
taskEXIT_CRITICAL() | 任务级退出临界段 |
taskENTER_CRITICAL_FROM_ISR() | 中断级进入临界段 |
taskEXIT_CRITICAL_FROM_ISR() | 中断级退出临界段 |
- 临界区是直接屏蔽了中断,系统任务调度靠中断,ISR也靠中断
- 具有成对使用、支持嵌套、的特点
具体使用方法如下:
/*
需要注意的是,尽量保持临界段耗时短,需要快进快出
*/
/*任务中进入临界区*/
taskENTER_CRITICAL() ;
{
… … /* 临界区代码 */
}
taskEXIT_CRITICAL() ;
/*任务中推出临界区*/
/*中断中进入临界区*/
uint32_t save_status;
save_status = taskENTER_CRITICAL_FROM_ISR();
{
… … /* 临界区代码 */
}
taskEXIT_CRITICAL_FROM_ISR(save_status );
/*中断中推出临界区*/
任务调度器的挂起和恢复函数
与临界段代码保护函数不同,任务调度器的挂起智慧关闭任务调度,但是中断依然可以响应
函数 | 描述 |
---|---|
vTaskSuspendAll() | 挂起任务调度器 |
xTaskResumeAll() | 恢复任务调度器 |
- 与临界区不一样的是,挂起任务调度器,未关闭中断;
- 它仅仅是防止了任务之间的资源争夺,中断照样可以直接响应
- 挂起调度器的方式,适用于临界区位于任务与任务之间;既不用去延时中断,又可以做到临界区的安全
具体使用方法如下:
/*挂起任务调度器,关闭任务调度,但不屏蔽中断*/
vTaskSuspendAll() ;
{
… … /* 内容 */
}
xTaskResumeAll() ;
/*恢复任务调度器,打开任务调度,但不屏蔽中断*/
标签:HAL,函数,中断,代码,临界,CRITICAL,任务调度
From: https://blog.csdn.net/weixin_67907028/article/details/140209536