硬汉嵌入式论坛

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

[μCOS-III] 关于uCOSiii的消息队列的几个疑惑

[复制链接]

1

主题

0

回帖

1

积分

新手上路

积分
1
发表于 2016-6-11 23:39:04 | 显示全部楼层 |阅读模式
1、如何保证消息不被覆盖
OSPost函数直接将消息的地址发布,OSPend将这个地址读取并返回。
  1. Task1()
  2. {
  3. uint16_t TouchState[2];
  4. TouchState[0]=Touch_State.touchX[0];
  5. TouchState[1]=Touch_State.touchY[0];
  6. OSQPost((OS_Q*)&TS_Msg,
  7. (void*)TouchState,
  8. (OS_MSG_SIZE)sizeof(TouchState),
  9. (OS_OPT)OS_OPT_POST_FIFO,
  10. (OS_ERR*&err);
  11. }
复制代码
Task1中声明了一个局部的数组用来打包数据,OSPost函数直接将这个数组的地址发布
在Task2中调用OSPend函数可以得到那个数组的地址。通过在Keil中的单步运行设置断点查看两个函数中的TouchState跟Touchstate的地址可以印证这一点。
  1. Task2()
  2. {
  3. uint16_t* Touchstate;
  4. Touchstate=OSQPend((OS_Q*)&TS_Msg,  
  5.                           (OS_TICK        )0,
  6.                   (OS_OPT        )OS_OPT_PEND_BLOCKING,
  7.                   (OS_MSG_SIZE*    )&size,    
  8.                   (CPU_TS*        )0,
  9.                   (OS_ERR*        )&err);
  10. }
复制代码
那么问题就出现了,数组是一个局部变量,函数调用完内存就被释放了。这段程序其实是能实现消息的发送的,但是有2个地方没想明白
首先,OS是如何保证函数执行完那个数组里面的内容不被擦除呢?
其次,每次发布时候都是将当前的数组地址发布,连续Post但是没有Pend就是不断存入在消息队列当中,根据实验现象发现先存入的被后存入的顶掉,这个现象跟前面的现象是能对上的:因为每次发布消息最终发布的地址是不变的。那如何才能实现一下子Post多个数据然后一个一个Pend?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
107049
QQ
发表于 2016-6-12 00:11:25 | 显示全部楼层
1.  不要用这种局部变量,如果你要这么用的话,建议使用uCOS的内存管理函数申请变量空间或者使用不被释放的局部变量,即定义的任务代码里面开始的地方申请,使用指针变量传递到你的这个函数里面

2. 你的消息队列设置的多大,不会顶掉的,如果消息队列满了会返回错误OS_ERR_INT_Q_FULL或OS_ERR_Q_MAX, 消息队列已经满。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 07:47 , Processed in 0.256153 second(s), 31 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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