加入收藏 在线留言 联系我们
关注微信
手机扫一扫 立刻联系商家
全国服务热线15915421161

SIEMENS河北省张家口市 西门子代理商——西门子华北一级总代理

更新时间
2024-11-26 07:00:00
价格
请来电询价
西门子总代理
PLC
西门子一级代
驱动
西门子代理商
伺服电机
联系电话
15903418770
联系手机
15915421161
联系人
张经理
立即询价

详细介绍
2.2 创建消息队列函数

创建消息队列的函数实际为xQueueGenericCreate()这个函数,该函数首先进行队列的内存分配,然后调用prvInitialiseNewQueue()进行队列的初始化:

\

输入参数:

uxQueueLength:队列的长度

uxItemSize:单个消息的大小

ucQueueType:队列的类型(用途)

返回值:

pxNewQueue:消息队列控制块,一个结构体指针(QueueHandle_t句柄,实际是void*),也即消息队列在内存中的地址





































#define xQueueCreate( uxQueueLength, uxItemSize ) xQueueGenericCreate( ( uxQueueLength ), ( uxItemSize ), ( queueQUEUE_TYPE_BASE ) )
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:消息队列控制块



































static void prvInitialiseNewQueue( const UBaseType_t uxQueueLength, const UBaseType_t uxItemSize, uint8_t *pucQueueStorage, const uint8_t ucQueueType, Queue_t *pxNewQueue ){    ( void ) ucQueueType;    /* 判断单个消息的大小是否为0*/    if( uxItemSize == ( UBaseType_t ) 0 )    {        /* 没有为队列存储区域分配RAM,但是pcHead不能设置为NULL,因为NULL被用作一个键来表示队列被用作互斥锁。        因此,只需将pcHead设置为消息队列控制块的地址 */        pxNewQueue->pcHead = ( int8_t * ) pxNewQueue;    }    else    {   /* 将pcHead设置为实际存放消息的地址 */        pxNewQueue->pcHead = ( int8_t * ) pucQueueStorage;}
   /* 按照定义队列类型的位置初始化队列成员 */    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 );}


相关产品

联系方式

  • 电  话:15903418770
  • 联系人:张经理
  • 手  机:15915421161
  • 微  信:15915421161