【嵌入式FreeRTOS#补充1】临界区
一、临界区意义
保护共享资源:当多个任务(线程)可能同时访问同一个共享资源(如全局变量、硬件寄存器等)时,临界区可以确保只有一个任务能进入这段代码,防止出现数据竞争或不一致的问题。
关闭中断 / 调度:进入临界区时,系统通常会暂时关闭中断响应或任务调度功能,确保当前任务的执行不会被其他任务或中断打断,直到调用对应的退出临界区函数(如
taskEXIT_CRITICAL();
)才恢复。保证操作原子性:对于需要连续执行的一系列操作(如读取 - 修改 - 写入共享变量),临界区能保证这些操作作为一个整体完成,不会被其他任务分割
二、进入方式
进入临界区
taskENTER_CRITICAL();
退出临界区
taskEXIT_CRITICAL();
三、调用示例
在起始任务中,我们一次创建了多个任务,这些任务优先级都比起始任务高,如果不能强制修改优先级,则必须给它一个临界区,避免创建过程中被自己创建的任务打断。
void Start_Task( void * pvParameters )
{taskENTER_CRITICAL(); /* 进入临界区 */xTaskCreate((TaskFunction_t ) Task1,(char * ) "Task1",(configSTACK_DEPTH_TYPE ) TASK1_STACK_DEPTH,(void * ) NULL,(UBaseType_t ) TASK1_PRIORITY,(TaskHandle_t * ) &task1_handler );xTaskCreate((TaskFunction_t ) Task2,(char * ) "Task2",(configSTACK_DEPTH_TYPE ) TASK2_STACK_DEPTH,(void * ) NULL,(UBaseType_t ) TASK2_PRIORITY,(TaskHandle_t * ) &task2_handler );xTaskCreate((TaskFunction_t ) Task3,(char * ) "Task2",(configSTACK_DEPTH_TYPE ) TASK3_STACK_DEPTH,(void * ) NULL,(UBaseType_t ) TASK3_PRIORITY,(TaskHandle_t * ) &task3_handler );vTaskDelete(NULL); taskEXIT_CRITICAL(); /* 退出临界区 */
}