一、介绍
临界段最常出现在对一些全局变量进行操作的场景。
1.1 临界段的定义
临界段是指在多任务系统中,一段需要独占访问共享资源的代码。在这段代码执行期间,必须确保没有任何其他任务或中断可以访问或修改相同的共享资源。
临界段的主要目的是防止多个任务或中断同时访问共享资源,从而避免数据不一致或竞态条件。
1.2 临界段的特点
-
1、互斥访问:
-
临界段内的代码必须确保在任何时刻只有一个任务或中断可以访问共享资源。
-
其他任务或中断必须等待,直到当前任务或中断完成对共享资源的访问。
-
-
2、短小精悍:
-
临界段的代码应该尽可能短小,以减少对系统性能的影响。
-
长时间的临界段可能会导致系统响应延迟,影响实时性。
-
-
3、明确的入口和出口:
-
临界段必须有明确的入口和出口。
-
入口处通常会禁用中断,出口处会恢复中断。
-
1.3 临界段的实现方式
在RTOS中,临界段可以通过以下几种方式实现:
-
1、禁用中断:
-
直接禁用所有中断:通过设置硬件寄存器(如Cortex-M的 PRIMASK)来禁用所有中断。
-
设置中断优先级阈值:通过设置硬件寄存器(如Cortex-M的 BASEPRI)来屏蔽优先级高于某个值的中断。
-
-
2、使用互斥量(Mutex):
-
互斥量是一种同步原语,用于确保对共享资源的互斥访问。
-
任务在访问共享资源前必须先获取互斥量,访问完成后释放互斥量。
-
// 创建互斥量
SemaphoreHandle_t xMutex = xSemaphoreCreateMutex();
// 获取互斥量
if (xSemaphoreTake(xMutex, portMAX_DELAY) == pdTRUE)
{
// 临界段代码
}
// 释放互斥量
xSemaphoreGive(xMutex);
-
3、使用信号量(Semaphore):
-
信号量是一种计数器,用于控制对共享资源的访问。
-
任务在访问共享资源前必须先获取信号量,访问完成后释放信号量。
-
// 创建信号量
SemaphoreHandle_t xSemaphore = xSemaphoreCreateBinary();
// 获取信号量
if (xSemaphoreTake(xSemaphore, portMAX_DELAY) == pdTRUE)
{
// 临界段代码
}
// 释放信号量
xSemaphoreGive

2446

被折叠的 条评论
为什么被折叠?



