FreeRTOS的计数信号量和二值信号量

计数信号量和二值信号量依托与消息队列,本质上是消息项大小为0的消息队列。使用uxMessagesWaiting来表示信号量值。获取信号量是调用读取消息队列的API,释放信号量是调用写入消息队列API,只是消息的大小是0字节。二值信号量初始值是0,计数信号量可以指定初始值

详情看消息队列消息队列

创建二值信号量

#define xSemaphoreCreateBinary() \
xQueueGenericCreate(             \
( UBaseType_t ) 1,               \//队列长度为1
semSEMAPHORE_QUEUE_ITEM_LENGTH,  \//项大小为0
queueQUEUE_TYPE_BINARY_SEMAPHORE \
)

创建计数信号量

#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) \ xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )


QueueHandle_t xQueueCreateCountingSemaphore(
 const UBaseType_t uxMaxCount,     //计数信号量的最大值
 const UBaseType_t uxInitialCount  //计数值初始值
)
{
	QueueHandle_t xHandle;

	configASSERT( uxMaxCount != 0 );
	configASSERT( uxInitialCount <= uxMaxCount );

	xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE );//创建消息队列,长度为uxMaxCount

	if( xHandle != NULL )
	{
		( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;//设置初始值
        traceCREATE_COUNTING_SEMAPHORE();
	}
	return xHandle;
}

xSemaphoreTake获取信号量

#define xSemaphoreTake( xSemaphore, xBlockTime )		xQueueGenericReceive( ( QueueHandle_t ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE )

xSemaphoreGive释放信号量

#define xSemaphoreGive( xSemaphore )		xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值