二进制信号量和计数信号量源码分析

信号量semaphore

 

 

#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
	#define xSemaphoreCreateBinary() 
	/*
		1、队列长度=1 二值信号的值 无非就是0和1
		2、队列项的长度=semSEMAPHORE_QUEUE_ITEM_LENGTH   = ( ( uint8_t ) 0U )消息空间没有意义
		3、队列的类型=queueQUEUE_TYPE_BINARY_SEMAPHORE   =( ( uint8_t ) 3U ) 只用于调试使用
	*/
	xQueueGenericCreate( ( UBaseType_t ) 1, semSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_BINARY_SEMAPHORE )
#endif

#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
	/*
		内部调用消息队列计数信号量的创建,重点分析它
	*/
	#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) 
	xQueueCreateCountingSemaphore( ( uxMaxCount ), ( uxInitialCount ) )
#endif

	/*
		1、计数信号量的最大值
		2、计数信号量的初始值
	
	*/
	QueueHandle_t xQueueCreateCountingSemaphore( const UBaseType_t uxMaxCount, const UBaseType_t uxInitialCount )
	{
	QueueHandle_t xHandle;
		//调用消息队列的创建
		xHandle = xQueueGenericCreate( uxMaxCount, queueSEMAPHORE_QUEUE_ITEM_LENGTH, queueQUEUE_TYPE_COUNTING_SEMAPHORE );

		if( xHandle != NULL )
		{
			//uxMessagesWaiting:将要处理的消息个数,这个去接收,是不会进入阻塞态的
			//赋值为计数信号量的初始值的目的,创建之后,就可以获取信号量,代表可用的资源数量
			( ( Queue_t * ) xHandle )->uxMessagesWaiting = uxInitialCount;

			traceCREATE_COUNTING_SEMAPHORE();
		}
		else
		{
			traceCREATE_COUNTING_SEMAPHORE_FAILED();
		}

		return xHandle;
	}
/*
	消息队列的发送和接收,都有阻塞任务的功能
	信号量的释放,却没有阻塞参数?????
	参数:
	1、信号量的句柄
	2、发送的缓冲区  NULL
	3、阻塞等待时间 = semGIVE_BLOCK_TIME -=  ( ( TickType_t ) 0U )???
		信号量释放是一个紧急的事件,当信号量资源已经到达最大值时,就不需要再等待其他任务使用
		所以不需要阻塞
	4、队列插入方式=queueSEND_TO_BACK 队尾
*/	
#define xSemaphoreGive( xSemaphore )		
xQueueGenericSend( ( QueueHandle_t ) ( xSemaphore ), NULL, semGIVE_BLOCK_TIME, queueSEND_TO_BACK )

/*
	1、再次封装了消息队列在中断中的发送接口xQueueGiveFromISR
	2、区别就是 give没有copy的功能  -----因为信号量不占用内存空间
*/
#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )	
xQueueGiveFromISR( ( QueueHandle_t ) ( xSemaphore ), ( pxHigherPriorityTaskWoken ) )

/*
	1、句柄
	2、接收缓冲区  = NULL 
	3、阻塞等待时间
	4、是否允许 删除消息空间 = pdFALSE
*/
#define xSemaphoreTake( xSemaphore, xBlockTime )		
xQueueGenericReceive( ( QueueHandle_t ) ( xSemaphore ), NULL, ( xBlockTime ), pdFALSE )
/*
	1、句柄
	2、接收缓冲区  = NULL 
	3、NULL
*/
#define xSemaphoreTakeFromISR( xSemaphore, pxHigherPriorityTaskWoken )	
xQueueReceiveFromISR( ( QueueHandle_t ) ( xSemaphore ), NULL, ( pxHigherPriorityTaskWoken ) )

优先级翻转问题

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值