程序的錯誤結果分析

運行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的存在,並對其作測試,以保證程序的可靠性

 

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