SIEMENS河北省张家口市 西门子代理商——西门子华北一级总代理
![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | 更新时间 2024-07-04 07:00:00 价格 请来电询价 西门子总代理 PLC 西门子一级代 驱动 西门子代理商 伺服电机 联系电话 15903418770 联系手机 15915421161 联系人 张经理 立即询价 |
详细介绍
2.2 创建消息队列函数
xe( const UBaseType_t ux, const UBaseType_t uxItemSize, const uint8_t uc ){ *pxNewQueue; /* 消息队列控制块,一个结构体指针*/ 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 初始化队列准备
/* 按照定义队列类型的位置初始化队列成员 */ 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 );}
创建消息队列的函数实际为xe()这个函数,该函数首先进行队列的内存分配,然后调用prvInitialiseNewQueue()进行队列的初始化:
\
输入参数:
ux:队列的长度
uxItemSize:单个消息的大小
uc:队列的类型(用途)
返回值:
pxNewQueue:消息队列控制块,一个结构体指针(句柄,实际是void*),也即消息队列在内存中的地址
xe( const UBaseType_t ux, const UBaseType_t uxItemSize, const uint8_t uc ){ *pxNewQueue; /* 消息队列控制块,一个结构体指针*/ 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 );}
相关产品