请选择 进入手机版 | 继续访问电脑版

安富莱电子论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 67|回复: 7
收起左侧

[RL-RTX] 关于消息邮箱发送数组数据问题请教

[复制链接]

4

主题

8

帖子

16

积分

新手上路

积分
16
发表于 2019-3-6 12:17:59 | 显示全部楼层 |阅读模式
使用RTX系统,有个任务是传感器数据采集,有个任务是GUI,我想把采集到传感器数据整理成一个数组,然后发送给GUI任务显示,这个数组有32个字节。然后参考了<V6-414_RTX实验_消息邮箱>例子,这个例子只是传了一个数据,RTX传数据实质是传了数据的地址,现在改写了程序,数据的发送改了下,只是在V6上做测试
/*
*********************************************************************************************************
* 函 数 名: AppTaskUserIF
* 功能说明: 按键消息处理  
* 形    参: 无
* 返 回 值: 无
*   优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
*********************************************************************************************************
*/
__task void AppTaskUserIF(void)
{
uint8_t ucMsg[2]={0x00,0x00};
uint8_t ucKeyCode;
    while(1)
    {
  ucKeyCode = bsp_GetKey();
  
  if (ucKeyCode != KEY_NONE)
  {
   switch (ucKeyCode)
   {
    /* K1键按下,打印调试说明 */
    case KEY_DOWN_K1:
     printf("K1键按下,使用MDK中自带的RTX调试组件,请务必使用MDK4.74版本进行调试\r\n");
     break;
    /* K2键按下,向消息邮箱发送数据 */
    case KEY_DOWN_K2:
     ucMsg[0] += 1;
     ucMsg[1] += 2;

     /* 向消息邮箱发数据,如果消息邮箱满了,等待100个时钟节拍 */
     if(os_mbx_send (&mailbox, &ucMsg, 100) != OS_R_OK)
     {
      /* 发送失败,即使等待了100个时钟节拍 */
      printf("K2键按下,向消息邮箱发送数据失败,即使等待了100个时钟节拍\r\n");
     }
     else
     {
      /* 发送成功 */
      printf("K2键按下,向消息邮箱发送数据成功ucMsg[0] = %d ucMsg[1] = %d\r\n",ucMsg[0],ucMsg[1]);      
     }
     break;
    /* 其他的键值不处理 */
    default:                     
     break;
   }
  }
  
  os_dly_wait(20);
}
}

消息的接收,例子的原写法可以收到第一个数据,但是第二个数据不知道怎么写,希望老大指导下
/*
*********************************************************************************************************
* 函 数 名: AppTaskMsgPro
* 功能说明: 消息处理,等待任务AppTaskUserIF发来的消息邮箱数据
* 形    参: 无
* 返 回 值: 无
*   优 先 级: 3  
*********************************************************************************************************
*/
__task void AppTaskMsgPro(void)
{
uint8_t *pMsg;
OS_RESULT xResult;
const uint16_t usMaxBlockTime = 200; /* 延迟周期 */
int32_t add;

    while(1)
    {
  xResult = os_mbx_wait(&mailbox, (void *)&pMsg, usMaxBlockTime);
  
  switch (xResult)
  {
   /* 无需等待接受到消息邮箱数据 */
   case OS_R_OK:
    printf("无需等待接受到消息邮箱数据,pMsg = %d\r\n", *pMsg);
    break;
   /* 消息邮箱空,usMaxBlockTime等待时间从消息邮箱内获得数据 */
   case OS_R_MBX:
    printf("消息邮箱空,usMaxBlockTime等待时间从消息邮箱内获得数据,pMsg[0] = %d\r\n", *pMsg);
    break;
   /* 超时 */
   case OS_R_TMO:
    bsp_LedToggle(1);
    bsp_LedToggle(4);
    break;
   
   /* 其他值不处理 */
   default:                     
    break;
  }
    }
}


回复

使用道具 举报

5391

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43672
QQ
发表于 2019-3-6 12:28:09 | 显示全部楼层
接收到后,pMsg[0]是第1个,pMsg[1]是第2个。
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

4

主题

8

帖子

16

积分

新手上路

积分
16
 楼主| 发表于 2019-3-6 15:27:18 | 显示全部楼层
eric2013 发表于 2019-3-6 12:28
接收到后,pMsg[0]是第1个,pMsg[1]是第2个。

嗯  感谢。然后再问个疑问
/* 声明一个支持1个消息的消息邮箱 */
os_mbx_declare (mailbox,1);
然后初始化的时候
static void AppObjCreate (void)
{
        /* 创建消息邮箱 */
        os_mbx_init (&mailbox, sizeof(mailbox));
}
sizeof(mailbox)仿真下来看是20字节,然后测试下来确实可以发送20个字节,那请问下为何mailbox为什么是占用20字节,这个是怎么计算的?
回复

使用道具 举报

5391

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43672
QQ
发表于 2019-3-6 15:37:20 | 显示全部楼层
呼哈嚯嚯 发表于 2019-3-6 15:27
嗯  感谢。然后再问个疑问
/* 声明一个支持1个消息的消息邮箱 */
os_mbx_declare (mailbox,1);

#define os_mbx_declare(
                     name,     /* 消息邮箱名 */
                     cnt )       /* 消息个数 */

U32 name [4 + cnt]
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

4

主题

8

帖子

16

积分

新手上路

积分
16
 楼主| 发表于 2019-3-6 16:08:52 | 显示全部楼层
eric2013 发表于 2019-3-6 15:37
#define os_mbx_declare(
                     name,     /* 消息邮箱名 */
                     cn ...

还是算不出是20,我按照我的需求直接写大小了。然后问下发送数组uint8_t ucMsg[2]={0x00,0x00};这个是局部,任务切换时这个数组是不是还在?然后另外个任务还能正确的取得到是吗?
回复

使用道具 举报

5391

主题

3万

帖子

4万

积分

管理员

做人第一,工作第二

Rank: 9Rank: 9Rank: 9

积分
43672
QQ
发表于 2019-3-6 16:12:22 | 显示全部楼层
呼哈嚯嚯 发表于 2019-3-6 16:08
还是算不出是20,我按照我的需求直接写大小了。然后问下发送数组uint8_t ucMsg[2]={0x00,0x00};这个是局 ...

U32 name[4 + 1]是多少字节,你算下
淘宝小店: https://armfly.taobao.com/
专注,努力,用心的做好每一件事情,Fighting!
回复

使用道具 举报

4

主题

8

帖子

16

积分

新手上路

积分
16
 楼主| 发表于 2019-3-6 16:17:14 | 显示全部楼层
eric2013 发表于 2019-3-6 16:12
U32 name[4 + 1]是多少字节,你算下

哦 U32占用4个字节,然后共5个元素,一起占用20字节,知道了。然后问下发送数组uint8_t ucMsg[2]={0x00,0x00};这个是局部,任务切换时这个数组是不是还在?然后另外个任务还能正确的取得到是吗?
回复

使用道具 举报

3

主题

407

帖子

413

积分

版主

Rank: 7Rank: 7Rank: 7

积分
413
发表于 2019-3-6 19:36:16 | 显示全部楼层
rtx下使用printf要注意多线程的问题
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|手机版|安富莱电子论坛 ( 鄂ICP备09023347号,公安机关备案号42010602000201 )

GMT+8, 2019-3-19 23:16 , Processed in 0.181772 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表