FREERTOS_信号量_创建和使用

一、信号量的创建

二进制信号量和计数型信号量使用的函数,核心操作函数(xSemaphoreGive()/xSemaphoreTake())是通用的,但创建函数不同,

// 释放信号量(二进制/计数型通用)
xSemaphoreGive(xSemaphore);

// 获取信号量(二进制/计数型通用)
xSemaphoreTake(xSemaphore, xTicksToWait);
1、包含头文件
#include "semphr.h" // 信号量核心头文件
2、定义信号量句柄
SemaphoreHandle_t xMySemaphore; // 信号量句柄
3、调用创建函数
信号量类型创建函数说明
二进制信号量xSemaphoreCreateBinary()初始为空,用于任务同步
计数型信号量xSemaphoreCreateCounting(uxMaxCount, uxInitialCount)初始计数值可配置,用于资源计数
互斥量(特殊二值信号量)xSemaphoreCreateMutex()用于资源互斥访问,支持优先级继承

二进制信号量创建:

xMySemaphore = xSemaphoreCreateBinary();

计数型信号量创建

// 最大计数值5,初始计数值0
xMySemaphore = xSemaphoreCreateCounting(5, 0);
4、检查创建结果
if(xMySemaphore == NULL) {
  // 创建失败(如内存不足),需错误处理
}

二、信号量的基本使用 释放(Give)获取(Take)

1、释放信号量(Give)

通过xSemaphoreGive()释放信号量(二进制信号量置为 “满”,计数型信号量计数值 + 1):

BaseType_t xStatus;

// 释放信号量(成功返回pdPASS,失败返回errQUEUE_FULL)
xStatus = xSemaphoreGive(xMySemaphore);

if(xStatus == pdPASS) {
  // 信号量释放成功
}
2、获取信号量(Take)

通过xSemaphoreTake()获取信号量(二进制信号量置为 “空”,计数型信号量计数值 - 1):

BaseType_t xStatus;

// 获取信号量:阻塞10个tick,超时返回失败
xStatus = xSemaphoreTake(
  xMySemaphore,    // 目标信号量句柄
  10               // 阻塞超时时间(portMAX_DELAY为永久阻塞)
);

if(xStatus == pdPASS) {
  // 获取成功,执行需要同步/保护的操作
} else {
  // 超时未获取到信号量
}

三、注意

二进制信号量:任务同步(如按键触发 LED 动作)

释放方:事件发生时(按键按下)调用xSemaphoreGive();

获取方:等待事件时调用xSemaphoreTake(),获取到后执行动作。

计数型信号量:资源计数(如空闲缓冲区数量、可用打印机数量)

资源可用时:释放信号量(计数值 + 1);

申请资源时:获取信号量(计数值 - 1),计数值为 0 时阻塞等待。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值