嵌入式中的中斷問題講解_第1頁
嵌入式中的中斷問題講解_第2頁
嵌入式中的中斷問題講解_第3頁
嵌入式中的中斷問題講解_第4頁
嵌入式中的中斷問題講解_第5頁
已閱讀5頁,還剩13頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、原文地址: C 語言中關(guān)于中斷的問題(嵌入式) 前提:中斷是嵌入式系統(tǒng)中重要的組成部分, 這導(dǎo)致了很多編譯開發(fā)商提供一種擴(kuò)展 讓標(biāo) 準(zhǔn) C 支持中斷。具代表事實(shí)是,產(chǎn)生了一個(gè)新的關(guān)鍵字_interrupt 。下面的代碼就使用了_interrupt 關(guān)鍵字去定義了一個(gè)中斷服務(wù)子程序 (ISR) ,請(qǐng)?jiān)u論一下這段代碼的。_interrupt double compute_area (double radius)double area = PI * radius * radius;printf( Area = %f, area);return area;這個(gè)函數(shù)有太多的錯(cuò)誤了,以至讓人不知從何說起了

2、:1) . ISR 不能返回一個(gè)值。2) . ISR 不能傳遞參數(shù)。3) . 在許多的處理器 / 編譯器中,浮點(diǎn)一般都是不可重入的。有些處理器/編譯器需要讓額處的寄存器入棧,有些處理器 /編譯器就是不允許在 ISR 中做浮點(diǎn)運(yùn)算。此外, ISR 應(yīng)該是短 而有效率的,在 ISR 中做浮點(diǎn)運(yùn)算是不明智的。4) . 與第三點(diǎn)一脈相承, printf() 經(jīng)常有重入和性能上的問題。對(duì)于 printf() 經(jīng)常有重入和性能上的問題的理解: 由于存在任務(wù)的調(diào)度,它實(shí)時(shí)系統(tǒng), 可剝奪型內(nèi)核中是危險(xiǎn)的,如同一個(gè)安靜的水雷。 可能 會(huì)被觸發(fā),也可能安然無恙。由于它運(yùn)行結(jié)果的不可預(yù)期性,會(huì)使系統(tǒng)帶來隱患。下面引

3、用一段別人的解釋:這主要在多任務(wù)環(huán)境中使用,一個(gè)可重入的函數(shù)簡(jiǎn)單來說,就是: 可以被中斷的函數(shù)。 就是 說,你可以在這個(gè)函數(shù)執(zhí)行的任何時(shí)候中斷他的運(yùn)行,在OS 的調(diào)度下去執(zhí)行另外一段代碼而不會(huì)出現(xiàn)什么錯(cuò)誤。 而不可重入的函數(shù)由于使用了一些系統(tǒng)資源, 比如全局變量區(qū), 中斷 向量表等等, 所以他如果被中斷的話, 可能出現(xiàn)問題, 所以這類函數(shù)是不能運(yùn)行在多任務(wù)環(huán) 境下的。把一個(gè)不可重入函數(shù)變成可重入的唯一方法是用可重入規(guī)則來重寫他。其實(shí)很簡(jiǎn)單,只要遵守了幾條很容易理解的規(guī)則,那么寫出來的函數(shù)就是可重入的。第一,不要使用全局變量。因?yàn)閯e的代碼很可能覆蓋這些變量值。第二,在和硬件發(fā)生交互的時(shí)候,切記執(zhí)

4、行類似disinterrupt() 之類的操作,就是關(guān)閉硬件中斷。完成交互記 得打 開中斷 ,在有些系列 上, 這叫做 “進(jìn) 入/退出核 心”或者 用 OS_ENTER_KERNAL/OS_EXIT_KERNAL 來描述。第三,不能調(diào)用任何不可重入的函數(shù)。第四,謹(jǐn)慎使用堆棧。最好先在使用前先 OS_ENTER_KERNAL 。還有一些規(guī)則,都是很好理解的,總之,時(shí)刻記住一句話:保證中斷是安全的!通俗的來講吧: 由于中斷是可能隨時(shí)發(fā)生的, 斷點(diǎn)位置也是無法預(yù)期的。 所以必須保證每個(gè) 函數(shù)都具有不被中斷發(fā)生,壓棧,轉(zhuǎn)向 ISR,彈棧后繼續(xù)執(zhí)行影響的穩(wěn)定性。也就是說具有 不會(huì)被中斷影響的能力。 既然

5、有這個(gè)要求, 你提供和編寫的每個(gè)函數(shù)就不能拿公共的資源或 者是變量來使用,因?yàn)樵摵瘮?shù)使用的同時(shí),ISR(中斷服務(wù)程序)也可那會(huì)去修改或者是獲取這個(gè)資源,從而有可能使中斷返回之后,這部分公用的資源已經(jīng)面目全非。滿足下列條件的函數(shù)多數(shù)是不可重入的:(1)函數(shù)體內(nèi)使用了靜態(tài)的數(shù)據(jù)結(jié)構(gòu);(2)函數(shù)體內(nèi)調(diào)用了 malloc() 或者 free() 函數(shù);(3)函數(shù)體內(nèi)調(diào)用了標(biāo)準(zhǔn) I/O 函數(shù)。下面舉例加以說明??芍厝牒瘮?shù)void strcpy(char* lpszDest, char* lpszSrc)while(*lpszDest = *lpszSrc );*dest=0;非可重入函數(shù) 1char c

6、Temp; / 全局變量void SwapChar1(char* lpcX, char* lpcY)cTemp = *lpcX;*lpcX = *lpcY;lpcY = cTemp; / 訪問了全局變量,在分享內(nèi)存的多個(gè)線程中可能造成問題非可重入函數(shù) 2void SwapChar2(char* lpcX, char* lpcY)static char cTemp; / 靜態(tài)局部變量cTemp = *lpcX;*lpcX = *lpcY;lpcY = cTemp; / 使用了靜態(tài)局部變量,在分享內(nèi)存的多個(gè)線程中可能造成問題如何寫出可重入的函數(shù)? 在函數(shù)體內(nèi)不訪問那些全局變量, 不使用靜態(tài)局部變量

7、, 堅(jiān)持只使用局部變量, 寫出的函數(shù) 就將是可重入的。如果必須訪問全局變量,記住利用互斥信號(hào)量來保護(hù)全局變量。近來在 LPC 的中斷過程上看了點(diǎn)文獻(xiàn),作為一個(gè)初學(xué)者感覺這個(gè)內(nèi)容與其它的處理器還是 有很大的區(qū)別,比如說三星的 S3C4510B ,兩者在中斷的處理上理念是完全不同的,個(gè)人感 覺 LPC 的要難一些,很多地方感覺上是在和 ARM 的規(guī)范打擦邊球,下面具體說一下相關(guān) 內(nèi)容?;A(chǔ)知識(shí):LPC2294 的 EXT 中斷分為了三類, 包括 FIQ ,Vectored IRQ ,non- Vectored IRQ , 其中,以 FIQ 的優(yōu)先級(jí)最高,而以 non- Vectored IRQ 的

8、優(yōu)先級(jí)最低,系統(tǒng)一共提供了 27 個(gè)中斷源,并且給這 27 個(gè)中斷源進(jìn)行了固定的編號(hào),但是注意,這個(gè)編號(hào)和優(yōu)先級(jí)沒有任 何的關(guān)系,并非是編號(hào)在前面的優(yōu)先級(jí)就越高,見下面說明。關(guān)鍵內(nèi)容:兩套控制渠道,第一套:在 ARM 體系中,本來有 SWI ,F(xiàn)IQ ,IRQ 等這些中斷的定義,并且已經(jīng)定義了這 些中斷的開關(guān)控制位,就是在 CPSR寄存器中,該寄存器包含了一個(gè) I 位和一個(gè) F位,I 位 用于控制 IRQ 中斷的開關(guān), F 用于控制 FIQ 的開關(guān),但是值得注意的是 CPSR 的讀取和修 改在用戶模式下是不能完成的,必須要通過 SWI 指令進(jìn)入到特權(quán)模式下才可以進(jìn)行修改。第二套:在 LPC 的

9、 SFR(特殊功能寄存器)中,也提供了一套寄存器用于控制相應(yīng)的中斷 的進(jìn)行, 這組控制器叫做 VIC 寄存器 (都以 VIC 開頭),改組寄存器包括了所有的與中斷有 關(guān)的設(shè)置,開啟,分類等功能,僅僅是將外部中斷引腳對(duì)應(yīng)的部分功能分離出去,由 EXT 系列的寄存器來處理,因此,對(duì)這一個(gè)系列的寄存器的掌握是非常重要的!兩者間的關(guān)系:僅僅在第二套控制渠道下打開FIQ ,IRQ 中斷是不夠的,如果 ARM 內(nèi)核沒有開中斷的話, 整個(gè)系統(tǒng)就不會(huì)有中斷產(chǎn)生, 因此,常見的做法是這樣:先將第二套渠道的 控制內(nèi)容處理好,然后通過 SWI 軟件中斷指令,將 ARM 處理器的模式切換為特權(quán)模式, 在特權(quán)模式下,對(duì)

10、 CPSR 進(jìn)行“讀出修改寫回”的操作,將中斷打開,然后在返回到用 戶模式。LPC 的中斷的特殊性: FIQ 的中斷和普通的 ARM 規(guī)定是沒有任何區(qū)別的,即是在產(chǎn)生中斷 時(shí),指令跳轉(zhuǎn)到 0x0000001C 處開始執(zhí)行,這個(gè)是沒有什么疑問的。 但是 IRQ 的響應(yīng)過程就 不同了,先看下面一段代碼,這個(gè)是寫在程序的頭部的部分字節(jié):ResetLDRPC, ResetAddr;/ 0x00000000 , Reset-Supervisor ModeLDRPC, Und_Addr;/ 0x00000004 , Undefined Instruction-Undefined ModeLDRPC, SW

11、I_Addr;/ 0x00000008 , Software Interrupt-Supervisor ModeLDRPC, PAbort_Addr;/ 0x0000000c , Abort(Prefetch)-Abort ModeLDRPC, DAbort_Addr;/ 0x00000010 ,Abort(Data)-Abort ModeDCD 0xB9205F80;/ 0x00000014 , Reserved -LDRPC, PC,#-0xFF0;/ 0x00000018 ,IRQ-IRQ ModeLDRPC, FIQ_Addr;/ 0x0000001c ,F(xiàn)IQ指令為“ LDRPC,

12、PC,#-0xFF0 ”非常特殊, 其并沒有跳轉(zhuǎn)到 IRQ 中斷程序的入口處, 而是進(jìn)行了一個(gè) PC 的運(yùn)算后賦值,這里就要說明其緣由。在 LPC 系列中, IRQ 的響應(yīng)過程,程序的入口地址 并不是直接寫在這條語句中,而是放在一個(gè)寄存器中,該寄存器是: VICVectAddr ,其地址 是 0xFFFFF030 ,現(xiàn)在就很明白了,在執(zhí)行語句“ LDRPC, PC,#-0xFF0 ”時(shí), PC 的值已經(jīng)變?yōu)樵撜Z句的后面第二條語句的地址了,也就是 0x00000020,而 0x00000020 0xFF0 時(shí),發(fā)生借位, 其結(jié)果恰好為 0xFFFFF030 ,也就是說, 通過這個(gè)簡(jiǎn)單的運(yùn)算,使

13、PC 跳轉(zhuǎn)到了寄存器 VICVectAddr 中包含的值為地址的位置上,這 樣就簡(jiǎn)單的完成了 IRQ 的跳轉(zhuǎn)。當(dāng)然, IRQ 中斷源不止一個(gè),其中斷服務(wù)程序也不止一個(gè),這個(gè)寄存器的值是自動(dòng)更新的, 另有一組寄存器 VICV ectAddr0 15(后面有數(shù)字) 將 IRQ 的 16 個(gè)中斷源的地址分別放在對(duì) 應(yīng)的位置上(優(yōu)先級(jí)等內(nèi)容有另外的寄存器來控制,這里不多說) ,當(dāng) IRQ 中斷發(fā)生時(shí),硬 件自動(dòng)將對(duì)應(yīng)的 VICV ectAddr0 15 中的某個(gè)對(duì)應(yīng)的地址傳給 VICVectAddr 寄存器,這個(gè)過 程不用我們來編程實(shí)現(xiàn)。原文鏈接: /ar

14、ticle/tenfei-9-1465093.htmluCOS-II 在 ARM 移植中的中斷處理uCOS II 是一個(gè)源碼公開、可移植、可固化、可剪裁和搶占式的實(shí)時(shí)多任務(wù)操作系統(tǒng),其大 部分源碼是用 ANSI C 編寫,與處理器硬件相關(guān)的部分使用匯編語言編寫??偭考s 200行的 匯編語言部分被壓縮到最低限度,以便于移植到任何一種其它的 CPU 上。uCOS II 最多可支持 56 個(gè)任務(wù), 其內(nèi)核為占先式, 總是執(zhí)行就緒態(tài)的優(yōu)先級(jí)最高的任務(wù),并 支持 Semaphore ( 信號(hào)量)、 Mailbox ( 郵箱)、MessageQueue( 消息隊(duì)列 )等多種常用的進(jìn)程 間通信機(jī)制。與大多商

15、用 RTOS 不同的是, uCOS II 公開所有的源代碼 . 并可以免費(fèi)獲得, 只對(duì)商業(yè)應(yīng)用收取少量 License 費(fèi)用。uCOS II 移植跟 OS_CUP_C.C 、 OS_CPU_A.S 、OS_CPU.H 3 個(gè)文件有關(guān),中斷處理的移 植占據(jù)了很大一部分內(nèi)容。作為移植的一個(gè)重點(diǎn),本文以標(biāo)準(zhǔn)中斷 (IRQ) 為例討論了移植中 的中斷處理。1 uCOS II 系統(tǒng)結(jié)構(gòu).每個(gè)任務(wù)都可以認(rèn)為自己ANSI C 語言書寫的,uCOS II 的軟硬件體系結(jié)構(gòu)如圖 1。應(yīng)用程序處于整個(gè)系統(tǒng)的頂層 獨(dú)占了 CPU ,因而可以設(shè)計(jì)成為一個(gè)無限循環(huán)。大部分代碼是使用 因此 uCOS II 的可移植性較好

16、。盡管如此,仍然需要使用 C 和匯編語言寫一些處理器相關(guān) 的代碼。 uCOS II 的移植需要滿足以下要求:1) 處理器的 C 編譯器可以產(chǎn)生可重入代碼: 可以使用 C 調(diào)用進(jìn)入和退出 CriTIcal Code( 臨界 區(qū)代碼 );2) 處理器必須支持硬件中斷,并且需要一個(gè)定時(shí)中斷源 ;3) 處理器需能容納一定數(shù)據(jù)的硬件堆棧 ;4) 處理器需有能在 CPU 寄存器與內(nèi)存和堆棧交換數(shù)據(jù)的指令。移植 uCOS II 的主要工作就是處理器和編譯器相關(guān)代碼以及BSP(Board Support Package)的編寫。 uCOS II 處理器無關(guān)的代碼提供 uCOS II 的系統(tǒng)服務(wù),應(yīng)用程序可以使

17、用這些API函數(shù)進(jìn)行內(nèi)存管理、任務(wù)間通信以及創(chuàng)建、刪除任務(wù)等。2 uCOS II 移植過程中需要注意的幾個(gè)問題uCOS II 移植的中斷處理跟 ARM 體系結(jié)構(gòu)和 uCOS II 處理中斷的過程有關(guān),必須注意這 2 個(gè)方面的問題才能高效移植。2.1 ARM 處理器 7種操作模式用戶模式 (USER MODE) 是 ARM 通常執(zhí)行狀態(tài),用于執(zhí)行大多數(shù)應(yīng)用程序;快速中斷模式(FIQ MODE) 支持?jǐn)?shù)據(jù)傳輸或通道處理 ;中斷模式 (IRQ MODE) 用于通用中斷處理 ;超級(jí)用戶 模式(SVC MODE) 是一種操作系統(tǒng)受保護(hù)的模式: 數(shù)據(jù)中止模式 (ABT MODE) 指令預(yù)取指中 止、數(shù)據(jù)中

18、止時(shí)進(jìn)入該模式 ;未定義模式 (UND MODE) 當(dāng)執(zhí)行未定義的指令時(shí)進(jìn)入該模式 ;系 統(tǒng)模式 (SYS MODE) 是操作系統(tǒng)一種特許的用戶模式。除了用戶模式之外, 其他模式都?xì)w為特權(quán)模式, 特權(quán)模式用于中斷服務(wù)、 異?;蛘咴L問受保 護(hù)的資源特權(quán)模式中除系統(tǒng)模式之外另 5種模式又稱為異常模式,在移植過程中必須設(shè)置中斷向量表 來處理異常。 uCOS II 的移植主要處理標(biāo)準(zhǔn)中斷 (IRQ) 、快速中斷 (FIQ)和軟件中斷 (SWI) 。2.2 uCOS II 中斷響應(yīng)的過程 以 IRQ 中斷為例, 假設(shè) CRPS 中 I_bit 位為 0 ,當(dāng)有 IRQ 中斷時(shí), CPU 強(qiáng)制進(jìn)入 IRQ

19、 模式, 當(dāng)前的 CPSR 拷貝到 SPSR_irq 中,PC 值保存在 LR_irq 中,置 CPSR 中的 I 位以關(guān)閉 IRQ 中斷。數(shù)據(jù)保存之后, CPU 強(qiáng)行從 0X00000018 開始執(zhí)行,PC 值保存了 OS_CPU_IRQ_ISR() 的 地 址 , 然 后 執(zhí) 行 OS_CPU_IRQ_ISR() 。 在 OS_CPU_IRQ_ISR() 中 OS_CPU_IRQ_ISR_Handler() 被調(diào)用來檢測(cè)中斷源并執(zhí)行中斷。 OS_CPU_IRQ_ISR_Handler() 返回以后, OS_CPU_IRQ_ISR() 又調(diào)用 OSIntExit() 來確認(rèn)是 否有比 ISR

20、 優(yōu)先級(jí)更高的任務(wù)要執(zhí)行。如果當(dāng)前中斷任務(wù)仍然是優(yōu)先級(jí)最高的任務(wù), OSIntExit() 返回, OS_CPU_IRQ_ISR() 彈出中斷堆棧,如果優(yōu)先級(jí)更高的任務(wù)需要執(zhí)行, OSIntExit() 調(diào)用 OSIntCtxSw() 執(zhí)行優(yōu)先級(jí)更高的任務(wù)。2.3 uCOS II 的臨界段代碼uCOS II 使用關(guān)中斷來保護(hù)臨界代碼。 它定義了 2個(gè)宏來開中斷 (OS_EXIT_CRITICAL() ,關(guān) 中斷 (OS_ENTER_CRITICAL() 。OS_ENTER_CRITICAL() 和 OS_EXIT_CRITICAL() 有 3種 方法來實(shí)現(xiàn), uCOS II 建議使用第 3種方

21、法可以保存當(dāng)前處理器狀態(tài)的值。3 uCOS II 移植過程中的中斷處理uCOS II 中斷處理跟 CRT.S 、OS_CPU_A.S 和 BSP.C 有關(guān), 其移植過程主要有以下幾個(gè)步 驟。3.1 在 CRT.S 中設(shè)置中斷向量表ARM 的中斷向量表位于 ROM 的最底部,其地址范圍為 0X00000000 0X0000001C ,設(shè) 置如下:VECTORS:LDR PC,RESET_ADDRLDR PC,UNDEF_ADDRLDR PC,SWI_ADDRLDR PC,PABT_ADDR LDR PC,DABT_ADDR NOP /* 保留向量 */ LDR PC,IRQ_ADDR LDR P

22、C,FIQ_ADDR RESET_ADDR:. WORD RESET_HANDLER UNDEF_ADDR:.WORD UNDEF HANDLER SWI_ADDR:.WORD SWI HANDLERPABT_ADDR:.WORD PABT_HANDLERDABT_ADDR:.WORD DABT_ HANDLER .WORD 0 /* 保留地址 */IRQ_ADDR:.WORD IRQ_HANDLER FIQ_ADDR:.WORD FIQ HANDLERUNDEF_HANDLER:B UNDEF_HANDLERSWI_HANDLER: B SWI_HANDLERPABT_HANDLER: B

23、PABT_HANDLERDABT_HANDLER: B DABT_HANDLERIRQ_HANDLER: B OS_CPU_IRQ_ISR/*跳轉(zhuǎn)到 OS_CPU_IRQ_ISR( 在 OS_CPU_A.S 中 )*/FIQ_HANDLER : B OS_CPU_FIQ_ISR/*跳轉(zhuǎn)到 OS_CPU_FIQ_ISR( 在 OS_CPU_A.S 中) */ 這里設(shè)置了標(biāo)準(zhǔn)中斷異常 (IRQ) 和快速中斷異常 (FIQ) 的中斷入口,其余異常都設(shè)置為死循 環(huán),當(dāng)發(fā)生這些異常的時(shí)候,必須使系統(tǒng)復(fù)位才能退出死循環(huán)。3.2 移植中斷任務(wù)切換中斷任務(wù)切換 (OSIntCtxSw) 和任務(wù)切換函數(shù) (OS

24、CtxSw) 比較相似,主要有以下幾步組成:1) 調(diào)用 OSTask SwHook()2) OSPrioCur=OSPrioHighRdy3) OSTCBCur=OSTCBHighRdy4) SP=OSTCBHighRdy-OSTCBStkPtr /獲取高優(yōu)先級(jí)的任務(wù)堆棧指針5) 從高優(yōu)先級(jí)的任務(wù)的堆棧中彈出高優(yōu)先級(jí)的任務(wù)上下文6) 執(zhí)行高優(yōu)先級(jí)的任務(wù)3.3 移植中斷服務(wù)程序以 IRQ 中斷為例中斷服務(wù)程序 (OS_CPU_IRQ_ISR) 主要依據(jù)上面所描述的 “uCOS II 中斷響 應(yīng)的過程 ”編寫,其主要代碼如下:LDR R0,OS_IntNestingLDRB R1,R0ADD R1

25、,R1,#1STRB R1,R0CMP R1,#lBNE OS_CPU_IRQ_ISR_1LDR R4,OS_TCBCurLDR R5,R4STR SP ,R5OS_CPU_IRQ_ISR_1:MSR CPSR_c,#(NO_INT | IRQ32_MODE) /切換到 SVC 模式LDR R0,OS_CPU_IRQ_ISR_HandlerMOV LR,PCBX R0MSR CPSR_c,#(NO_INT | SVC32_MODE)/切換到 SVC 模式LDRR0,OS_IntExit /OSIntExit()MOV LR,PCBX R0 在代碼中省略了現(xiàn)場(chǎng)工作寄存器的保護(hù)與恢復(fù)及工作模式的切

26、換。3.4 移植中斷處理程序以 IRQ 中斷為例,移植中斷處理程序:C 程序void OS_CPU_IRQ_ISR_Handler(void) PFNCT pfnct; / 定 義 中 斷 函 數(shù) 指 針 pfnct=(PFNCT)VICVectAddr; / 獲取函數(shù)地址 while(pfnct!=(PFNCT)0) (*pfnct)(); / 調(diào)用中 斷函數(shù) pfnct=(PFNCT)VICVectAddr; / 獲取新的中斷函數(shù) /所有中斷都執(zhí)行完畢退出 中 斷 處 理 程 序 依 賴 中 斷 控 制 器 的 中 斷 響 應(yīng) 順 序 , 所 以 uCOS II 把 OS_CPU_IRQ_

27、ISR_Handler() 歸屬于用戶程序的一部分。在中斷返回之前,中斷處理程序 要處理完所有的中斷響應(yīng),以避免在多個(gè)中斷同時(shí)響應(yīng)或中斷處理過程中響應(yīng)中斷的情況 下, 進(jìn)入 OS_CPU_IRQ_ISR () 和退出 OS_CPU_IRQ_ISR() 時(shí), OS_CPU_IRQ_ISR() 耗盡保存 CPU 寄存器的堆棧空間。另外,在 OS_CPU_IRQ_ISR_Handler() 中不要清 CPSR 的 I 位來開放中斷,因?yàn)闆]有必要 使用中斷嵌套, OS_CPU_IRQ_ISR_Handler() 在返回之前會(huì)檢查并處理所有的中斷。3.5 編寫中斷函數(shù) 中斷函數(shù)一般采用 C 語言編寫,

28、uCOS II 建議中斷函數(shù)應(yīng)盡量短, 一般做法是在中斷函數(shù)中 緩存數(shù)據(jù), 給任務(wù)發(fā)送一個(gè)信號(hào)來處理數(shù)據(jù)。 中斷函數(shù)的地址在系統(tǒng)初始化的時(shí)候要置人中 斷向量寄存器 (VICVectAddr0 15) 。由于向量中斷控制器 (VIC) 的特殊結(jié)構(gòu),在中斷函數(shù)中 要寫一次中斷向量寄存器 (VICVectAddr) 。4 中斷處理的應(yīng)用示例uCOS II 要提供周期性信號(hào)源,用于實(shí)現(xiàn)時(shí)間延時(shí)和確認(rèn)超時(shí)。節(jié)拍率應(yīng)為 10 100 Hz。 時(shí)鐘節(jié)拍源可以由專門的硬件定時(shí)器產(chǎn)生,以下就以 IRQ 中斷方式產(chǎn)生節(jié)拍源為示例。初始化中斷控制器:C 程序void VICInit(void) VICIntEnCl

29、r=0xfffff; VICDefVectAddr=-(INT32U)Non_Vect_IRQ_Handler; VICVectAddr0= (INT32U)OSTickISR; VICVectCntl0= (0x20 | 0x04); VICIntEnable= 14; 定時(shí)器 0中斷函數(shù):C 程序void OSTickISR(void) TO_IR = 0xff; OSTimeTick(); /調(diào)用 OSTimeTick() VICVectAddr=0;/通知中斷控制器中斷結(jié)束 當(dāng)定時(shí)中斷發(fā)生時(shí)調(diào)用 OS_CPU_IRQ_ISR Handler() ,得到 OSTickISR() 的地址并

30、執(zhí)行, 在 OSTickISR() 中調(diào)用 OSTimeTick() 為 uCOS II 提供周期性信號(hào)源。此代碼在 GNU 工具鏈 ARM-GCC 下編譯通過, 并在 EasyARM2100 開發(fā)實(shí)驗(yàn)板上得到驗(yàn)證。5 結(jié)束語通過示例講述了在 uCOS II 移植過程中的中斷處理所需要注意的幾個(gè)問題和通用方法,經(jīng) 筆者在 GNU 工具鏈下編譯、調(diào)試,并在實(shí)驗(yàn)板上得到很好的驗(yàn)證。這種移植方案的中斷函 數(shù)都使用 C 語言編寫,具有較好的移植性,有利于對(duì)不同需求的用戶進(jìn)行中斷擴(kuò)充,增強(qiáng) 了中斷嵌套時(shí) uCOS II 運(yùn)行的穩(wěn)定性,使移植具有更好的通用性。ARM 中斷處理的研究在嵌入式 系統(tǒng)中常用的

31、RISC 處理器是 ARM核,它具有體積小、功耗低、成本低、性價(jià)比高 的特點(diǎn)。然而, 不管是哪種型號(hào)的 arm處理器,也無論該 嵌入式 系統(tǒng)中是否有操作系統(tǒng),中 斷處理,特別是 IRQ 中斷,始終是必須的,而中斷處理的核心問題是上下文的保存。能否 安 全而又高效地保存上下文, 將影響一個(gè)嵌入式系統(tǒng)的性能與穩(wěn)定。 筆者對(duì) arm 處理器的普通 中斷處理、 任務(wù)切換中斷處理、 可重人中斷處理和基于優(yōu)先級(jí)的可重人性中斷處理的上下文 保存技術(shù)進(jìn)行分析與總結(jié)。為保證理論的正確性,核心的程序代碼都經(jīng)過了實(shí)驗(yàn)的檢測(cè)。1 系統(tǒng)中斷處理簡(jiǎn)介arm 處理器的中斷主要有兩種: IRQ 普通中斷和 FIQ 快速中斷。

32、快速中斷本質(zhì)上與普通 中斷沒有太大的差別,它們?cè)谔幚頇C(jī)制上有許多相同的地方。IRQ 中斷是最頻繁的也是最為影響系統(tǒng)性能的,所以對(duì)它的研究與處理也就最有價(jià)值。CPSR中的 bit7 位置 1禁止后繼 IRQ 中斷的發(fā)生 ;下面簡(jiǎn)要地介紹一下 IRQ異常發(fā)生時(shí) ARM處理器的工作過程。在 IRQ 中斷發(fā)生時(shí), arm 處理器的硬件會(huì)自動(dòng)執(zhí)行以下工作:將被中斷任務(wù)模式的CPSR值保存到 IRQ 模式中的 SPSR寄存器中 ;將被中斷任務(wù)模式的PC值保存到 IRQ 模式中的 LR寄存器中 ;將模式自動(dòng)切換到IRQ模式,并將0xl8 片開始執(zhí)行。結(jié)合圖1,可以更好地理解 armPC被賦予 0xl8 的地

33、址值,程序?qū)?中斷處理機(jī)制的工作過程。2 普通中斷處理有些 arm 嵌入式系統(tǒng)可能對(duì)中斷的要求比較低,即發(fā)生中斷后首先查詢相應(yīng)的中斷源, 然后進(jìn)行中斷服務(wù), 最后從中斷服務(wù)程序中返回到被中斷處繼續(xù)運(yùn)行程序。 如何在這種簡(jiǎn)單 應(yīng)用中保證 安全 又高效地處理中斷呢 ?“安全”就意味著中斷發(fā)生時(shí)上下文被完好保存不被破壞,“高效”就是說保存盡可能少的寄存器 ( 當(dāng)然是建立在安全的基礎(chǔ)上的 ) 。由圖1可知, 在普通中斷處理中, 中斷服務(wù)就可以在 IRQ 模式中運(yùn)行。 根據(jù) ATPCS的調(diào)用規(guī)則, 在子程序 調(diào)用中 arm 編譯器保存了 R4R11寄存器,因此就沒有必要再次保存。那么剩下的寄存器就 必

34、須予以保存, 防止從中斷服務(wù)程序返回后被破壞。 可以用匯編語言和 C 語言書寫處理代碼。首先假設(shè)初始化代碼中已正確建立了IRQ 堆棧。; 將同時(shí)發(fā)生的中斷全部服務(wù),以提高效率LDMFD SP!,R0-R3,R12,R14 ; 恢復(fù)上下文在上述保存上下文中沒有必要保存SPSR。因在非嵌套的中斷處理程序中,它不會(huì)被任何順序的中斷所破壞。如果用 C語言來書寫該處理程序, 可以使用關(guān)鍵字一 IRQ 來說明,以告訴編譯器實(shí)現(xiàn)如 下的操作: 保存 .ATPCS規(guī)定的被破壞的寄存器 ; 保存其他中斷處理程序中用到的寄存器 ; 同時(shí)將 (LR-4) 賦予程序計(jì)數(shù)器 PC,實(shí)現(xiàn)中斷程序的返回并且恢復(fù) CPSR寄

35、存器的內(nèi)容。普通中斷處理的 C 語言程序可以按如下格式編寫:2給出了) 。圖中可見,無論是用 C 語言還是匯編語言來編寫,它們的工作原理都是一樣的。圖 普通中斷處理過程中, arm 寄存器的保存示意圖 ( 虛線是壓棧保存,實(shí)線是彈?;謴?fù) 與程序處理的步驟相對(duì)應(yīng),可以幫助理解處理器上下文的保存過程。它3 任務(wù)切換有操作系統(tǒng)的嵌入式系統(tǒng)中, 中斷的發(fā)生要求保存全部寄存器的內(nèi)容到任務(wù)的棧中,任務(wù)切換發(fā)生時(shí)所有任務(wù)的寄存器不是基于安全的考慮是因?yàn)榭赡苤袛鄷?huì)導(dǎo)致任務(wù)的切換。的值都要保存到該任務(wù)的棧中。 下個(gè)任務(wù)的上下文將從該任務(wù)棧中得以恢復(fù)到處理器的寄存 器中。下面就本問題作出分析并給出實(shí)現(xiàn)的程序代碼。從圖1中斷處理寄存器的保存可知,中斷發(fā)生后任務(wù)的 CPSR和 PC兩寄存器的值在 IRQ模式的 SPSR和 LR中,所以不能簡(jiǎn)單地切 換到任務(wù)運(yùn)行的模式中, 否則被中斷任務(wù)返回時(shí)的 CPSR和 PC將不可見 ( 因?yàn)樗鼈儽4嬖?IRQ 模式的專用寄存器中, 在其他模式中無法

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論