呼哈嚯嚯 发表于 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={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 += 1;
   ucMsg += 2;

   /* 向消息邮箱发数据,如果消息邮箱满了,等待100个时钟节拍 */
   if(os_mbx_send (&mailbox, &ucMsg, 100) != OS_R_OK)
   {
      /* 发送失败,即使等待了100个时钟节拍 */
      printf("K2键按下,向消息邮箱发送数据失败,即使等待了100个时钟节拍\r\n");
   }
   else
   {
      /* 发送成功 */
      printf("K2键按下,向消息邮箱发送数据成功ucMsg = %d ucMsg = %d\r\n",ucMsg,ucMsg);      
   }
   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 = %d\r\n", *pMsg);
    break;
   /* 超时 */
   case OS_R_TMO:
    bsp_LedToggle(1);
    bsp_LedToggle(4);
    break;
   
   /* 其他值不处理 */
   default:                     
    break;
}
    }
}


eric2013 发表于 2019-3-6 12:28:09

接收到后,pMsg是第1个,pMsg是第2个。

呼哈嚯嚯 发表于 2019-3-6 15:27:18

eric2013 发表于 2019-3-6 12:28
接收到后,pMsg是第1个,pMsg是第2个。

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

eric2013 发表于 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

呼哈嚯嚯 发表于 2019-3-6 16:08:52

eric2013 发表于 2019-3-6 15:37
#define os_mbx_declare(
                     name,   /* 消息邮箱名 */
                     cn ...

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

eric2013 发表于 2019-3-6 16:12:22

呼哈嚯嚯 发表于 2019-3-6 16:08
还是算不出是20,我按照我的需求直接写大小了。然后问下发送数组uint8_t ucMsg={0x00,0x00};这个是局 ...
U32 name是多少字节,你算下

呼哈嚯嚯 发表于 2019-3-6 16:17:14

eric2013 发表于 2019-3-6 16:12
U32 name是多少字节,你算下

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

myxiaonia 发表于 2019-3-6 19:36:16

rtx下使用printf要注意多线程的问题
页: [1]
查看完整版本: 关于消息邮箱发送数组数据问题请教