创建消息队列的函数实际为xe()这个函数,该函数首先进行队列的内存分配,然后调用prvInitialiseNewQueue()进行队列的初始化:
\
输入参数:
ux:队列的长度
uxItemSize:单个消息的大小
uc:队列的类型(用途)
返回值:
pxNewQueue:消息队列控制块,一个结构体指针(句柄,实际是void*),也即消息队列在内存中的地址
xe( constUBaseType_t ux, const UBaseType_tuxItemSize, const uint8_t uc){ e; /* 消息队列控制块,一个结构体指针*/ size_t x; /*需要分配的内存大小,Bytes为单位 */ uint8_t *puc; /*实际存放消息的地址,即消息队列控制块的后面 */
configASSERT( ux > ( UBaseType_t )0 ); /*判断要创建的消息队列的长度是否大于0*/ if( uxItemSize == ( UBaseType_t )0 ) { /*若消息队列单个项的大小为0,则不会分配队列存储区域 */ x = ( size_t )0; } else { /*计算需要分配的内存大小:队列的长度*单个消息的大小 */ x = ( size_t ) (ux * uxItemSize ); }
/*调用pvPortMalloc分配内存:其大小为消息队列控制块的大小+实际的消息占用的大小 */ pxNewQueue = ( * ) pvPortMalloc(sizeof( ) + x ); /*若成功分配了内存,则pxNewQueue这个结构体指针(消息队列控制块)不为NULL */ if( pxNewQueue != NULL) { /*跳过消息队列控制块以获取实际的队列存储区域的指针 */ puc = ( ( uint8_t * )pxNewQueue ) + sizeof( ); #if(configSUPPORT_STATIC_ALLOCATION == 1 ) { /*队列可以静态创建,也可以动态创建,因此请注意,此任务是动态创建的,以防以后删除 */ pxNewQueue->ucStaticallyAllocated = pdFALSE; } #endif /*configSUPPORT_STATIC_ALLOCATION*/
/*初始化一个队列*/ prvInitialiseNewQueue( ux, uxItemSize,puc, uc, pxNewQueue ); }
return pxNewQueue;}2.3初始化队列准备
prvInitialiseNewQueue()函数首先初始化队列的长度和消息大小等参数,然后调用x()函数进行队列复位(初始化):
\
输入参数:
ux:队列的长度
uxItemSize:单个消息的大小
puc:实际存放消息的地址
uc:队列的类型(用途)
pxNewQueue:消息队列控制块
/* 按照定义队列类型的位置初始化队列成员 */ pxNewQueue->uxLength = ux; pxNewQueue->uxItemSize = uxItemSize; ( void ) x( pxNewQueue, pdTRUE); /*队列复位(初始化)*/
#if ( configUSE_TRACE_FACILITY == 1) { pxNewQueue->uc = uc; } #endif /* configUSE_TRACE_FACILITY*/
#if( configUSE_ == 1) { pxNewQueue->px =NULL; } #endif /* configUSE_*/
trace( pxNewQueue );}