OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 10034|回复: 10

关于ucosiii 消息队列的发送个数问题?

[复制链接]

38

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2014-8-1
在线时间
6 小时
发表于 2015-7-13 14:31:30 | 显示全部楼层 |阅读模式
5金钱
OSQPost() 每次只发送一条消息,但是目前我有DMA接收到串口的8个数据,能不能一次消息队列就发送完成,而不用发送8个才发送完成?

最佳答案

查看完整内容[请看2#楼]

将你的8个数据组合在一个数组中,然后使用POST函数直接发送这个消息(数组),这样你不就一次发送完8个数据了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-13 14:31:31 | 显示全部楼层
将你的8个数据组合在一个数组中,然后使用POST函数直接发送这个消息(数组),这样你不就一次发送完8个数据了。
开往春天的手扶拖拉机
回复

使用道具 举报

38

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2014-8-1
在线时间
6 小时
 楼主| 发表于 2015-7-13 14:51:20 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------

OSQPost((OS_Q* )&DATA_Msg,
(void* )Rx_Buffer,
(OS_MSG_SIZE)8,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR* )&err);
不是这个函数每次只发送一次数据吗?  RX_BUFFER是有8个数据的数组?
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-13 14:54:18 | 显示全部楼层
OSQPost()一次是只能发送一次数据,但没说一次数据只能是一个字节的!
开往春天的手扶拖拉机
回复

使用道具 举报

38

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2014-8-1
在线时间
6 小时
 楼主| 发表于 2015-7-13 15:40:49 | 显示全部楼层
你的意思我知道,但是这个你就是要把RX_BUFFER的八个数据整合成一个数据,这样做有点复杂,移植起来不容易!
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-13 23:14:40 | 显示全部楼层
回复【5楼】静:
---------------------------------
UCOS的消息队列只管发送消息,不管组合消息,所以需要我们提前准备好消息的,然后直接用消息队列发送。正如我们通过邮局寄东西,邮局肯定不可能把你要寄的东西都准备好,然后在寄过去,肯定是你自己把要寄的东西都准备好,然后邮局最多包装一下然后给你寄出去的。
开往春天的手扶拖拉机
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165377
金钱
165377
注册时间
2010-12-1
在线时间
2111 小时
发表于 2015-7-13 23:20:49 | 显示全部楼层
楼主不会用指针。
好好学习下吧。说多了也不懂。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

38

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2014-8-1
在线时间
6 小时
 楼主| 发表于 2015-7-14 10:54:34 | 显示全部楼层
回复【2楼】zuozhongkai:
---------------------------------
OSQPost((OS_Q* )&DATA_Msg,
(void* )Rx_Buffer,
(OS_MSG_SIZE)8,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR* )&err);
*************************************************************
p=OSQPend((OS_Q* )&DATA_Msg,   
  (OS_TICK )0,
                  (OS_OPT )OS_OPT_PEND_BLOCKING,
                  (OS_MSG_SIZE* )8,
                  (CPU_TS* )0,
                  (OS_ERR* )&err);
recevie[k++]=p[0]>>24;
recevie[k++]=p[1]>>16;
recevie[k++]=p[2]>>8;
recevie[k++]=p[3];
recevie[k++]=p[4];
recevie[k++]=p[5];
recevie[k++]=p[6];
recevie[k++]=p[7];
现在是整合到Rx_Buffer数组中去,8个数,发送的是地址,现在有一个疑问我发送和等待的OS_MSG_SIZE为1的时候也可以,因为只要你发送一个首地址,这8个数自然而然的可以得到,疑问为什么有OS_MSG_SIZE这一选项,我发送消息只是发送地址,有了地址自然就可以得到消息?可能问题问的很幼稚,卡主了我!
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2015-7-14 11:28:39 | 显示全部楼层
OSQPost()中参数msg_size用来通知你要发送的消息长度,这样使用OSQPend()请求到这个消息的话,此消息长度就会保存在参数p_msg_size中,这个消息长度值就是OSQPost()中参数msg_size设置的。但是这个对于你整个的消息接收没有任何影响(你可以看这两个函数的源码),正如你所说的,UCOSIII中的消息只是一个地址。所以说你的程序中消息长度实际上是8个字节,但是你的消息长度写成了1,结果能正常接收消息。也就是说消息的正常接收和你msg_size或者p_msg_size设置是没有关系的,不过你在使用中最好设置正确,不要乱写,消息长度是多少就是多少。不要怀疑UCOSIII里面这么做是不是没用,很鸡肋,只是你没用到这个功能而已,所以还感觉不到他的好处。
开往春天的手扶拖拉机
回复

使用道具 举报

38

主题

109

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
294
金钱
294
注册时间
2014-8-1
在线时间
6 小时
 楼主| 发表于 2015-7-14 12:30:54 | 显示全部楼层
回复【9楼】zuozhongkai:
---------------------------------
恩 谢谢
回复

使用道具 举报

29

主题

73

帖子

0

精华

高级会员

Rank: 4

积分
511
金钱
511
注册时间
2015-10-11
在线时间
102 小时
发表于 2016-10-7 17:05:35 | 显示全部楼层
静 发表于 2015-7-14 10:54
回复【2楼】zuozhongkai:
---------------------------------
                OSQPost((OS_Q*                )&DATA_Msg,               
                                (void* ...

但是,你发送过去的是一个地址,怎么又能P[1],P[2]的分啊
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-28 21:32

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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