Microsoft Windows CE .NET 中的中断体系结构
概述
通過 Microsoft Windows CE .NET,Microsoft 已經(jīng)升級(jí)了 Windows CE 的中斷體系結(jié)構(gòu)。該操作系統(tǒng) (OS) 所具有的處理共享中斷的能力極大地?cái)U(kuò)展了 Windows CE .NET 支持許多中斷體系結(jié)構(gòu)的能力。本文從原始設(shè)備制造商 (OEM) 和應(yīng)用程序開發(fā)人員的角度探討了處理中斷的方案。本文還探討了 OEM 適配層 (OAL) 中斷服務(wù)例程 (ISR) 處理;提供了可安裝 ISR,包括一個(gè)簡(jiǎn)單的入門級(jí)外殼程序;介紹了中斷服務(wù)線程 (IST) 中斷處理,并提供了一個(gè)初始化和執(zhí)行模板。最后,本文分析了 ISR 和 IST 的延遲根源。
返回頁(yè)首中斷體系結(jié)構(gòu)
探討 Microsoft Windows CE .NET 中斷體系結(jié)構(gòu)的第一步是定義中斷過程中硬件、內(nèi)核、OAL 和線程交互的總體模型。下圖大概說明了這些不同級(jí)別的職責(zé)以及導(dǎo)致狀態(tài)變化的轉(zhuǎn)換。
圖 1.
該圖闡述了中斷過程中的主要轉(zhuǎn)換,時(shí)間按從左到右的順序遞增。該圖的最低層為硬件和中斷控制器的狀態(tài)。次低層是中斷服務(wù)過程中的內(nèi)核交互。OAL 描述了主板支持軟件包 (BSP) 的職責(zé)。最頂層闡述了中斷服務(wù)所需的應(yīng)用程序或驅(qū)動(dòng)程序線程交互。該圖闡述了單個(gè)中斷過程中的交互;它表示了 Windows CE .NET 擁有共享中斷的新能力。
活動(dòng)從該圖最左側(cè)部分以直線表示的中斷開始。生成了一個(gè)異常,導(dǎo)致內(nèi)核 ISR 向量被加載到處理器中。內(nèi)核 ISR 與硬件交互,禁用所有處理器上的所有具有相同和較低優(yōu)先級(jí)的中斷(ARM 和 Strong ARM 體系結(jié)構(gòu)除外)。然后,內(nèi)核推進(jìn)到已為該特定中斷注冊(cè)的 OAL ISR。此后,OAL ISR 既可以直接處理中斷,也可以使用 NKCallIntChain 遍歷已安裝的 ISR 列表。主 ISR 或任何已安裝的 ISR 隨后執(zhí)行任意工作,并且為該設(shè)備返回名為 SYSINTR 的映射中斷。如果該 ISR 確定其相關(guān)設(shè)備沒有導(dǎo)致該中斷,該 ISR 將返回 SYSINTR_CHAIN,這會(huì)使 NKCallIntChain( ) 遍歷 ISR 列表以到達(dá)鏈中的下一個(gè)中斷。ISR 按照它們的安裝順序調(diào)用(它們?cè)诎惭b時(shí)會(huì)在調(diào)用列表上創(chuàng)建一個(gè)優(yōu)先級(jí))。
在調(diào)用了單個(gè) ISR 或其相關(guān) ISR 鏈之后,返回值可能為下列值之一:
| SYSINTR_NOP | 中斷不與設(shè)備的任何已注冊(cè) ISR 關(guān)聯(lián)。內(nèi)核啟用所有其他中斷。 |
| SYSINTR | 中斷與已知的已注冊(cè) ISR 和設(shè)備關(guān)聯(lián)。 |
| SYSINTR_RESCHED | 中斷是由請(qǐng)求 OS 重新調(diào)度的計(jì)時(shí)器到期引起的。 |
SYSINTR 返回值是我們討論的重點(diǎn)。一旦 ISR 完成,內(nèi)核將重新啟用處理器上除已識(shí)別的中斷之外的所有中斷。然后,內(nèi)核將通知與 SYSINTR 值關(guān)聯(lián)的事件。
然后,驅(qū)動(dòng)程序或應(yīng)用程序的 IST 將能夠運(yùn)行(假設(shè)它是準(zhǔn)備好運(yùn)行的最高優(yōu)先級(jí)線程)。IST 將與相關(guān)設(shè)備通訊,并從完成它的中斷交互的設(shè)備中讀取所有必要的數(shù)據(jù)。然后,IST 用關(guān)聯(lián)的 SYSINTR 值來調(diào)用 InterruptDone( ),以通知它已完成。
內(nèi)核在接收到 SYSINTR 值的 InterruptDone 時(shí),將重新啟用指定的中斷。只有從這時(shí)開始,才能接收該設(shè)備的其他中斷。
這只是對(duì) Windows CE .NET 內(nèi)部活動(dòng)的中斷序列的一個(gè)粗略介紹。現(xiàn)在,我們將詳細(xì)研究上述每個(gè)組件及其職責(zé)。
返回頁(yè)首OAL ISR 處理
OAL ISR 是屬于平臺(tái)的基本中斷處理程序。下面是 X86 平臺(tái)的實(shí)際 ISR。配置分析和 ILTiming 支持已被刪除。X86 ISR 是所有基于 Windows CE 的平臺(tái)的代表。它演示了能夠處理系統(tǒng)中所有中斷的單個(gè) ISR。
該 ISR 的目標(biāo)是向內(nèi)核交還引起中斷的相關(guān)設(shè)備的 SYSINTR 號(hào)。ISR 執(zhí)行以下活動(dòng)序列。
-
從 PICGetCurrentInterrupt (PIC) 中獲取當(dāng)前硬件中斷
-
如果該中斷是 INTR_TIMER0(系統(tǒng)計(jì)時(shí)器)
-
更新OS 的 CurMSec 保持時(shí)間
-
檢查并確認(rèn)是否已經(jīng)注冊(cè)了重新啟動(dòng)地址 (RebootHandler)
-
-
如果中斷是 INTR_RTC
-
ISR 檢查并確認(rèn)鬧鐘是否已到期 (SYSINTR_RTC_ALARM)
-
-
如果中斷小于 INTR_MAXIMUM
-
調(diào)用中斷鏈 (NKCallIntrChain)
-
將 NKCallIntrChain 的返回值設(shè)置為該返回值
-
如果中斷鏈未包含中斷:(SYSINTR_CHAIN)
映射當(dāng)前硬件中斷 (OEMTranslateIRQ)
如果該中斷被注冊(cè)到 OEMInit 中的 HookInterrupt
從 OEMTranslateIRQ 返回 SYINTR 值
如果該中斷未注冊(cè),則返回 SYSINTR_NOP
-
啟用除當(dāng)前中斷以外的所有中斷。(PICEnableInterrupt}
-
完成恰當(dāng)?shù)闹袛嘟Y(jié)束工作以通知 PIC 中斷已完成 (EOI)
-
-
ISR 返回下列值之一:
-
SYSINTR_NOP — 沒有任何 ISR 包含該中斷
-
SYSINTR_RESCHED — 重新調(diào)度計(jì)時(shí)器已到期
-
SYSINTR — ISR 已經(jīng)包含該中斷
-
SYSINTR_RTC_ALARM — 鬧鐘已到期
-
如果 ISR 沒有為已經(jīng)用 OAL 的 OEMInit 中的 HookInterrupt 初始化的中斷安裝,則該 ISR 將返回適當(dāng)?shù)?SYSINTR 值。
注 如果只能通過 IST 交互為設(shè)備提供服務(wù),則不需要為中斷安裝可安裝的 ISR。通過對(duì) OAL 的 OEMInit 中的 HookInterrupt 進(jìn)行調(diào)用以啟用中斷就足夠了。
ISR 代碼是一段非常小且快速的代碼。它的執(zhí)行時(shí)間將直接影響整個(gè)系統(tǒng)中的中斷的延遲。Windows CE 3.0 中引入的中斷體系結(jié)構(gòu)更改是能夠嵌套中斷。在進(jìn)入 OAL ISR 的那一刻,所有具有較高優(yōu)先級(jí)的中斷都已被啟用。ISR 可能被占先。如果該 ISR 內(nèi)部的計(jì)時(shí)非常關(guān)鍵,則可能要求在該時(shí)間段內(nèi)禁用中斷。就像 ISR 執(zhí)行時(shí)間一樣,中斷被關(guān)閉的這一時(shí)間將增加平臺(tái)的最差情形延遲。
當(dāng) ISR 交還與特定設(shè)備相關(guān)的 SYSINTR 時(shí),內(nèi)核將通知 IST 醒來。處理驅(qū)動(dòng)程序或應(yīng)用程序內(nèi)部代碼的 IST 中斷負(fù)責(zé)結(jié)束中斷交互。
返回頁(yè)首可安裝的 ISR
可安裝的 ISR 是為響應(yīng) Windows CE .NET 為嵌入式空間帶來的開放性而創(chuàng)建的。OEM 再也不必完全負(fù)責(zé)平臺(tái)和應(yīng)用程序代碼了。現(xiàn)在平臺(tái)提供商和應(yīng)用程序開發(fā)人員都可涉及嵌入式空間這一領(lǐng)域的工作。如果某個(gè)應(yīng)用程序開發(fā)人員在使用 Windows CE 3.0 的平臺(tái)上向開放總線添加了新的設(shè)備,OEM 將必須說服該 OEM 將 ISR 添加到該平臺(tái)。
要將 ISR 安裝到平臺(tái)中,需要完成兩個(gè)步驟:
-
調(diào)用 LoadIntChainHandler 函數(shù)以加載包含 ISR 代碼的 DLL。
-
必須將 ISR 編碼為用 SYSINTR_ . . . 響應(yīng)進(jìn)行響應(yīng),就像在 OAL ISR 中一樣。
LoadIntChainHandler 函數(shù)將 ISR 動(dòng)態(tài)鏈接庫(kù) (DLL) 加載到內(nèi)核的地址空間中。這意味著代碼不能調(diào)用任何非內(nèi)核函數(shù),包括任何 C 語(yǔ)言運(yùn)行時(shí)庫(kù)函數(shù)。記住,某些結(jié)構(gòu)到結(jié)構(gòu)賦值會(huì)降格為 memcpy 調(diào)用,必須檢查所有代碼以確保不需要任何外部庫(kù)(即使這些庫(kù)是由編譯器創(chuàng)建的)。
下面的源代碼示例說明了一個(gè)用于創(chuàng)建可安裝的 ISR 的基本外殼程序。有四個(gè)函數(shù):
-
DLLEntry — 接收進(jìn)程和線程附加消息
-
InfoCopy — 在進(jìn)行任何結(jié)構(gòu)賦值時(shí)使用的復(fù)制例程
-
IOControl — 任何使用 KernelLibIOControl 的 IST 調(diào)用的處理程序
-
ISRHandler — 實(shí)際的 ISR
ISR 處理程序代碼使用端口 I/O 調(diào)用來檢查設(shè)備的狀態(tài)。您的方案可能要求復(fù)雜得多的詢問。如果該設(shè)備不是中斷源,則返回值將是 SYSINTR_CHAIN。此返回值告訴 NKChainIntr 函數(shù)該設(shè)備不是中斷源,應(yīng)該評(píng)估鏈中的其他 ISR。如果 ISR 返回有效的 SYSINTR,則 NKChainIntr 將立即返回并且不調(diào)用列表中的任何其他 ISR。這將提供優(yōu)先級(jí)排序。第一個(gè)加載的可安裝 ISR 被首先加載到該列表中(或具有最高優(yōu)先級(jí)),然后將后續(xù)可安裝 ISR 添加到該列表的底部。由于優(yōu)先級(jí)和執(zhí)行速度這兩方面的原因,應(yīng)該首先安裝鏈中具有最高優(yōu)先級(jí)的可安裝 ISR。
返回頁(yè)首IST 中斷處理
處理來自應(yīng)用程序或驅(qū)動(dòng)程序的中斷需要進(jìn)行兩個(gè)步驟的處理。首先,必須使用關(guān)聯(lián)的事件初始化中斷。其次,IST 必須等待中斷事件以響應(yīng)內(nèi)核中的中斷。
中斷初始化
以下示例代碼將設(shè)置 IST 并將 IST 與特定的中斷相關(guān)聯(lián)。初始化中斷的關(guān)鍵步驟包括:
-
創(chuàng)建事件
-
獲取 IRO 的系統(tǒng)中斷號(hào)
-
創(chuàng)建掛起的中斷線程 (IST)
-
調(diào)用 InterruptInitialize 以創(chuàng)建 IRQ 與事件之間的關(guān)聯(lián)
-
創(chuàng)建未掛起的 IST 可能會(huì)導(dǎo)致 InterruptInitialize 失敗,因?yàn)樵撌录呀?jīng)處于被等待狀態(tài)
-
-
將線程優(yōu)先級(jí)設(shè)置為相應(yīng)的優(yōu)先級(jí)
-
恢復(fù) IST
需要注意的是,對(duì) InterruptInitialize 的調(diào)用僅采用 SYSINTR 值和事件作為參數(shù)。內(nèi)核不知道或者不關(guān)心將要等待該事件的線程。這樣,就可以建立多種應(yīng)用程序和驅(qū)動(dòng)程序體系結(jié)構(gòu)。應(yīng)用程序的簡(jiǎn)單主循環(huán)可以初始化中斷,然后立即等待該事件。中斷只能與一個(gè)事件關(guān)聯(lián),并且該事件不能用于對(duì) WaitForMultipleObjects 的調(diào)用中。我們將觀察一個(gè)簡(jiǎn)單的為中斷提供服務(wù)的線程。這是大多數(shù)實(shí)現(xiàn)中的標(biāo)準(zhǔn)解決方案。
IST - 中斷服務(wù)例程
本節(jié)提供了一個(gè) IST 的示例代碼。該 IST 中斷處理線程的關(guān)鍵組件包括:
-
等待中斷事件。
-
確認(rèn)有一個(gè)來自 OS 的脈動(dòng)性事件
-
執(zhí)行任何必要的板級(jí)中斷處理以完成中斷。在該示例中,我們將確認(rèn)該中斷。
-
在盡可能短的時(shí)間內(nèi)處理該中斷
-
創(chuàng)建 CELOGDATA 以供在 Kernel Tracker 中查看。
-
檢查并確認(rèn)是否設(shè)置了 g_fPRRunning 標(biāo)志,然后設(shè)置 g_hevPRStart 事件。
-
調(diào)用 InterruptDone()。
-
在調(diào)用 InterruptDone 之前,OS 不會(huì)提供此 IRQ 上的其他中斷。
-
-
再次等待中斷事件。
該示例讀取一個(gè) ULONG 寄存器以確定中斷狀態(tài)。您只需用您的代碼替換該代碼段。非常關(guān)鍵的一點(diǎn)是,要使 IST 處理盡可能地簡(jiǎn)單。如果將來需要處理來自該設(shè)備的數(shù)據(jù):
-
在 IST 中盡可能快速地從該設(shè)備獲取數(shù)據(jù)。
-
創(chuàng)建一個(gè)事件,以通知某個(gè)優(yōu)先級(jí)較低的線程完成該工作。
-
通過 InterruptDone 從該 IST 中立即返回。
-
讓優(yōu)先級(jí)較低的線程進(jìn)一步處理數(shù)據(jù)。
-
在 IST 與優(yōu)先級(jí)較低的線程之間放置 FIFO 以處理溢出。
導(dǎo)致延遲的因素
從 Windows CE .NET 中的中斷體系結(jié)構(gòu)示意圖中,可以了解硬件、內(nèi)核、OAL 與驅(qū)動(dòng)程序/應(yīng)用程序線程之間的交互。Microsoft 已經(jīng)提供了多種工具(包括 ILTiming、CEBench 和 Kernel Tracker),以便幫助您評(píng)估平臺(tái)上的 Windows CE .NET 的性能。通過了解導(dǎo)致 ISR 和 IST 延遲的因素,有助于確定調(diào)查領(lǐng)域。
ISR 延遲
正如您在本文前面的中斷體系結(jié)構(gòu)示意圖中可以看到的,ISR 延遲被定義為從發(fā)生中斷到 OAL ISR 首次執(zhí)行之間的時(shí)間。因?yàn)楫?dāng)中斷被關(guān)閉時(shí),中斷不會(huì)在處理器中引發(fā)異常,所以第一個(gè)導(dǎo)致延遲的因素是系統(tǒng)中的中斷被關(guān)閉的總時(shí)間。在每個(gè)機(jī)器指令開始執(zhí)行時(shí)都將檢查是否有處理器中斷。如果調(diào)用了長(zhǎng)字符串移動(dòng)指令,則會(huì)鎖定中斷,從而造成第二個(gè)延遲源,即總線訪問鎖定處理器的時(shí)間量。第三個(gè)因素是內(nèi)核導(dǎo)向 OAL ISR 處理程序所花費(fèi)的時(shí)間量。這是一個(gè)進(jìn)程上下文切換。總之,導(dǎo)致 ISR 延遲的因素包括:
-
中斷被關(guān)閉的時(shí)間。
-
總線指令鎖定處理器的時(shí)間。
-
內(nèi)核 ISR 的執(zhí)行時(shí)間加上導(dǎo)向 OAL ISR 的時(shí)間。
IST 延遲
本文前面的體系結(jié)構(gòu)示意圖中顯示,IST 延遲是從中斷發(fā)生到執(zhí)行 IST 中的第一行代碼之間的時(shí)間量。這與 Windows CE .NET 中的 Microsoft 度量工具的輸出不同。Microsoft 工具將 IST 延遲定義為從 OAL ISR 執(zhí)行結(jié)束到 IST 開始之間的時(shí)間。因?yàn)闃?biāo)準(zhǔn)的 ISR 花費(fèi)的時(shí)間很少,您需要將 ISR 延遲和 Microsoft 度量工具所得到的 IST 延遲加起來,才能獲得“中斷體系結(jié)構(gòu)示意圖”中所定義的 IST 延遲。
導(dǎo)致 IST 延遲的第一個(gè)因素是本文前面定義的 ISR 延遲。第二個(gè)因素是 ISR 執(zhí)行時(shí)間。根據(jù)共享中斷調(diào)用鏈的長(zhǎng)度的不同,此時(shí)間是可變的。對(duì)于延遲較小的情況,沒有必要對(duì)永遠(yuǎn)不會(huì)被共享的中斷調(diào)用 NKCallIntChain。
Windows CE 中的內(nèi)核函數(shù)(如計(jì)劃程序)被稱為 KCALL。在這些 KCALL 執(zhí)行期間,將設(shè)置一個(gè)軟件標(biāo)志,以便讓計(jì)劃程序知道它此時(shí)不能被中斷。仍然將調(diào)用 ISR,但用于重新調(diào)度 OS 或調(diào)度 IST 的返回值將被延遲,直至 KCALL 完成為止。這一不可占先的時(shí)間是導(dǎo)致 IST 延遲的第三個(gè)因素。最后,內(nèi)核必須調(diào)度 IST。這一上下文切換是導(dǎo)致延遲的最后一個(gè)因素。總之,導(dǎo)致 IST 延遲的因素包括:
-
ISR 延遲時(shí)間
-
OAL ISR 執(zhí)行時(shí)間
-
OS 執(zhí)行 KCALL 的時(shí)間
-
調(diào)度 IST 的時(shí)間
小結(jié)
通過 Windows CE .NET,Microsoft 已經(jīng)升級(jí)了 Windows CE 中斷體系結(jié)構(gòu)。該 OS 所具有的處理共享中斷的能力極大地?cái)U(kuò)展了 Windows CE .NET 支持許多中斷體系結(jié)構(gòu)的能力。這一中斷體系結(jié)構(gòu)方面的知識(shí)可以大大加快調(diào)查驅(qū)動(dòng)程序和延遲問題的速度。操作系統(tǒng)交互模型是了解該體系結(jié)構(gòu)的關(guān)鍵。共享中斷已經(jīng)大大提高了 Windows CE .NET 的開放性,能夠支持遍布于不同公司之間以及公司內(nèi)部的平臺(tái)提供商和應(yīng)用程序開發(fā)人員方案。了解延遲根源將有助于診斷驅(qū)動(dòng)程序和實(shí)時(shí)問題。Windows CE .NET 中的中斷結(jié)構(gòu)定義完善且易于理解。簡(jiǎn)而言之,“它不是魔術(shù)!”
總結(jié)
以上是生活随笔為你收集整理的Microsoft Windows CE .NET 中的中断体系结构的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 魅族发布会来了!新品夏日奇旅定档6月9日
- 下一篇: 三种嵌入式操作系统的分析与比析