中级会员
 
- 积分
- 437
- 金钱
- 437
- 注册时间
- 2013-4-9
- 在线时间
- 76 小时
|
5金钱
程序思路是这样的:
创建Task1、Task2、软件定时器1、消息对象KEY_Msg;
Task1任务:等待消息,打印出消息内容
************************************
while (1)
{
KeyIdx=OSQPend((OS_Q* )&KEY_Msg,
(OS_TICK )0,
(OS_OPT )OS_OPT_PEND_BLOCKING,
(OS_MSG_SIZE* )&size,
(CPU_TS* )0,
(OS_ERR* )&err);
printf("\r\n OSQPend %d", *KeyIdx);
}
**************************************
软件定时器1任务:扫描2个按键,有按键按下发送消息;
**************************************
ucKeyIdx = KeyScan(0);
if(ucKeyIdx != 0)
{
printf("\r\n OSQPost %d", ucKeyIdx);
OSQPost((OS_Q* )&KEY_Msg,
(void* )&ucKeyIdx,
(OS_MSG_SIZE)1,
(OS_OPT )OS_OPT_POST_FIFO,
(OS_ERR* )&err);
printf("\r\n err %d", err);
}
**************************************
运行结果:
OSQPost 1
err 0
OSQPend 0
OSQPost 2
err 0
OSQPend 0
那么问题来了,为什么Task1能收到消息,但是消息的结果是0呢?
PS:如果不用软件定时器扫描按键,而用Task2扫描按键,
运行结果:
OSQPost 1
OSQPend 1
err 0
OSQPost 2
OSQPend 2
err 0
结果正确,请问大虾,这是为什么呀???
|
最佳答案
查看完整内容[请看2#楼]
没人给出答案,自己解决了,O(∩_∩)O哈哈哈~
在消息发送时,实际上只是发送消息指针,不管是消息本身是什么数据类型,发送的指针都被理解为(void*)。在接收方得到这个消息指针后,通过指针来获取真正的消息内容。
如果发送消息的是任务(不是ISR),那么任务没有删除,保存消息的变量(不管是全局还是局部),总是存在的,接收消息的一方总是能够通过指针访问到这个变量,从而得到消息内容。
如果用ISR的局部变量来保存消息,则 ...
|