信号量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 ) )