|
1:基本的ISR要素
在μC/OS-II和μC/OS-III中,中斷處理中與內核相關的代碼并不一定由應用開發人員實現。
實時內核可以被視為任務管理器,是一個將應用開發人員編寫的代碼作為任務集合在一起的軟件模塊。大多數基于OS的應用,不僅僅包含任務。通常情況下,基于OS應用的開發人員會整合任務與中斷服務程序(ISR),以滿足系統需求。
基于OS應用中的ISR會根據使用內核的不同,采用不同的格式。翻閱過Micriμm的μC/OS-II和μC/OS-III內核書的人,會了解到μC/OS-II和μC/OS-III中,提供了類似于下面的ISR例子。App_ISR()在該函數的中間部分調用,App_ISR()表示ISR應用相關的部分,而該例子的偽代碼部分與內核相關。
ExampleISR:
Save CPU registers;
OSIntEnter();
App_ISR();
OSIntExit();
Restore CPU registers;
Return
ISR中描述的許多操作是為了易于搶占(一個較高優先級任務需要從一個較低優先級的任務中獲取CPU使用權的機制)。偽代碼首先保存寄存器,確保即使App_ISR()的行為使一個新的任務就緒運行,中斷處理之前正在運行的任務最終能夠恢復其執行。保存寄存器后,調用OSIntEnter(),遞增計數器來通知內核正在處理中斷,后面,類似的調用OSIntExit(),遞減計數器。如果計數器減為零(即沒有額外的中斷嵌套處理),OSIntExit()運行內核調度器,確定ISR應該返回被中斷的任務,或者由于App_ISR()的行為,導致中斷的任務被搶占。
雖然這個例子的偽代碼被認為是μC/OS-II和μC/OS-III中“典型”的ISR,應用程序開發人員并非總是需要實現該函數執行的所有操作。某些微控制器的中斷控制器允許OS能夠輕松地將保存寄存器,恢復寄存器,調用OSIntEnter()和OSIntExit()的代碼包含在BSP或啟動代碼中,應用開發人員僅負責App_ISR()。很多“經典”的ARM處理器,如ARM7和ARM9系列的處理器,使用一個入口處理中斷請求(IRQ),可以使用這種方法。

確定那些代碼需要寫到用戶自己的ISR中,可以查閱Micriμm的豐富的應用文檔,包括μC/OS-III的書,文檔中包含硬件無關的內容(包括該版本更詳細的偽代碼),例程介紹和特定硬件平臺的底層代碼。書中的示例項目及其他的例子都可以在Micrium公司的網站下載,這些例程也是中斷相關信息的理想參考源。基于μC/OS-II或μC/OS-III的例程中,至少實現了一個ISR-節拍中斷,內核通過該中斷實現時間相關的服務,很多例程中包含額外的ISR,你可以使用其作為自己代碼的模板。
通過參考Micriμm例程建立的代碼,可以確保你的ISR工作正常。然而,并不意味著,你的實現與例程完全一致。在μC/OS-II和μC/OS-III中,ISR不受內核管理也是可以的,但需具備一些關鍵條件。下面將討論這個話題。
2:不受內核監控的中斷處理
基于μC/OS-II和μC/OS-III的應用程序中經常使用不受內核監控的ISR,以快速響應某些事件。
在中斷處理的第一節,展示了Micriμm的μC/OS-II和μC/OS-III中典型的ISR格式。本文中,將介紹另一種類型的不受內核監控的ISR。與第一種方式相比,這種方式系統開銷小,但它并不適用于所有的ISR。
不受內核監控的方式用于不需要使用內核服務的ISR,例如,不需要發送消息到消息隊列或給任務發信號量的ISR中。使用不受內核監控的ISR的前提是,該中斷永遠不會導致搶占發生。換句話說,由于它們不涉及任何內核服務,永遠不會導致其他任務就緒。這種類型的ISR不會調用任何導致搶占發生的內核服務。
開發不受內核監控的ISR的關鍵是ISR嵌套。通常,μC/OS-II和μC/OS-III支持中斷嵌套。然而,開發人員在實現受內核管理和不受內核管理的ISR時,應該努力確保前者不能中斷后者。對于這種情況,采用優先級機制是理想的方式,如下圖所示,不受內核管理的中斷優先級高于受內核管理的中斷。

第一節中提供的ISR例程中包含了了兩個內核函數調用–OSIntEnter()和OSIntExit(),在不受內核監控的ISR中,不需要這兩個函數。因此,該類型的ISR格式如下所示。應該指出的是,保存CPU寄存器的方法不一定相同,因為它可能不需要保存所有涉及上下文切換的寄存器。此外,開發不受內核監控的ISR的開發人員需牢記,前面的ISR代碼中可以添加代碼來重新啟用中斷,以實現中斷嵌套,然而,在不受內核監控的ISR中,這種處理方式是有問題的。
NonKernelAwareISR:
Save CPU registers;
App_ISR();
Restore CPU registers;
Return
在μC/OS-II和μC/OS-III觀察到的中斷例程的不同方式,使得寫這些代碼的工作變得有挑戰性。然而,根據上面的信息和前一篇文章的內容,總結出實現ISR開發的兩條基本規則:
應用開發人員需基于不同的中斷控制器,實現中斷相關的代碼,參考Micriμm的文檔和示例項目來確定適用于用戶平臺的 “典型”的ISR。
如果ISR程序不使用內核服務,不會被使用內核服務的程序中斷,可以使用不受內核監控的方式實現ISR,減少系統開銷。
基于這些規則,你可以充分利用嵌入式微控制器的功能,使用任務和中斷編寫可靠的應用程序。更多信息可以參考μC/OS-II和μC/OS-III書及在線文檔。
|
|