FreeRTOS同步与互斥:(三)互斥量

注:本文摘自韦东山《FreeRTOS完全开发手册》,如有侵权请告知

同步与互斥的概念:

  • 同步: A等待B做完某件事

  • 互斥: 某一资源同一时间仅能有一个用户访问

  • RTOS同步与互斥的方式: 任务通知(task notification)、队列(queue)、事件组(event group)、信号量(semaphoe)、互斥量(mutex)等。

三、互斥量

3.1 互斥量与信号量

互斥量相比与信号量的优势:

  • 优先级继承

  • 递归锁:谁上锁只能谁开锁

  • 互斥量初始值为1, 二进制信号量初始值为0

3.2 互斥量函数

互斥量是一种特殊的二进制信号量。
使用互斥量时,先创建、然后去获得、释放它。使用句柄来表示一个互斥量。

3.2.1创建互斥量

  • 动态分配内存
/* 创建一个互斥量
 * 返回值: 返回句柄,非NULL表示成功
 */
SemaphoreHandle_t xSemaphoreCreateMutex(void);
  • 静态分配内存
/* 创建一个互斥量
 * 需要先有一个StaticSemaphore_t结构体,并传入它的指针
 * 返回值: 返回句柄,非NULL表示成功
 */
SemaphoreHandle_t xSemaphoreCreateMutexStatic(StaticSemaphore_t *pxMutexBuffer);

3.2.2 删除互斥量

/* xSemaphore: 信号量句柄,你要删除哪个信号量, 互斥量也是一种信号量 */
void vSemaphoreDelete(SemaphoreHandle_t xSemaphore);

3.2.3 give/take

/* 释放 */
BaseType_t xSemaphoreGive(SemaphoreHandle_t xSemaphore);

/* 释放(ISR版本) */
BaseType_t xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore,
                                 BaseType_t *pxHigherPriorityTaskWoken);

/* 获得 */
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,TickType_t xTicksToWait);

/* 获得(ISR版本) */
xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore,
                      BaseType_t *pxHigherPriorityTaskWoken);

3.3 递归锁

递归锁的特性:

  • 任务A获得递归锁M后,它还可以多次去获得这个锁
  • "take"了N次,要"give"N次,这个锁才会被释放

3.3.1 相关函数

/* 创建一个递归锁
 * 返回值: 返回句柄,非NULL表示成功
 */
SemaphoreHandle_t xSemaphoreCreateRecursiveMutex(void);

/* 释放 */
BaseType_t xSemaphoreGiveRecursive(SemaphoreHandle_t xSemaphore);

/* 获得 */
BaseType_t xSemaphoreTakeRecursive(SemaphoreHandle_t xSemaphore,
                                   TickType_t xTicksToWait);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值