概觀
此篇線上教學將說明 ARM 微控制器的 NI LabVIEW Embedded Module 中斷驅動 (Interrupt driven) 程式設計方式,與管理中斷時的必要步驟。亦涵蓋在應用中使用中斷時,所可能面對的設計抉擇。此篇線上教學是以 LabVIEW 8.5 與適用於 ARM 微控制器的 LabVIEW Embedded Module 為使用條件,且必須熟悉建立並執行 ARM 微控制器的應用。
目錄
中斷 (Interrupt) 與中斷處理器 (Interrupt handler) 的介紹
任何中斷驅動 (Interrupt driven) 系統均具有 2 個要件 – 中斷 (Interrupt) 與中斷處理器 (Interrupt handler)。中斷為硬體所產生訊號,專指所發生該筆的事件將暫停執行中的程式。中斷處理器 (亦為中斷服務常式) 為透過系統處理器 (Processor) 所暫存的部分程式碼,當發生特定中斷時即開始執行。一旦系統處理器偵測到中斷,則將暫停目前執行中的程式、執行儲存了系統狀態的環境切換 (Context switch),並接著執行中斷處理器。一旦中斷處理器程式碼執行完畢,系統處理器將取回先前程式的控制權。
中斷功能可用於定期的資料位置讀取與寫入作業。以設計數位音樂播放器為例。此系統將由 3 組要素所組成 – 輸入 (可調整聲音準位的多種類比數據與濾波器)、處理器,與輸出 (數位類比轉換器 - DAC)。則該系統將依下列步驟進行操作:系統處理器將讀取數據 (Dial) 的數值、從記憶體中串流出聲音檔案、針對於資料套用濾波運算式,並將數值寫入至 DAC。透過計時器中斷,即可定期讀取數據的數值,以決定濾波運算式的參數。接著可設定第二組計時器中斷,以定期寫入至 DAC。此時系統處理器將全力連續套用濾波運算式至聲音檔案,並僅於讀取與寫入暫存器時會遭到中斷。
管理中斷
透過專案中的「Build Specifications」,即可處理 ARM 應用的中斷。在「Build Specifications Properties」對話框中,工程師有 2 種方法可建立並指派中斷處理器 – 使用 VI 或時脈迴路。單一專案可同時使用此 2 種方式,並於應用中處理多組硬體中斷。
接下來將說明應如何使用 VI 與時脈迴路,以建立中斷處理器。此範例將使用圖 1:ARM 中斷的專案檢視 (Project View) 功能,將顯示包含高階 VI 與建立規格的 ARM 專案。

圖 1:ARM 中斷的專案檢視 (Project View) 功能
此專案將包含單一 VI,可建立主要應用並構成 MCB2300 ARM 硬體。該應用將列印指令串 (String) 至「Processor Status」視窗。圖 2:ARM Main Application VI 顯示範例 VI 的程式區。其所包含的時脈迴路,將列印指令串至「Processor Status」視窗。

圖 2:ARM Main Application VI
將 VI 做為中斷處理器
下列步驟說明將 VI 建立為中斷處理器的方法。
1. 對「Project explorer」中的 ARM 系統按下滑鼠右鍵,並選擇 New » VI。此步驟將於專案中增加新的 VI。此 VI 並將做為範例的中斷處理器。接著點選 File » Save As 以儲存此檔案。此範例中的檔案則命名為 ISR1.vi。

2. 接著即可撰寫處理中斷的程式碼。開啟方才建立的 VI 程式區,並放置「ARM Palette」中的「Console Output.vi」。所建立的指令串常數,將顯示於「Processor Status」視窗中。此 VI 將列印至操作介面,表示已執行該程式碼。請注意,該程式碼周圍並無其他迴路架構。此表示計時器中斷的定期特性。

3. 完成了中斷處理器程式碼之後,則必須將處理器指派至中斷。在「Project explorer」視窗中,於「Build Specifications」的「Application」按下滑鼠右鍵,並選擇「Properties」。

4. 接著將顯示「Build Specification Properties」視窗。

5. 在「Category」中選擇「Manage Interrupts」。此範例所使用的硬體,將提供 3 種計時器中斷功能。而此範例接著選擇使用「Timer 1」。從中斷清單中選擇「Timer 1」,並勾選「Use interrupt」方塊。

6. 在「Interrupt Handler」框中點選「VI」按鈕。點選箭頭以將 ISR1.vi 做為中斷處理器。除了最高階的 VI 之外,此專案中的任何 VI 均可為中斷處理器。

7. 針對此範例,其開機 (Start-up) 狀態則為「Enabled」。依使用者的需要,可於開機階段將中斷設定為「Disabled」,並於應用中以程式設計的方式開啟之。此項作業將於稍後進行說明。此外,「Timer 1」的中斷頻率,可透過「Configure」按鈕與「Timer Configuration」對話框進行設定。

8. 按下「OK」按鈕。則完成了中斷處理器的設定。「Build」並「Run」該專案。則將顯示相似於下方圖片的「Processor Status」視窗。系統將定期呼叫中斷處理器,以中斷執行主要迴路,並將指令串輸出至「Processor Status」視窗。

將時脈迴路做為中斷處理器
時脈迴路亦可做為中斷處理器。此段落將說明建立時脈迴路,並將其做為中斷處理器的必要步驟。同樣的,圖 1 與圖 2 為此應用的基本步驟。
1. 以「Main ARM Application.vi」開始作業,將新增 1 組時脈迴路,並接著做為中斷處理器。從「Programming » Structures» Timed Loop」面板中選擇「Timed Loop」。在 VI 中建立第二組時脈迴路,以輸出至「Processor Status」視窗。

2. 時脈迴路必須設定可對應至外部的時脈源。在輸入節點按下滑鼠右鍵,並選擇「Configure Input Node」。接著點選「Use Timing Source Terminal」。

3. 接著從「Programming » Timed Loop」面板中找到「Create External Timing Source.vi」,命名該時脈源並將其連接至時脈迴路的輸入節點。此將成為該時脈迴路架構的名稱,並做為此範例的中斷處理器。

4. 如稍早「將 VI 做為中斷處理器」段落中所述,開啟「Build Specification Properties」視窗。在「Project explorer」視窗中,於「Build Specifications」的「Application」按下滑鼠右鍵,並選擇「Properties」。在「Category」中選擇「Manage Interrupts」。此範例則使用「Timer 2」。從中斷清單中選擇「Timer 2」,並勾選「Use interrupt」方塊。

5. 在「Interrupt Handler」框中點選「Timed Loop」按鈕。

6. 輸出先前所指定的時脈迴路名稱 – 此範例為「Interrupt Handler」。此外,亦可設定「開機狀態 (Startup State)」與中斷的頻率。
7. 按下「OK」按鈕。現在已將時脈迴路設定為中斷處理器。「Build」並「Run」該應用。同樣的,系統將定期呼叫中斷處理器。每次中斷均將執行該時脈迴路 1 次。一旦迴路完成單次的迭代 (Iteration),系統處理器即取回控制權。

使用時脈迴路與 VI 做為中斷處理器之間,其最重要的差異在於:時脈迴路中斷處理器,可由 VI 中斷處理器進行中斷。若系統有 2 個或以上的中斷處理器,則可進行此功能。若時脈迴路的中斷處理器正執行中,且同時發生由 VI 中斷處理器所進行的中斷,則該時脈迴路亦將遭到中斷。
在使用單一中斷的應用中,時脈迴路的中斷方式具有較大優點。可於主要應用邏輯的相同 VI 中進行時脈迴路,以進一步簡化節點;而不需開發多重 VI。
使用中斷 VI 面板 (Interrupt VI Palette)
除了可指派中斷處理器之外,LabVIEW 亦可透過程式設計的方式,在 ARM » Interrupts 面板進行下列 VI,以啟動或停用中斷功能。
「ARM Interrupt Enable」可啟動先前所停用的中斷。此即使用程式設計的方式以停用中斷;或透過「Manage Interrupts」視窗,在開機 (Startup) 階段及停用中斷。此 VI 將根據指定的中斷號碼,於單一中斷上進行作業。

「ARM Interrupt Disable」可讓工程師根據指定的中斷號碼,停用單一的中斷。

不論是透過程式設計方式或中斷管理視窗所停用的中斷,「ARM Global Interrupt Enable」則可啟用所有的中斷。

「ARM Global Interrupt Disable」則可停用系統的所有中斷。當執行具時效性或不想遭外部事件所中斷的作業時,此功能特別受用。

於 ARM 應用進行中斷的設計考量
系統中的各個中斷,均具有無法以程式設計進行指派的優先性。針對 MCB2300 硬體來說,「Timer 1」具有最高優先性的中斷,「Timer 2」為第二高優先性,而「Timer 3」則為最低優先性的中斷。若同時有 2 或以上的中斷發生,則將執行最高優先性的中斷。當處理中斷時,除了前述的時脈迴路中斷條件之外,均無法中斷該中斷處理器。當系統正執行其他中斷處理器時,期間所發生的中斷將進入佇列狀態;然而,系統僅將進行來自於外部觸發器的最新中斷。舉例來說,當系統正執行 Timer 1 的中斷處理器時,Timer 2 發生了 5 組中斷事件。當完成 Timer 1 的中斷處理器之後,接下來將僅處理 Timer 2 的最後 (第 5) 中斷。
當設計應用時,必須注意此遺失中斷的潛在特性。為了最小化此遺失中斷的特性,共可建置 2 種常見架構。方法 1 即是於中斷處理器中限制可耗費的時間。當主要應用執行所有系統處理器的密集計算時,可將其限制為僅讀取或寫入變數。除此之外,亦可建構軟體以使用單一中斷,並於中斷處理器中進行系統處理器的密集計算。該主要應用則將等待中斷發生之時,方可進行作業。若需要於每次中斷時定期操作資料,即可使用此架構。在此架構中,工程師必須確定:中斷處理器的執行時間低於中斷期間,以確保不會遺失任何中斷。
合法
此教學由美商國家儀器 (以下簡稱 NI) 開發。此教學受 NI 技術支援,但未經完整測試及檢驗。NI 不保證品質,亦不為其更新版本、相關產品及驅動程式等後續支援負責。此教學不具任何形式保證,且不受任何特定用途規範。(http://ni.com/legal/termsofuse/unitedstates/us/)
