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

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

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

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

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

\

输入参数:

ux:队列的长度

uxItemSize:单个消息的大小

uc:队列的类型(用途)

返回值:

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





































#define x( ux, uxItemSize ) xe( ( ux ), ( uxItemSize ), ( ASE ) )
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:消息队列控制块



































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


相关产品

联系方式

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