freertos信号量之互斥信号量

freertos信号量之互斥信号量

简介

互斥信号量(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首先进入临界区并尝试获取互斥信号量。如果互斥信号量的值为零,任务会阻塞等待。一旦任务获取到互斥信号量,就可以访问共享资源。当任务完成对共享资源的访问后,释放互斥信号量,允许其他任务获取该资源。同时,任务进入临界区的代码执行完成后,会释放互斥信号量,以便其他任务可以获取该资源。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

付宇利

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值