找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5240|回復: 0
收起左側(cè)

干貨!基于OS應用中的中斷處理

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


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


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

回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表