程序的错误结果分析

运行11月17日的程序(消息邮箱的使用)总有错误发生,下面是对结果的分析:

(1)times=0说明Task1执行,发送一个邮箱,然后Times自加,Times=1。 

(2)接着执行Task2,times2=0,ss=1,说明Task2执行一次并顺利获得邮箱,接着times自加,times2=1。

(3)times2=1,ss=-369098697说明Task2执行一次,并且获得了邮箱,且邮箱的内容是-369098697,times2自加,times2=2。但这个是错误的。因为此时Task1没有执行,则Task1并没有给邮箱发消息,那么Task2就不应该得到邮箱的消息,即使得到了也是错误的。由此可见,程序里这句指令:ss=OSMboxPend(strbox,10,&err);发生了错误。

(4)times=1,说明Task1执行,发送了一个邮箱,然后times=2。

(5)times2=2,ss=2,说明Task2执行一次,并正确获得了(4)中Task1发出的邮箱,接着times2=3;

(6)times2=3,times=2,ss=3, 说明Task2执行,刚发出times2,就被task1夺去处理器,运行task1,Task1顺利执行,并正确发出邮箱,times=3。然后处理器归还task2,接着执行task2。由于task1刚刚发出邮箱,task2就顺利获得了邮箱,发出了正确的ss,并有times2=4;

(7)times2=4,ss=-369098697,说明task2运行又有错误发生,调用这句指令ss=OSMboxPend(strbox,10,&err);的时候,邮箱里没有数值,却返回了一个错误的数值给了ss。

因此,问题的关键在于:如果Task1发出了邮箱,那么Task2就能正确获得邮箱的数据,但是如果task2请求邮箱,而邮箱为空的时候,并没有执行任务调度,而是Task2就获得了一个错误的数据。所以我应该好好分析一下邮箱的请求函数。如果邮箱中有数据,请求函数时如何处理的;如果邮箱中没有数据,请求函数又是如何处理的,从而找到问题的所在

后来在Task2中添加测试条件if(err==OS_NO_ERR),程序得以正确执行。  归根结底原因还是在于Task2请求邮箱时,可能并没有读到邮箱值,要判断程序是否执行正确,参数err 就非常有用处了,所以要使程序更加完善就应该注意err的存在,并对其作测试,以保证程序的可靠性

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章