胡说的,仅供参考:
情况1:情况1只能说或许正常,当两个中断(函数名为XXX_Handler,姑且当成中断。如果不是,那就算了)紧挨着,也就是说当一个中断向 InMsg 发送了邮件后,还没有任务提取邮件前,另一个中断发生,则后一个邮件将被丢弃;
情况2:参考情况1,不用多说了,情况2就是情况1的极端情况,OSMboxPost(InMsg,&input); 将被无情地抛弃了;
局部变量:按理说是可以收到邮件的,只是不一定正确罢了,不知楼主为何说收不到。如果是在中断例程的局部变量,那么接收到正确邮件只是偶然,错误才是应该的。在中断例程退出之前,不会发生调度。中断例程退出后,局部变量失效,相应的内存将被其他程序使用,因此数值上将发生变化。于是邮件接收方就将接收到错误的邮件了。
而在普通任务中,只要接收方在这个局部变量失效前能收到邮件,就不会出问题。
比如:
void Task1(void *arg)
{
uint8 err;
uint8 mail = 0;
while(1){
OSMboxPost(InMsg1,&mail);
OSMboxPend(InMsg2,0,&err);
}
}
void Task2(void *arg)
{
uint8 err;
uint8 mail = 0;
while(1){
OSMboxPost(InMsg2,&mail);
OSMboxPend(InMsg1,0,&err);
}
}
而这样,就不好说了:
void PostMail1(void)
{
uint8 mail = 0;
OSMboxPost(InMsg1,&mail);
}
void Task1(void *arg)
{
uint8 err;
while(1){
PostMail1();
OSMboxPend(InMsg2,0,&err);
}
}
void PostMail2(void)
{
uint8 mail = 0;
OSMboxPost(InMsg2,&mail);
}
void Task2(void *arg)
{
uint8 err;
while(1){
PostMail2();
OSMboxPend(InMsg1,0,&err);
}
}
|