FreeRTOS消息队列 传递结构体指针和结构体异同

原文链接:https://blog.csdn.net/weixin_44333597/article/details/107523343

1 消息队列传递结构体指针和结构体异同

1.1 使用队列传递复合数据类型

接收方接收由多个发送源发送至队列中的消息时,需要判断数据的来源,使用方式:利用队列传递结构体,在结构体中包含数据值和数据来源信息

typedef struct
{
    int  iValue;  //数据值
    int iMeaning; //数据来源信息
}xData;

1.2 利用队列传递数据的指针(处理速度更快)

1. 指针指向的内存空间所有权必须明确

共享内存在其指针发送到队列之前,其内容只允许被发送任务访问;

共享内存指针从队列中被读出之后,其内容亦只允许被接收任务访问

2. 指针指向的内存空间必须有效

指针指向的内存空间是动态分配的,只应该有一个任务对其进行内存释放,当这段内存空间被释放后,就不应该有其他任务再次访问这段空间。

//传递结构体的指针
/* 创建10个存储指针变量的消息队列,由于CM3/CM4内核是32位机,一个指针变量占用4个字节 */
xQueue2 = xQueueCreate(10, sizeof(struct Msg *));    //单元大小为一个指针变量的大小

//发送消息,实现结构体指针的传递 
MSG_T   *ptMsg;        //MSG_T为结构体声明
ptMsg = &g_tMsg;   /* 初始化结构体指针 */
// 初始化数组 
    ptMsg->ucMessageID = 0;
    ptMsg->ulData[0] = 0;
    ptMsg->usData[0] = 0;
//使用消息队列实现指针变量的传递 
 if(xQueueSend(xQueue2,                  /* 消息队列句柄 */
               (void *) &ptMsg,           // 发送结构体指针变量ptMsg的地址  “&”  取结构体指针的地址,传递指针
               (TickType_t)10) != pdPASS )
     
//接收消息,接收结构体的指针
MSG_T *ptMsg; //定义一个结构体指针
xResult = xQueueReceive(xQueue2,            /* 消息队列句柄 */
                       (void *)&ptMsg,      // 这里获取的是结构体的地址,类似于 char *a="stm";char *b;b=a 指针赋值,a和b指向同一个地址
                       (TickType_t)xMaxBlockTime);/* 设置阻塞时间 */
if(xResult == pdPASS)
            {
                /* 成功接收,并通过串口将数据打印出来 */
                printf("接收到消息队列数据ptMsg->ucMessageID = %d\r\n",ptMsg->ucMessageID);
                printf("接收到消息队列数据ptMsg->ulData[0] = %d\r\n", ptMsg->ulData[0]);
                printf("接收到消息队列数据ptMsg->usData[0] = %d\r\n", ptMsg->usData[0]);
            }     

//传递结构体本身
//创建一个消息队列
xQueue2 = xQueueCreate(10, sizeof(struct Msg));  //单员大小为结构体的大小  

//发送消息,实现结构体的传递 
MSG_T   ptMsg;       //MSG_T为结构体声明
//初始化数组
    ptMsg.ucMessageID = 0;
    ptMsg.ulData[0] = 0;
    ptMsg.usData[0] = 0;
 //使用消息队列实现指针变量的传递
 if(xQueueSend(xQueue2,                  /* 消息队列句柄 */
               (void *) &ptMsg,           // 发送结构体ptMsg的值,将值拷贝至队列中
               (TickType_t)10) != pdPASS )
     
//接收消息,接收结构体的值
MSG_T ptMsg; //定义一个结构体指针
xResult = xQueueReceive(xQueue2,            
                       (void *)&ptMsg,      // 这里获取的是结构体的值
                       (TickType_t)xMaxBlockTime);/* 设置阻塞时间 */

if(xResult == pdPASS)
            {
                /* 成功接收,并通过串口将数据打印出来 */
                printf("接收到消息队列数据ptMsg.ucMessageID = %d\r\n",ptMsg.ucMessageID);
                printf("接收到消息队列数据ptMsg.ulData[0] = %d\r\n", ptMsg.ulData[0]);
                printf("接收到消息队列数据ptMsg.usData[0] = %d\r\n", ptMsg.usData[0]);
            }     

1.3 传递结构体指针和结构体本身的异同

  1. 创建消息队列时,单元大小声明不同

  2. 变量初始化不同,一个是定义指针,并所赋结构体实体是全局的,一个是定义结构体

  3. 数据输出不同,前者是用指针成员运算符“->”,后者是用结构体成员运算符

  4. 在发送消息和请求消息时,两者的格式是相同的,但意义不用,前者传递的是结构体指针的地址,后者传递的是结构体的值

vTaskDelay() 相对延时函数
宏pdMS_TO_TICKS()可用于将以毫秒为单位指定的时间转换为以ticks为单位指定的时间。例如,调用vTaskDelay(pdMS_TO_TICKS(100))将使任务保持阻塞状态100毫秒。

宏定义#define     pdMS_TO_TICKS( xTimeInMs )     
  ( ( TickType_t ) ( ( ( TickType_t ) ( xTimeInMs ) * ( TickType_t ) configTICK_RATE_HZ ) / ( TickType_t ) 1000 ) )

当任务处于阻塞状态时,它不占用CPU。
定义:每次延时从任务执行vTaskDelay()函数时开始,延时一定的时间结束。

vTaskDelay( pdMS_TO_TICKS( 100 ) );  //延时100ms

在这里插入图片描述

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值