1. 程式人生 > >μC/OS-Ⅲ作業系統中斷管理的直接釋出與延遲釋出

μC/OS-Ⅲ作業系統中斷管理的直接釋出與延遲釋出

直接釋出和延遲釋出也是為了解決臨界區程式碼的問題。所以先行解釋一下臨界區程式碼。 臨界區程式碼是指必須連續執行的一段程式碼,不能被中斷或者任務來打斷。譬如


//臨界區程式碼開始
.......
switch(globalvalue)
case 1://do something
case 2:
case 3:
.......
.......
//臨界區程式碼結束

globalvalue是定義的一個全域性變數,如果打斷了臨界區程式碼,在中斷或者其他任務修改了globalvalue的值,那麼再次回到這個switch判斷時,結果就不正確了。這時就需要對這段程式碼進行保護。

1.如果在中斷或者任務中都有可能訪問臨界區程式碼,則採用關中斷的方式。也即直接釋出 直接釋出

2.如果僅僅有可能在任務中訪問臨界區程式碼,則採用延遲釋出。延遲釋出的優勢是能大大減少關中斷的時間,這樣使得中斷響應就會快一點。因為它把中斷需要做的函式呼叫和相應的引數寫到了一個佇列中,由中斷處理任務來執行它們,中斷處理任務也是一個任務,這時只要把任務排程器鎖定了,就可以防止其他任務訪問臨界區的程式碼了。所以關中斷的時間僅僅為中斷處理任務從佇列中提取函式呼叫的時間,大大縮短了。 在這裡插入圖片描述 思考: 1.其實從本質上講,直接釋出的意思是指直接在中斷服務函式裡面釋出訊息或者訊號,而延遲釋出則是要先放進一個佇列,然後再由一個任務來發布訊息或者訊號,這就相當於延遲的意思啦 2.再仔細想想怎樣用延遲釋出來取代直接釋出,這好辦。就是中斷服務程式不要直接做釋出函式呼叫,而是將函式寫入到佇列中去,交由中斷處理任務來做函式呼叫。其他的中斷服務程式也這麼寫。那也就不存在其他的中斷服務程式會訪問本次中斷服務程式的臨界區程式碼的問題了,所以中斷關斷的時間不就減少了嗎,當然相應鎖定任務排程器的時間就變長了,也就是等價於任務延遲時間變大了。
3.什麼時候用直接釋出,什麼時候用延遲釋出。這取決於我們的應用程式對中斷響應時間和任務響應時間的要求