硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3768|回复: 8
收起左侧

[RL-RTX] RTX中使用消息队列在任务间传递数组地址

[复制链接]

17

主题

32

回帖

83

积分

初级会员

积分
83
发表于 2017-8-8 15:49:12 | 显示全部楼层 |阅读模式
请教版主,一组数据在任务间如何进行传递?能使用消息队列发送数组的地址吗?例如,一个任务从SPI接口读取了一组数据,这组数据要与另一个任务数据同步,如何用数组地址传递的方式进行呢?
我的程序运行到  
  1. Spi_read_buf(0xc1,pucMsg,41);
复制代码
就会宕机,是什么原因呢?请指教,谢谢。

  1. #define PoolBlocks           5
  2. #define PoolPerBlockSize     50
  3. /* 声明一个内存池,5块,每块大小50字节 */
  4. _declare_box(mpool, PoolPerBlockSize, PoolBlocks);
  5. __task void AppTaskRead(void)
  6. {
  7.     OS_RESULT xResult;
  8.     uint8_t  *pucMsg = NULL;//这个指针用于指向待传送的数据数组
  9.     uint8_t i;
  10.     const uint16_t usMaxBlockTime = 0xffff; /* 延迟周期 */
  11.     while(1)
  12.     {
  13.         //这里等待中断发来的事件标志组
  14.         if(os_evt_wait_or(0x01FF, usMaxBlockTime) == OS_R_EVT)
  15.         {
  16.             xResult = os_evt_get ();
  17.             if(xResult == 1)
  18.             {
  19.                 /* 申请一个内存块用于8位整形变量 */
  20.                 pucMsg  = _alloc_box (mpool);
  21.                 Spi_read_buf(0xc1,pucMsg,41);
  22.                 //读取完之后就使用消息队列发出
  23.                 os_mbx_send (&mailbox, pucMsg, 100);
  24. }
  25.         }
  26.     }
  27. }
复制代码
  1. void Spi_read_buf(uint8_t add, uint8_t *pBuf, uint8_t num)
  2. {
  3.     uint8_t i = 0;
  4.     tsk_lock();
  5.     G953_CE_0();
  6.     Spi_RW(add);
  7.     while(i < num)
  8.     pBuf[i++] = Spi_RW(0);
  9.     G953_CE_1();
  10.     tsk_unlock();
  11. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106995
QQ
发表于 2017-8-9 00:26:00 | 显示全部楼层
看了下,没发现什么问题,你测试下不使用申请的动态内存,直接定义一个数组试试。
回复

使用道具 举报

17

主题

32

回帖

83

积分

初级会员

积分
83
 楼主| 发表于 2017-8-9 09:59:44 | 显示全部楼层

回 eric2013 的帖子

eric2013:
看了下,没发现什么问题,你测试下不使用申请的动态内存,直接定义一个数组试试。
您好,请教一下 一个任务通过消息队列发送数组的地址给另一个任务,如何实现?
发送的任务:
  1. uint8_t data_buf[41] = {0};
  2. __task void AppTaskReadG953(void)
  3. {
  4.     OS_RESULT xResult;
  5.     uint8_t  *pucMsg = NULL;//这个指针用于指向待传送的数据数组
  6.    
  7.     uint8_t *pt0 = NULL;
  8.     uint8_t i;
  9.     const uint16_t usMaxBlockTime = 0xffff; /* 延迟周期 */
  10.     while(1)
  11.     {
  12.         //这里等待中断发来的事件标志组
  13.         if(os_evt_wait_or(0x01FF, usMaxBlockTime) == OS_R_EVT)
  14.         {
  15.             xResult = os_evt_get ();
  16.             if(xResult == 1)
  17.             {
  18.                 pt0 = data_buf;
  19. Spi_read_buf(0xc1,data_buf,41);//读取GY953数据
  20.                 os_mbx_send (&mailbox, pt0, 100);
  21.                
  22.             }
  23.         }
  24.     }
  25. }
复制代码
接收的任务:使用一个数组接收,但是再接收后发现receive123中是一个地址,而不是一组数据,这是什么原因,请版主指教。
  1. __task void AppTaskCompassHandle(void)
  2. {
  3.     //这里等待 AppTaskReadG953 发来的消息队列,其中包含读取G953的数据数组的指针
  4.     uint8_t *pMsg;
  5.     OS_RESULT xResult;
  6.     uint8_t receive123[41] = {0};
  7.     const uint16_t usMaxBlockTime = 200; /* 延迟周期 */
  8.     while(1)
  9.     {
  10.         xResult = os_mbx_wait(&mailbox, (void *)receive123, usMaxBlockTime);
  11.         switch (xResult)
  12.         {
  13.             /* 无需等待接受到消息邮箱数据 */
  14.             case OS_R_OK:
  15.                 //printf("无需等待接受到消息邮箱数据,pMsg = %d\\r\\n", *pMsg);
  16.                 break;
  17.             /* 消息邮箱空,usMaxBlockTime等待时间从消息邮箱内获得数据 */
  18.             case OS_R_MBX:
  19.                 //pMsg = receive123;
  20. //在这里打断点后发现receive123中是一个地址(pt0所指向的),但不是data_buf中的数据。
  21.                 break;
  22. }
复制代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106995
QQ
发表于 2017-8-9 12:25:01 | 显示全部楼层
是的,RTX的消息队列就是传递的地址。可以看下这个里面消息队列的例子:http://www.armbbs.cn/forum.php?mod=viewthread&tid=14837
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2017-8-14 13:29:42 | 显示全部楼层
应该使用&receive123,这样才能从邮箱中接收邮件的数据地址,原因是c语言的基础知识,形参只能传递值给函数
回复

使用道具 举报

17

主题

32

回帖

83

积分

初级会员

积分
83
 楼主| 发表于 2017-8-15 11:36:29 | 显示全部楼层

回 myxiaonia 的帖子

myxiaonia:应该使用&receive123,这样才能从邮箱中接收邮件的数据地址,原因是c语言的基础知识,形参只能传递值给函数 (2017-08-14 13:29) 
是的您说的没错,取地址后就没有问题了
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106995
QQ
发表于 2017-8-15 11:49:53 | 显示全部楼层
当年做教程的时候,对此的详细解释。


QQ截图20170815114727.png
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2017-8-15 21:55:08 | 显示全部楼层

回 eric2013 的帖子

eric2013:当年做教程的时候,对此的详细解释。




....... (2017-08-15 11:49) 
二级指针用汇编的思路去理解是最合适的,就是一块内存的地址,rtx的membox模块大量使用这种二级指针的代码
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106995
QQ
发表于 2017-8-16 02:06:23 | 显示全部楼层

回 myxiaonia 的帖子

myxiaonia:二级指针用汇编的思路去理解是最合适的,就是一块内存的地址,rtx的membox模块大量使用这种二级指针的代码 (2017-08-15 21:55) 
[s:130]
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-13 14:01 , Processed in 0.317992 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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