SIEMENS河北省张家口市 西门子代理商——西门子华北一级总代理
| 更新时间 2024-11-26 07:00:00 价格 请来电询价 西门子总代理 PLC 西门子一级代 驱动 西门子代理商 伺服电机 联系电话 15903418770 联系手机 15915421161 联系人 张经理 立即询价 |
详细介绍
2.2 创建消息队列函数
QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ){ Queue_t *pxNewQueue; /* 消息队列控制块,一个结构体指针*/ size_t xQueueSizeInBytes; /* 需要分配的内存大小,Bytes为单位 */ uint8_t *pucQueueStorage; /* 实际存放消息的地址,即消息队列控制块的后面 */
configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); /*判断要创建的消息队列的长度是否大于0*/ if( uxItemSize == ( UBaseType_t ) 0 ) { /* 若消息队列单个项的大小为0,则不会分配队列存储区域 */ xQueueSizeInBytes = ( size_t ) 0; } else { /* 计算需要分配的内存大小:队列的长度*单个消息的大小 */ xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); }
/* 调用pvPortMalloc分配内存:其大小为消息队列控制块的大小+实际的消息占用的大小 */ pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /* 若成功分配了内存,则pxNewQueue这个结构体指针(消息队列控制块)不为NULL */ if( pxNewQueue != NULL ) { /* 跳过消息队列控制块以获取实际的队列存储区域的指针 */ pucQueueStorage = ( ( uint8_t * ) pxNewQueue ) + sizeof( Queue_t ); #if( configSUPPORT_STATIC_ALLOCATION == 1 ) { /* 队列可以静态创建,也可以动态创建,因此请注意,此任务是动态创建的,以防以后删除 */ pxNewQueue->ucStaticallyAllocated = pdFALSE; } #endif /* configSUPPORT_STATIC_ALLOCATION */
/*初始化一个队列*/ prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); }
return pxNewQueue;}2.3 初始化队列准备
/* 按照定义队列类型的位置初始化队列成员 */ pxNewQueue->uxLength = uxQueueLength; pxNewQueue->uxItemSize = uxItemSize; ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); /*队列复位(初始化)*/
#if ( configUSE_TRACE_FACILITY == 1 ) { pxNewQueue->ucQueueType = ucQueueType; } #endif /* configUSE_TRACE_FACILITY */
#if( configUSE_QUEUE_SETS == 1 ) { pxNewQueue->pxQueueSetContainer = NULL; } #endif /* configUSE_QUEUE_SETS */
traceQUEUE_CREATE( pxNewQueue );}
创建消息队列的函数实际为xQueueGenericCreate()这个函数,该函数首先进行队列的内存分配,然后调用prvInitialiseNewQueue()进行队列的初始化:
\
输入参数:
uxQueueLength:队列的长度
uxItemSize:单个消息的大小
ucQueueType:队列的类型(用途)
返回值:
pxNewQueue:消息队列控制块,一个结构体指针(QueueHandle_t句柄,实际是void*),也即消息队列在内存中的地址
QueueHandle_t xQueueGenericCreate( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, const uint8_t ucQueueType ){ Queue_t *pxNewQueue; /* 消息队列控制块,一个结构体指针*/ size_t xQueueSizeInBytes; /* 需要分配的内存大小,Bytes为单位 */ uint8_t *pucQueueStorage; /* 实际存放消息的地址,即消息队列控制块的后面 */
configASSERT( uxQueueLength > ( UBaseType_t ) 0 ); /*判断要创建的消息队列的长度是否大于0*/ if( uxItemSize == ( UBaseType_t ) 0 ) { /* 若消息队列单个项的大小为0,则不会分配队列存储区域 */ xQueueSizeInBytes = ( size_t ) 0; } else { /* 计算需要分配的内存大小:队列的长度*单个消息的大小 */ xQueueSizeInBytes = ( size_t ) ( uxQueueLength * uxItemSize ); }
/* 调用pvPortMalloc分配内存:其大小为消息队列控制块的大小+实际的消息占用的大小 */ pxNewQueue = ( Queue_t * ) pvPortMalloc( sizeof( Queue_t ) + xQueueSizeInBytes ); /* 若成功分配了内存,则pxNewQueue这个结构体指针(消息队列控制块)不为NULL */ if( pxNewQueue != NULL ) { /* 跳过消息队列控制块以获取实际的队列存储区域的指针 */ pucQueueStorage = ( ( uint8_t * ) pxNewQueue ) + sizeof( Queue_t ); #if( configSUPPORT_STATIC_ALLOCATION == 1 ) { /* 队列可以静态创建,也可以动态创建,因此请注意,此任务是动态创建的,以防以后删除 */ pxNewQueue->ucStaticallyAllocated = pdFALSE; } #endif /* configSUPPORT_STATIC_ALLOCATION */
/*初始化一个队列*/ prvInitialiseNewQueue( uxQueueLength, uxItemSize, pucQueueStorage, ucQueueType, pxNewQueue ); }
return pxNewQueue;}2.3 初始化队列准备
prvInitialiseNewQueue()函数首先初始化队列的长度和消息大小等参数,然后调用xQueueGenericReset()函数进行队列复位(初始化):
\
输入参数:
uxQueueLength:队列的长度
uxItemSize:单个消息的大小
pucQueueStorage:实际存放消息的地址
ucQueueType:队列的类型(用途)
pxNewQueue:消息队列控制块
/* 按照定义队列类型的位置初始化队列成员 */ pxNewQueue->uxLength = uxQueueLength; pxNewQueue->uxItemSize = uxItemSize; ( void ) xQueueGenericReset( pxNewQueue, pdTRUE ); /*队列复位(初始化)*/
#if ( configUSE_TRACE_FACILITY == 1 ) { pxNewQueue->ucQueueType = ucQueueType; } #endif /* configUSE_TRACE_FACILITY */
#if( configUSE_QUEUE_SETS == 1 ) { pxNewQueue->pxQueueSetContainer = NULL; } #endif /* configUSE_QUEUE_SETS */
traceQUEUE_CREATE( pxNewQueue );}
相关产品