新手入门
- 积分
- 10
- 金钱
- 10
- 注册时间
- 2016-6-11
- 在线时间
- 0 小时
|
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?
|
|