简介
互斥信号量(Mutex Semaphore)用于保护临界区资源,确保同一时间只有一个任务可以访问共享资源。以下是互斥信号量的常用函数及其说明:
1)xSemaphoreCreateMutex()
创建一个互斥信号量。该函数没有参数,返回一个互斥信号量的句柄,用于后续操作。
2)xSemaphoreTake(SemaphoreHandle_t xMutex, portTickType xBlockTime)
获取互斥信号量。xMutex参数是互斥信号量的句柄,xBlockTime参数指定等待时间。如果等待时间超过0,则任务会阻塞等待,直到获取到互斥信号量为止;如果等待时间为0,则任务不会阻塞,直接返回获取结果。
3)xSemaphoreGive(SemaphoreHandle_t xMutex)
释放互斥信号量。xMutex参数是互斥信号量的句柄。只有已持有互斥信号量所有权的任务才能释放它。
4)xSemaphoreDelete(SemaphoreHandle_t xMutex)
删除一个互斥信号量。xMutex参数是互斥信号量的句柄。删除后,其他任务将无法再使用该互斥信号量。
使用注意点:
互斥信号量只有一个任务可以使用,其他任务必须等待该任务释放互斥信号量后才能继续访问共享资源。
互斥信号量可以在任务间同步,保证同一时间只有一个任务可以访问共享资源,避免了资源竞争和数据不一致的问题。
互斥信号量也可以用于实现优先级翻转的控制。
例程
#include <FreeRTOS.h>
#include <task.h>
#include <mutex.h>
// 定义互斥信号量的初始状态为0
static MutexHandle_t mutex = 0;
void vATask( void * pvParameters )
{
portTickType xDelay;
for( ;; )
{
// 任务进入临界区,获取互斥信号量并加锁
xMutexTake( mutex, portMAX_DELAY ); // 等待信号量变为0,阻塞状态最长时间为portMAX_DELAY
//临界区代码,访问共享资源
// ...
// 释放互斥信号量并解锁
xMutexGive( mutex );
// 延时一定时间后再次进入临界区
xDelay = pdMS_TO_TICKS( 1000 ); // 延时1秒
portYIELD_WITHIN( xDelay );
}
}
在上述示例中,任务vATask首先进入临界区并尝试获取互斥信号量。如果互斥信号量的值为零,任务会阻塞等待。一旦任务获取到互斥信号量,就可以访问共享资源。当任务完成对共享资源的访问后,释放互斥信号量,允许其他任务获取该资源。同时,任务进入临界区的代码执行完成后,会释放互斥信号量,以便其他任务可以获取该资源。