版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、原文地址:C語(yǔ)言中關(guān)于中斷的問(wèn)題(嵌入式)前提:中斷是嵌入式系統(tǒng)中重要的組成部分,這導(dǎo)致了很多編譯開(kāi)發(fā)商提供一種擴(kuò)展一讓標(biāo)準(zhǔn)C支持中斷。具代表事實(shí)是,產(chǎn)生了一個(gè)新的關(guān)鍵字nterrupt。下面的代碼就使用了_interrupt關(guān)鍵字去定義了一個(gè)中斷服務(wù)子程序(ISR),請(qǐng)?jiān)u論一下這段代碼的。_in terrupt double compute_area (double radius)double area = PI * radius * radius;prin tf(" Area = %f", area);return area;這個(gè)函數(shù)有太多的錯(cuò)誤了,以至讓人不知從何說(shuō)起
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)常有重入和性能上的問(wèn)題。對(duì)于printf()經(jīng)常有重入和性能上的問(wèn)題的理解:由于存在任務(wù)的調(diào)度,它實(shí)時(shí)系統(tǒng),可剝奪型內(nèi)核中是危險(xiǎn)的,如同一個(gè)安靜的水雷。可能會(huì)被觸發(fā),也可能安然無(wú)恙。由于它運(yùn)行結(jié)果的不可預(yù)期性,會(huì)使系統(tǒng)帶來(lái)隱患。下面引用一段別人的解釋:這主要在多任務(wù)環(huán)境中使
3、用,一個(gè)可重入的函數(shù)簡(jiǎn)單來(lái)說(shuō),就是:可以被中斷的函數(shù)。 就是說(shuō),你可以在這個(gè)函數(shù)執(zhí)行的任何時(shí)候中斷他的運(yùn)行,在OS的調(diào)度下去執(zhí)行另外一段代碼而不會(huì)出現(xiàn)什么錯(cuò)誤。而不可重入的函數(shù)由于使用了一些系統(tǒng)資源,比如全局變量區(qū),中斷向量表等等,所以他如果被中斷的話,可能出現(xiàn)問(wèn)題,所以這類函數(shù)是不能運(yùn)行在多任務(wù)環(huán) 境下的。把一個(gè)不可重入函數(shù)變成可重入的唯一方法是用可重入規(guī)則來(lái)重寫他。其實(shí)很簡(jiǎn)單,只要遵守了幾條很容易理解的規(guī)則,那么寫出來(lái)的函數(shù)就是可重入的。第一,不要使用全局變量。因?yàn)閯e的代碼很可能覆蓋這些變量值。第二,在和硬件發(fā)生交互的時(shí)候,切記執(zhí)行類似disinterrupt()之類的操作,就是關(guān)閉硬件中
4、斷。完成交互記得打開(kāi)中斷,在有些系列上,這叫做 進(jìn)入/退出核心”或者用 OS_ENTER_KERNAL/OS_EXIT_KERNAL來(lái)描述。第三,不能調(diào)用任何不可重入的函數(shù)。還有一些規(guī)則,都是很好理解的,總之,時(shí)刻記住一句話:保證中斷是安全的!通俗的來(lái)講吧:由于中斷是可能隨時(shí)發(fā)生的,斷點(diǎn)位置也是無(wú)法預(yù)期的。所以必須保證每個(gè)函數(shù)都具有不被中斷發(fā)生,壓棧,轉(zhuǎn)向ISR,彈棧后繼續(xù)執(zhí)行影響的穩(wěn)定性。也就是說(shuō)具有不會(huì)被中斷影響的能力。 既然有這個(gè)要求,你提供和編寫的每個(gè)函數(shù)就不能拿公共的資源或 者是變量來(lái)使用,因?yàn)樵摵瘮?shù)使用的同時(shí),ISR (中斷服務(wù)程序)也可那會(huì)去修改或者是獲取這個(gè)資源,從而有可能使中
5、斷返回之后,這部分公用的資源已經(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ù)。下面舉例加以說(shuō)明??芍厝牒瘮?shù)void strcpy(char* IpszDest, char* lpszSrc)while(*lpszDest = *lpszSrc );*dest=O;非可重入函數(shù)1char cTemp; / 全局變量void SwapChar1(char* lpcX, char* lpcY)cTemp = *lpcX;*lpcX = *lpcY;IpcY = cTe
6、mp; /訪問(wèn)了全局變量,在分享內(nèi)存的多個(gè)線程中可能造成問(wèn)題非可重入函數(shù)2void SwapChar2(char* IpcX, char* IpcY)static char cTemp; / 靜態(tài)局部變量cTemp = *lpcX;*lpcX = *lpcY;lpcY = cTemp; /使用了靜態(tài)局部變量,在分享內(nèi)存的多個(gè)線程中可能造成問(wèn)題如何寫出可重入的函數(shù)?在函數(shù)體內(nèi)不訪問(wèn)那些全局變量,不使用靜態(tài)局部變量,堅(jiān)持只使用局部變量,寫出的函數(shù)就將是可重入的。如果必須訪問(wèn)全局變量,記住利用互斥信號(hào)量來(lái)保護(hù)全局變量。近來(lái)在LPC的中斷過(guò)程上看了點(diǎn)文獻(xiàn),作為一個(gè)初學(xué)者感覺(jué)這個(gè)內(nèi)容與其它的處理器還是
7、有很大的區(qū)別,比如說(shuō)三星的S3C4510B,兩者在中斷的處理上理念是完全不同的,個(gè)人感覺(jué)LPC的要難一些,很多地方感覺(jué)上是在和ARM的規(guī)范打擦邊球,下面具體說(shuō)一下相關(guān)內(nèi)容?;A(chǔ)知識(shí):LPC2294 的 EXT 中斷分為了三類,包括 FIQ , Vectored IRQ ,non- Vectored IRQ, 其中,以FIQ的優(yōu)先級(jí)最高,而以non- Vectored IRQ的優(yōu)先級(jí)最低,系統(tǒng)一共提供了27個(gè)中斷源,并且給這 27個(gè)中斷源進(jìn)行了固定的編號(hào),但是注意,這個(gè)編號(hào)和優(yōu)先級(jí)沒(méi)有任 何的關(guān)系,并非是編號(hào)在前面的優(yōu)先級(jí)就越高,見(jiàn)下面說(shuō)明。關(guān)鍵內(nèi)容:兩套控制渠道,第一套:在 ARM體系中,本來(lái)
8、有 SWI,F(xiàn)IQ,IRQ等這些中斷的定義,并且已經(jīng)定義了這 些中斷的開(kāi)關(guān)控制位,就是在CPSR寄存器中,該寄存器包含了一個(gè)I位和一個(gè)F位,I位用于控制IRQ中斷的開(kāi)關(guān),F(xiàn)用于控制FIQ的開(kāi)關(guān),但是值得注意的是CPSR的讀取和修改在用戶模式下是不能完成的,必須要通過(guò)SWI指令進(jìn)入到特權(quán)模式下才可以進(jìn)行修改。第二套:在LPC的SFR (特殊功能寄存器)中,也提供了一套寄存器用于控制相應(yīng)的中斷的進(jìn)行,這組控制器叫做 VIC寄存器(都以VIC開(kāi)頭),改組寄存器包括了所有的與中斷有 關(guān)的設(shè)置,開(kāi)啟,分類等功能,僅僅是將外部中斷引腳對(duì)應(yīng)的部分功能分離出去,由EXT系列的寄存器來(lái)處理,因此,對(duì)這一個(gè)系列的
9、寄存器的掌握是非常重要的!兩者間的關(guān)系:僅僅在第二套控制渠道下打開(kāi)FIQ,IRQ中斷是不夠的,如果 ARM內(nèi)核沒(méi)有開(kāi)中斷的話,整個(gè)系統(tǒng)就不會(huì)有中斷產(chǎn)生,因此,常見(jiàn)的做法是這樣:先將第二套渠道的控制內(nèi)容處理好,然后通過(guò)SWI軟件中斷指令,將 ARM處理器的模式切換為特權(quán)模式,在特權(quán)模式下,對(duì) CPSR進(jìn)行“讀出-修改-寫回”的操作,將中斷打開(kāi),然后在返回到用 戶模式。LPC的中斷的特殊性:FIQ的中斷和普通的 ARM規(guī)定是沒(méi)有任何區(qū)別的,即是在產(chǎn)生中斷 時(shí),指令跳轉(zhuǎn)到OxOOOOOOIC處開(kāi)始執(zhí)行,這個(gè)是沒(méi)有什么疑問(wèn)的。但是IRQ的響應(yīng)過(guò)程就不同了,先看下面一段代碼,這個(gè)是寫在程序的頭部的部分字
10、節(jié):ResetLDRPC, ResetAddr;/ 0x00000000 , Reset-'Supervisor ModeLDRPC, Un d_Addr;/ 0x00000004 , Undefined Instruction-'Undefined ModeLDRPC, SWI_Addr;/ 0x00000008 , Software Interrupt-'Supervisor ModeLDRPC, PAbort_Addr;/ 0x0000000c , Abort(Prefetch)-'Abort ModeLDRPC, DAbort_Addr;/ 0x0000
11、0010 , Abort(Data)-'Abort ModeDCD0xB9205F80;/ 0x00000014 , Reserved->LDRPC, PC,#-0xFF0;/ 0x00000018 , IRQ->IRQ ModeLDRPC, FIQ_Addr;/ 0x0000001c , FIQ指令為“ LDRPC, PC,#-0xFF0 ”非常特殊,其并沒(méi)有跳轉(zhuǎn)到IRQ中斷程序的入口處, 而是進(jìn)行了一個(gè) PC 的運(yùn)算后賦值,這里就要說(shuō)明其緣由。在LPC系列中,IRQ的響應(yīng)過(guò)程,程序的入口地址并不是直接寫在這條語(yǔ)句中,而是放在一個(gè)寄存器中,該寄存器是:VICVectAdd
12、r,其地址是0xFFFFF030,現(xiàn)在就很明白了,在執(zhí)行語(yǔ)句“LDRPC, PC,#-0xFF0 ”時(shí),PC的值已經(jīng)變?yōu)樵撜Z(yǔ)句的后面第二條語(yǔ)句的地址了,也就是 0x00000020,而0x00000020 0xFF0時(shí),發(fā)生借位,其結(jié)果恰好為 0xFFFFF030 ,也就是說(shuō), 通過(guò)這個(gè)簡(jiǎn)單的運(yùn)算,使 PC跳轉(zhuǎn)到了寄存器 VICVectAddr中包含的值為地址的位置上,這 樣就簡(jiǎn)單的完成了 IRQ的跳轉(zhuǎn)。當(dāng)然,IRQ中斷源不止一個(gè),其中斷服務(wù)程序也不止一個(gè),這個(gè)寄存器的值是自動(dòng)更新的, 另有一組寄存器 VICVectAddr。15 (后面有數(shù)字)將IRQ的16個(gè)中斷源的地址分別放在對(duì) 應(yīng)的位置
13、上(優(yōu)先級(jí)等內(nèi)容有另外的寄存器來(lái)控制,這里不多說(shuō)),當(dāng)IRQ中斷發(fā)生時(shí),硬件自動(dòng)將對(duì)應(yīng)的 VICVectAddr。15中的某個(gè)對(duì)應(yīng)的地址傳給VICVectAddr寄存器,這個(gè)過(guò)程不用我們來(lái)編程實(shí)現(xiàn)。原文鏈接: nfei.ba nfei-9-1465093.htmluCOS-II在ARM移植中的中斷處理uCOS II是一個(gè)源碼公開(kāi)、可移植、可固化、可剪裁和搶占式的實(shí)時(shí)多任務(wù)操作系統(tǒng),其大 部分源碼是用ANSI C編寫,與處理器硬件相關(guān)的部分使用匯編語(yǔ)言編寫??偭考s 200行的 匯編語(yǔ)言部分被壓縮到最低限度,以便于移植到任何一種其它的CPU上。uCOS II最多可支持56個(gè)任務(wù),其內(nèi)核為占先式,總
14、是執(zhí)行就緒態(tài)的優(yōu)先級(jí)最高的任務(wù),并 支持Semaphore (信號(hào)量)、Mailbox (郵箱)、MessageQueue(消息隊(duì)列)等多種常用的進(jìn)程 間通信機(jī)制。與大多商用RTOS不同的是,uCOS II公開(kāi)所有的源代碼并可以免費(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語(yǔ)言書寫的,uCOS II的軟硬件體系結(jié)構(gòu)如圖1。應(yīng)
15、用程序處于整個(gè)系統(tǒng)的頂層 獨(dú)占了 CPU,因而可以設(shè)計(jì)成為一個(gè)無(wú)限循環(huán)。大部分代碼是使用因此uCOS II的可移植性較好。盡管如此,仍然需要使用C和匯編語(yǔ)言寫一些處理器相關(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)的編寫
16、。uCOS II處理器無(wú)關(guān)的代碼提供 uCOS II的系統(tǒng)服務(wù),應(yīng)用程序可以使用這些API函數(shù)進(jìn)行內(nèi)存管理、任務(wù)間通信以及創(chuàng)建、刪除任務(wù)等。2 uCOS II移植過(guò)程中需要注意的幾個(gè)問(wèn)題uCOS II移植的中斷處理跟 ARM體系結(jié)構(gòu)和uCOS II處理中斷的過(guò)程有關(guān),必須注意這2個(gè)方面的問(wèn)題才能高效移植。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
17、 MODE)指令預(yù)取指中止、數(shù)據(jù)中止時(shí)進(jìn)入該模式;未定義模式(UND MODE)當(dāng)執(zhí)行未定義的指令時(shí)進(jìn)入該模式;系統(tǒng)模式(SYS MODE)是操作系統(tǒng)一種特許的用戶模式。除了用戶模式之外,其他模式都?xì)w為特權(quán)模式,特權(quán)模式用于中斷服務(wù)、異常或者訪問(wèn)受保護(hù)的資源特權(quán)模式中除系統(tǒng)模式之外另 5種模式又稱為異常模式,在移植過(guò)程中必須設(shè)置中斷向量表 來(lái)處理異常。uCOS II的移植主要處理標(biāo)準(zhǔn)中斷 (IRQ)、快速中斷(FIQ)和軟件中斷(SWI)。2.2 uCOS II中斷響應(yīng)的過(guò)程以IRQ中斷為例,假設(shè)CRPS中l(wèi)_bit位為0,當(dāng)有IRQ中斷時(shí),CPU強(qiáng)制進(jìn)入IRQ模式, 當(dāng)前的CPSR拷貝到SP
18、SR_irq 中, PC值保存在LR_irq中,置CPSR中的I位以關(guān)閉IRQ 中斷。數(shù)據(jù)保存之后,CPU強(qiáng)行從0X00000018開(kāi)始執(zhí)行,PC值保存了 OS_CPU_IRQ_ISR() 的地址, 然后執(zhí)行 OS_CPU_IRQ_ISR() 。在 OS_CPU_IRQ_ISR() 中 OS_CPU_IRQ_ISR_Ha ndler()被調(diào)用來(lái)檢測(cè)中斷源并執(zhí)行中斷。OS_CPU_IRQ_ISR_Handler()返回以后,OS_CPU_IRQ_ISR() 又調(diào)用 OSIntExit()來(lái)確認(rèn)是否有比ISR優(yōu)先級(jí)更高的任務(wù)要執(zhí)行。如果當(dāng)前中斷任務(wù)仍然是優(yōu)先級(jí)最高的任務(wù),OS In tExit()
19、返回,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)中斷來(lái)保護(hù)臨界代碼。它定義了 2個(gè)宏來(lái)開(kāi)中斷(OS_EXIT_CRITICAL(),關(guān) 中斷(OS_ENTER_CRITICAL() 。OS_ENTER_CRITICAL()和 OS_EXIT_CRITICAL()有3種 方法來(lái)實(shí)現(xiàn),uCOS II建議使用第3種方法可以保存當(dāng)前處理器狀態(tài)的值。3 uCOS II移植過(guò)程中的中斷處理uCOS II中斷處理跟 CRT.S、OS_CPU_A.S
20、 和BSP.C有關(guān),其移植過(guò)程主要有以下幾個(gè)步 驟。3.1在CRT.S中設(shè)置中斷向量表ARM 的中斷向量表位于ROM 的最底部,其地址范圍為 0X000000000X0000001C,設(shè)置如下:VECTORS:LDR PC,RESET_ADDRLDR PC,UNDEF_ADDRLDR PC,SWI_ADDRLDR PC,PABT_ADDRLDR PC,DABT_ADDRNOP /*保留向量*/LDR PC,IRQ_ADDRLDR PC,FIQ_ADDRRESET_ADDR:. WORD RESET_HANDLERUNDEF_ADDR:.WORD UNDEF HANDLERSWI_ADDR:.W
21、ORD SWI HANDLERPABT_ADDR:.WORD PABT_HANDLERDABT_ADDR:.WORD DABT_ HANDLER.WORD 0 /*保留地址*/IRQ_ADDR:.WORD IRQ_HANDLERFIQ_ADDR:.WORD FIQ HANDLERUNDEF_HANDLER:B UNDEF_HANDLERSWI_HANDLER: B SWI_HANDLERPABT_HANDLER: B PABT_HANDLERDABT_HANDLER: B DABT_HANDLERIRQ_HANDLER: B OS_CPU_IRQ_ISR/*跳轉(zhuǎn)至U OS_CPU_IRQ_IS
22、R(在 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ù)(OSCtxSw)比較相似,主要有以下幾步組成:1) 調(diào)用 OSTask SwHook()2) OSPrioCur=OSPrioHighRdy3) OSTCBCur=OSTCBHighRdy4) SP=OST
23、CBHighRdy->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)的過(guò)程”編寫,其主要代碼如下:LDR R0,OS_I ntNest ingLDRB R1,R0ADD R1,R1,#1STRB R1,R0CMP R1,#lBNE OS_CPU_IRQ_ISR_1LDR R4,0S_TCBCurLDR R5,R4STR SP ,R50S_CPU_IRQ_ISR_1:MSR CPSR_c
24、,#(NO_INT | IRQ32_MODE) /切換到SVC模式LDR RO,OS_CPU_IRQ_ISR_Ha ndlerMOV LR,PCBX ROMSR CPSR_c,#(NO_INT | SVC32_MODE)/切換到SVC模式LDRR0,OS_I ntExit /OSI ntExit()MOV LR,PCBX R0在代碼中省略了現(xiàn)場(chǎng)工作寄存器的保護(hù)與恢復(fù)及工作模式的切換。3.4移植中斷處理程序以IRQ中斷為例,移植中斷處理程序:C程序void OS_CPURQ_ISR_Ha ndler(void) PFNCT pfnct; / 定義中斷函數(shù)指針pfnct=(PFNCT)VICVec
25、tAddr; / 獲取函數(shù)地址 while(pfnct!=(PFNCT)0) (*pfnct)(); / 調(diào)用中 斷函數(shù)pfnct=(PFNCT)VICVectAddr; / 獲取新的中斷函數(shù) /所有中斷都執(zhí)行完畢退出 中斷處理程序依賴中斷控制器的中斷響應(yīng)順序,所以 uCOS II把 OS_CPU_IRQ_ISR_Ha ndler()歸屬于用戶程序的一部分。在中斷返回之前,中斷處理程序要處理完所有的中斷響應(yīng),以避免在多個(gè)中斷同時(shí)響應(yīng)或中斷處理過(guò)程中響應(yīng)中斷的情況下,進(jìn)入 OS_CPU_IRQ_ISR ()和退出 OS_CPU_IRQ_ISR()時(shí),OS_CPU_IRQ_ISR() 耗盡保存CP
26、U寄存器的堆棧空間。另外,在OS_CPU_IRQ_ISR_Handler()中不要清CPSR的I位來(lái)開(kāi)放中斷,因?yàn)闆](méi)有必要使用中斷嵌套,OS_CPU_IRQ_ISR_Ha ndler()在返回之前會(huì)檢查并處理所有的中斷。3.5編寫中斷函數(shù)中斷函數(shù)一般采用 C語(yǔ)言編寫,uCOS II建議中斷函數(shù)應(yīng)盡量短,一般做法是在中斷函數(shù)中緩存數(shù)據(jù),給任務(wù)發(fā)送一個(gè)信號(hào)來(lái)處理數(shù)據(jù)。中斷函數(shù)的地址在系統(tǒng)初始化的時(shí)候要置人中斷向量寄存器(VICVectAddrO15)。由于向量中斷控制器(VIC)的特殊結(jié)構(gòu),在中斷函數(shù)中 要寫一次中斷向量寄存器(VICVectAddr)。4中斷處理的應(yīng)用示例uCOS II要提供周期
27、性信號(hào)源,用于實(shí)現(xiàn)時(shí)間延時(shí)和確認(rèn)超時(shí)。節(jié)拍率應(yīng)為10100 Hz。時(shí)鐘節(jié)拍源可以由專門的硬件定時(shí)器產(chǎn)生,以下就以IRQ中斷方式產(chǎn)生節(jié)拍源為示例。初始化中斷控制器:C程序voidVICI ni t(void)VICI ntE nClr=0xffff;VICDefVectAddr=-(INT32U)Non_Vect_IRQ_Ha ndler;VICVectAddr0=(INT32U)OSTicklSR; VICVectC ntl0= (0x20 | 0x04); VICI ntEn able= 1<<4; 定時(shí)器0中斷函數(shù):C程序void OSTickISR(void) TO_IR =
28、 0xff; OSTimeTick(); / 調(diào)用 OSTimeTick() VICVectAddr=0;/通知中斷控制器中斷結(jié)束當(dāng)定時(shí)中斷發(fā)生時(shí)調(diào)用OS_CPU_IRQ_ISRHandler(),得到OSTicklSR()的地址并執(zhí)行,在OSTicklSR()中調(diào)用OSTimeTick()為uCOS II提供周期性信號(hào)源。此代碼在GNU工具鏈ARM-GCC下編譯通過(guò),并在EasyARM2100開(kāi)發(fā)實(shí)驗(yàn)板上得到驗(yàn)證。5結(jié)束語(yǔ)通過(guò)示例講述了在 uCOS II移植過(guò)程中的中斷處理所需要注意的幾個(gè)問(wèn)題和通用方法,經(jīng) 筆者在GNU工具鏈下編譯、調(diào)試,并在實(shí)驗(yàn)板上得到很好的驗(yàn)證。這種移植方案的中斷函 數(shù)
29、都使用C語(yǔ)言編寫,具有較好的移植性,有利于對(duì)不同需求的用戶進(jìn)行中斷擴(kuò)充,增強(qiáng) 了中斷嵌套時(shí)uCOS II運(yùn)行的穩(wěn)定性,使移植具有更好的通用性。ARM中斷處理的研究在嵌入式系統(tǒng)中常用的RISC處理器是ARM核,它具有體積小、功耗低、成本低、性價(jià)比高 的特點(diǎn)。然而,不管是哪種型號(hào)的 arm處理器,也無(wú)論該 嵌入式系統(tǒng)中是否有操作系統(tǒng),中 斷處理,特別是IRQ中斷,始終是必須的,而中斷處理的核心問(wèn)題是上下文的保存。能否安全而又高效地保存上下文,將影響一個(gè)嵌入式系統(tǒng)的性能與穩(wěn)定。筆者對(duì)arm處理器的普通中斷處理、任務(wù)切換中斷處理、 可重人中斷處理和基于優(yōu)先級(jí)的可重人性中斷處理的上下文 保存技術(shù)進(jìn)行分析
30、與總結(jié)。為保證理論的正確性,核心的程序代碼都經(jīng)過(guò)了實(shí)驗(yàn)的檢測(cè)。1系統(tǒng)中斷處理簡(jiǎn)介arm處理器的中斷主要有兩種:IRQ普通中斷和FIQ快速中斷。快速中斷本質(zhì)上與普通 中斷沒(méi)有太大的差別,它們?cè)谔幚頇C(jī)制上有許多相同的地方。IRQ中斷是最頻繁的也是最為影響系統(tǒng)性能的,所以對(duì)它的研究與處理也就最有價(jià)值。下面簡(jiǎn)要地介紹一下IRQ異常發(fā)生時(shí)ARM處理器的工作過(guò)程。在 IRQ中斷發(fā)生時(shí),arm 處理器的硬件會(huì)自動(dòng)執(zhí)行以下工作:將被中斷任務(wù)模式的CPSR®保存到IRQ模式中的SPSR寄存器中;將被中斷任務(wù)模式的PC值保存到IRQ模式中的LR寄存器中;將模式自動(dòng)切換到IRQ模式,并將CPSF中的bit
31、7位置1禁止后繼IRQ中斷的發(fā)生;PC被賦予0x18的地址值,程序?qū)?中斷處理機(jī)制的工作過(guò)程。0x18片開(kāi)始執(zhí)行。結(jié)合圖1,可以更好地理解 arm"roR0*RI2 SPSP LRLRCPSRSPSRCPSR被麟式SPSRIRQ模式寄存器IRQ模式棧IRQ中斷處理寄存器保存示意2普通中斷處理有些arm嵌入式系統(tǒng)可能對(duì)中斷的要求比較低,即發(fā)生中斷后首先查詢相應(yīng)的中斷源,然后進(jìn)行中斷服務(wù), 最后從中斷服務(wù)程序中返回到被中斷處繼續(xù)運(yùn)行程序。如何在這種簡(jiǎn)單應(yīng)用中保證 安全又高效地處理中斷呢? “安全”就意味著中斷發(fā)生時(shí)上下文被完好保存不被破壞,“高效”就是說(shuō)保存盡可能少的寄存器(當(dāng)然是建立
32、在安全的基礎(chǔ)上的 )。由圖1可知,在普通中斷處理中,中斷服務(wù)就可以在IRQ模式中運(yùn)行。根據(jù)ATPCS勺調(diào)用規(guī)則,在子程序 調(diào)用中arm編譯器保存了 R4R11寄存器,因此就沒(méi)有必要再次保存。那么剩下的寄存器就 必須予以保存,防止從中斷服務(wù)程序返回后被破壞??梢杂脜R編語(yǔ)言和 C語(yǔ)言書寫處理代碼。首先假設(shè)初始化代碼中已正確建立了IRQ堆棧。Interrupt HandlerSUBR1停紬cfQRCom電J;調(diào)整LR寄存器STMFD SP!, R0-R3, R12f R14$保護(hù)上下文<所有已使能中斷的查詢與服務(wù) >;將同時(shí)發(fā)生的中斷全部服務(wù),以提高效率LDMFD SP, R0-R3 ,
33、 R12 R14;恢復(fù)上下文在上述保存上下文中沒(méi)有必要保存SPSR因在非嵌套的中斷處理程序中,它不會(huì)被任何順序的中斷所破壞。如果用C語(yǔ)言來(lái)書寫該處理程序,可以使用關(guān)鍵字一 IRQ來(lái)說(shuō)明,以告訴編譯器實(shí)現(xiàn)如下的操作: 保存.ATPCS規(guī)定的被破壞的寄存器; 保存其他中斷處理程序中用到的寄存器; 同時(shí)將(LR-4)賦予程序計(jì)數(shù)器PC實(shí)現(xiàn)中斷程序的返回并且恢復(fù)CPSF寄存器的內(nèi)容。普通中斷處理的 C語(yǔ)言程序可以按如下格式編寫:irq void IRQHandler(void) V所有已使能中斷的查詢與服務(wù)其實(shí)審與C語(yǔ)言相對(duì)應(yīng)的匯編程序是如下的:iRQH訛曲噸蕊“頃電淞“(D STMFDSP!,R0-
34、R3, R12, LR査詢中斷源并進(jìn)入相應(yīng)的服務(wù)程序 LDMFD SP!, R0-R3, R12, LR SUBS PC, LR, iMEND2給出了)。圖中可見(jiàn),無(wú)論是用 c語(yǔ)言還是匯編語(yǔ)言來(lái)編寫,它們的工作原理都是一樣的。圖 普通中斷處理過(guò)程中,arm寄存器的保存示意圖(虛線是壓棧保存,實(shí)線是彈?;謴?fù) 與程序處理的步驟相對(duì)應(yīng),可以幫助理解處理器上下文的保存過(guò)程。普通中斷處理上下文保存示意3任務(wù)切換有操作系統(tǒng)的嵌入式系統(tǒng)中,中斷的發(fā)生要求保存全部寄存器的內(nèi)容到任務(wù)的棧中,任務(wù)切換發(fā)生時(shí)所有任務(wù)的寄存器不是基于安全的考慮是因?yàn)榭赡苤袛鄷?huì)導(dǎo)致任務(wù)的切換。的值都要保存到該任務(wù)的棧中。下個(gè)任務(wù)的上下
35、文將從該任務(wù)棧中得以恢復(fù)到處理器的寄存器中。下面就本問(wèn)題作出分析并給出實(shí)現(xiàn)的程序代碼。從圖1中斷處理寄存器的保存可知,中斷發(fā)生后任務(wù)的 CPSR和PC兩寄存器的值在IRQ模式的SPSR和LR中,所以不能簡(jiǎn)單地切 換到任務(wù)運(yùn)行的模式中,否則被中斷任務(wù)返回時(shí)的 CPSR和PC將不可見(jiàn)(因?yàn)樗鼈儽4嬖贗RQ 模式的專用寄存器中, 在其他模式中無(wú)法操作)。此時(shí),可以考慮設(shè)置一些變量區(qū)作為媒介, 將其予以轉(zhuǎn)存到任務(wù)運(yùn)行模式的棧中去。3所示的保存任;LR_Frame 和 SPSR_Frame是變量區(qū))。下面假設(shè)任務(wù)切換是在 SVC模式中運(yùn)行的。結(jié)合上面的分析,可以有圖 務(wù)切換的示意圖(虛線是壓棧保存,實(shí)線
36、是彈棧恢復(fù)R0R0R3R0R12RI2SPLR?R3R12sFr lrSPSRJrqLRjvc IRJrqCPSR SPSRSVC模式寄存器 LR_irqSPSR irqT.* CPSR 4 ;rhsPSR I EI ! IRQ!模式寄存器圖3任務(wù)切換中斷處理上下文保存示意圖NextPage結(jié)合圖3任務(wù)切換中斷處理中的步驟,可以用匯編語(yǔ)言寫出相對(duì)應(yīng)的中斷處理程序:IRQ_EntrySUBST MFDLDRSTRMRSIJDRR14. RMt 41;調(diào)整返冋地址SP!, RO7 保存 RORO* = LRFrameLR, RO;保存LRJrq到存儲(chǔ)器變扯中LR, SPSRRO,二5卩SR_Fra
37、me丨保存SPSRirq到存儲(chǔ)器變量中STRLDMFDLDRMSRSUBSTMFDLDRLR, R0聲停擁曲;二止中斷 CPSR_c, LRSP, SP, 5±4 ,預(yù)留1個(gè)字空間保存LR_irq SP!, (LR;保存 LR.SVCLR t LR_Framet保存LR_irq(任務(wù)返回地址)LDRSTRLDRLR, E1.RLR. SP. #4LR t SPSR_ F rame 保存SPSR_irq(任務(wù)的CPSR)LDRSTMFDLRt LRSP! > RO 5 R12>LR;保存 R0-R12, SPSRJtq5理中斷并噸紬瑟麟為畑血曾 V > JI廠1r &l
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024-2030年中國(guó)多模頭商業(yè)計(jì)劃書
- 2024-2030年中國(guó)垃圾轉(zhuǎn)運(yùn)保潔車行業(yè)發(fā)展預(yù)測(cè)及投資戰(zhàn)略分析報(bào)告版
- 2024-2030年中國(guó)咖啡機(jī)市場(chǎng)銷售態(tài)勢(shì)及競(jìng)爭(zhēng)策略研究報(bào)告
- 眉山藥科職業(yè)學(xué)院《商業(yè)展示空間設(shè)計(jì)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024年煤矸石運(yùn)輸權(quán)責(zé)協(xié)議
- 2024年標(biāo)準(zhǔn)汽車租賃協(xié)議范本版B版
- 2024年物流配送服務(wù)與管理體系合同
- 2024年校園秩序維護(hù)聘用合同
- 2024年度垃圾清理與環(huán)保監(jiān)測(cè)服務(wù)協(xié)議3篇
- 2024年度水利工程安全生產(chǎn)責(zé)任書與事故處理合同3篇
- 金剛砂耐磨地面施工安全方案
- 期末測(cè)試卷(一)2024-2025學(xué)年 人教版PEP英語(yǔ)五年級(jí)上冊(cè)(含答案含聽(tīng)力原文無(wú)聽(tīng)力音頻)
- 2023-2024學(xué)年廣東省深圳市南山區(qū)八年級(jí)(上)期末英語(yǔ)試卷
- 2024廣西專業(yè)技術(shù)人員繼續(xù)教育公需科目參考答案(100分)
- 2024年上海市中考語(yǔ)文備考之150個(gè)文言實(shí)詞刷題表格及答案
- 2024年漢口銀行股份有限公司招聘筆試沖刺題(帶答案解析)
- 中醫(yī)跨文化傳播智慧樹(shù)知到期末考試答案章節(jié)答案2024年浙江中醫(yī)藥大學(xué)
- 2024年日歷表(空白)(一月一張-可編輯做工作日歷)
- 廣東省中山市2023-2024學(xué)年四年級(jí)上學(xué)期期末數(shù)學(xué)試卷
- 2022-2024年國(guó)際經(jīng)濟(jì)與貿(mào)易專業(yè)人才培養(yǎng)調(diào)研報(bào)告
- 奇門遁甲入門教程(不收費(fèi))課件
評(píng)論
0/150
提交評(píng)論