OpenEdv-开源电子网

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

关于uCOSiii的消息队列的几个疑惑

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2016-6-11
在线时间
0 小时
发表于 2016-6-11 23:43:26 | 显示全部楼层 |阅读模式
5金钱
1、如何保证消息不被覆盖
OSPost函数直接将消息的地址发布,OSPend将这个地址读取并返回。
[mw_shl_code=c,true]Task1()
{
uint16_t TouchState[2];
TouchState[0]=Touch_State.touchX[0];
TouchState[1]=Touch_State.touchY[0];

OSQPost((OS_Q*)&TS_Msg,
(void*)TouchState,
(OS_MSG_SIZE)sizeof(TouchState),
(OS_OPT)OS_OPT_POST_FIFO,
(OS_ERR*&err);
}[/mw_shl_code]
Task1中声明了一个局部的数组用来打包数据,OSPost函数直接将这个数组的地址发布
在Task2中调用OSPend函数可以得到那个数组的地址。通过在Keil中的单步运行设置断点查看两个函数中的TouchState跟Touchstate的地址可以印证这一点。
[mw_shl_code=c,true]Task2()
{
uint16_t* Touchstate;
Touchstate=OSQPend((OS_Q*)&TS_Msg,   
                          (OS_TICK        )0,
                  (OS_OPT        )OS_OPT_PEND_BLOCKING,
                  (OS_MSG_SIZE*    )&size,   
                  (CPU_TS*        )0,
                  (OS_ERR*        )&err);
}
[/mw_shl_code]
那么问题就出现了,数组是一个局部变量,函数调用完内存就被释放了。这段程序其实是能实现消息的发送的,但是有2个地方没想明白
首先,OS是如何保证函数执行完那个数组里面的内容不被擦除呢?
其次,每次发布时候都是将当前的数组地址发布,连续Post但是没有Pend就是不断存入在消息队列当中,根据实验现象发现先存入的被后存入的顶掉,这个现象跟前面的现象是能对上的:因为每次发布消息最终发布的地址是不变的。那如何才能实现一下子Post多个数据然后一个一个Pend?

最佳答案

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

用内存分配,完美解决,发送消息是申请内存,接收消息后释放内存
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

9

主题

55

帖子

0

精华

初级会员

Rank: 2

积分
115
金钱
115
注册时间
2015-9-27
在线时间
23 小时
发表于 2016-6-11 23:43:27 | 显示全部楼层
用内存分配,完美解决,发送消息是申请内存,接收消息后释放内存
回复

使用道具 举报

11

主题

80

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4493
金钱
4493
注册时间
2016-8-2
在线时间
51 小时
发表于 2016-8-10 09:50:24 | 显示全部楼层
楼主解决这个问题了吗? 我现在也很困惑
回复

使用道具 举报

18

主题

422

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1139
金钱
1139
注册时间
2014-5-24
在线时间
116 小时
发表于 2016-8-10 11:34:11 | 显示全部楼层
1、不保证,你这是错误的用法;有拿指针做值传递,不是这样用。
2、Post对象是满队列会返回错误值,不发生覆盖。
I See Fire.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.·.  只给方向,不妨碍思考
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-1 20:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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