freeRTOS学习:4.临界区保护及调度器挂起与恢复

一、基本介绍

1.临界区

          临界区也叫临界段代码,主要指那些运行时不能被打断的代码段,比如某些外设的初始化(IIC,SPI等),freeRTOS自身一些功能的实现代码,以及用户本身的某些需求。临界区代码不会被中断和任务调度所打断,因为其本质就是关中断,所以所有freeRTOS管理的中断都不能响应,其中包括SysTick和PendSV,这样任务调度当然也不能打断了。

        临界区保护函数主要有四个,分别是:taskENTER_CRITICAL(),taskEXIT_CRITICAL(),taskENTER_CRITICAL_FROM_ISR()taskEXIT_CRITICAL_FROM_ISR()

2.任务调度器

        任务调度器主要是用来进任务之间的切换,任务调度器的挂起和恢复也实现了对某一段代码的保护,不过任务调度器挂起可以保护范围只在任务和任务之间,中断依旧是可以打断任务的执行的。

        挂起和恢复任务调度器的函数分别是:vTaskSuspendAll()xTaskResumeAll()。但首先需要开启任务调度器:vTaskStartScheduler()。

二、函数介绍

1.临界区函数:

void taskENTER_CRITICAL(void)--任务级进入临界区函数,无参数,无返回值。本质上是关中断,即向BASEPRI写入所管理的最高中断优先级

uint32_t taskENTER_CRITICAL_FROM_ISR(void)--中断级进入临界区函数,无参数,有返回值,返回值为进入临界区前BASEPRI寄存器的值。

void taskEXIT_CRITICAL(void)--任务级退出临界区函数,无参数,无返回值。

void taskEXIT_CRITICAL_FROM_ISR(uint32_t save_status)-中断级退出临界区函数,有参数,参数为进入临界区前BASEPRI寄存器的值,无返回值

2.任务调度器

void vTaskStartScheduler(void)--开启任务调度器函数,系统会自行创建空闲任务

void vTaskSuspendAll(void)--挂起任务调度器,无参数,无返回值。本质上是将uxSchedulerSuspended的值自增一次,因为后续进行任务切换的PendSV中断是否触发的前置条件是uxSchedulerSuspended为False。

BaseType_t xTaskResumeAll(void)--恢复任务调度器函数,无参数,有返回值。返回值为True,则代表已经进行了一次任务切换,若为False,则没有进行任务切换,需要进行一次任务切换。

三、问题与总结

1.临界区的进入和任务调度器的挂起都是可嵌套的。

2.函数的使用都是必须成对出现的。

3.函数的具体实现应该尽量短。

你可能感兴趣的:(freeRTOS学习,学习,单片机,stm32)