嵌入式中斷實(shí)驗(yàn)_第1頁
嵌入式中斷實(shí)驗(yàn)_第2頁
嵌入式中斷實(shí)驗(yàn)_第3頁
已閱讀5頁,還剩9頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、5.3 中斷實(shí)驗(yàn)實(shí)驗(yàn)?zāi)康?. 了解中斷的作用;2. 掌握嵌入式系統(tǒng)中斷的處理流程;3. 掌握ARM中斷編程。實(shí)驗(yàn)內(nèi)容1. 編寫中斷處理程序,處理外部中斷;預(yù)備知識1. 了解ADT IDE集成開發(fā)環(huán)境的基本功能;2. 了解中斷的作用以及基本處理過程。實(shí)驗(yàn)設(shè)備1. 硬件:JX44B0教學(xué)實(shí)驗(yàn)箱、PC機(jī);2. 軟件:PC機(jī)操作系統(tǒng) Windows 98(2000、XP) + ADT IDE集成開發(fā)環(huán)境?;A(chǔ)知識1. 中斷的基本概念CPU與外設(shè)之間傳輸數(shù)據(jù)的控制方式通常有三種:查詢方式、中斷方式和DMA方式。DMA方式將在后續(xù)實(shí)驗(yàn)中說明。查詢方式的優(yōu)點(diǎn)是硬件開銷小,使用起來比較簡單。但在此方式下,CP

2、U要不斷地查詢外設(shè)的狀態(tài),當(dāng)外設(shè)未準(zhǔn)備好時,CPU就只能循環(huán)等待,不能執(zhí)行其它程序,這樣就浪費(fèi)了CPU的大量時間,降低了 CPU的利用率。為了解決這個矛盾,通常采用中斷傳送方式:即當(dāng)CPU進(jìn)行主程序操作時,外設(shè)的數(shù)據(jù)已存入輸入端口的數(shù)據(jù)寄存器;或端口的數(shù)據(jù)輸出寄存器已空,由外設(shè)通過接口電路向CPU發(fā)出中斷請求信號,CPU在滿足一定的條件下,暫停執(zhí)行當(dāng)前正在執(zhí)行的主程序,轉(zhuǎn)入執(zhí)行相應(yīng)能夠進(jìn) 行輸入/輸出操作的子程序,待輸入 /輸出操作執(zhí)行完畢之后 CPU再返回并繼續(xù)執(zhí)行原來被 中斷的主程序。這樣 CPU就避免了把大量時間耗費(fèi)在等待、查詢狀態(tài)信號的操作上,使其 工作效率得以大大地提高。能夠向CPU

3、發(fā)出中斷請求的設(shè)備或事件稱為中斷源。系統(tǒng)引入中斷機(jī)制后,CPU與外設(shè)(甚至多個外設(shè))處于“并行”工作狀態(tài),便于實(shí)現(xiàn)信息的實(shí)時 處理和系統(tǒng)的故障處理。中斷方式的原理示意圖如下所示。1)中斷響應(yīng)中斷源向CPU發(fā)出中斷請求,若優(yōu)先級別最高,CPU在滿足一定的條件下,可以中斷當(dāng)前程序的運(yùn)行,保護(hù)好被中斷的主程序的斷點(diǎn)及現(xiàn)場信息。然后,根據(jù)中斷源提供的信息,找 到中斷服務(wù)子程序的入口地址,轉(zhuǎn)去執(zhí)行新的程序段,這就是中斷響應(yīng)。CPU響應(yīng)中斷是有條件的,如內(nèi)部允許中斷、中斷未被屏蔽、當(dāng)前指令執(zhí)行完等。2)中斷服務(wù)子程序CPU響應(yīng)中斷以后,就會中止當(dāng)前的程序,轉(zhuǎn)去執(zhí)行一個中斷服務(wù)子程序,以完成為相 應(yīng)設(shè)備的服

4、務(wù)。中斷服務(wù)子程序的一般結(jié)構(gòu)如下圖所示。圖5-8中斷服務(wù)子程序處理流程保護(hù)現(xiàn)場(由一系列的壓棧指令完成)。目的是為了保護(hù)那些與主程序中有沖突的寄 存器,(如R0,R1,R2等),如果中斷服務(wù)子程序中所使用的寄存器與主程序中所使用的寄存 器等沒有沖突的話,這一步驟可以省略。中斷處理,中斷處理程序在檢查到相應(yīng)的中斷源后,調(diào)用對應(yīng)的中斷處理程序完成。恢復(fù)現(xiàn)場并返回(由一系列的出棧指令完成)。是與保護(hù)現(xiàn)場對應(yīng)的,但要注意數(shù)據(jù) 恢復(fù)的次序,以免混亂。由于中斷服務(wù)子程序需要打斷主程序的執(zhí)行,因此其處理應(yīng)該及時完成,較長時間的延時將導(dǎo)致系統(tǒng)性能嚴(yán)重下降。2. S3C44B0X 中斷控制器S3C44B0X的中

5、斷控制器包括 5類寄存器:中斷控制寄存器、中斷狀態(tài)寄存器、中斷模 式寄存器、中斷屏蔽寄存器和中斷清除寄存器。1)中斷控制寄存器該控制寄存器是處理器總的中斷控制,包括中斷模式是矢量模式還是非矢量模式,是否使能IRQ模式的中斷,是否使能 FIQ模式的中斷,具體說明如下:表5-3中斷控制寄存器寄存器名稱地址讀寫 狀態(tài)描述復(fù)位值INTCONOxOIEOOOOOR/W中斷控制寄存器Ox7INTCON位描述初始狀態(tài)保留300V2IRQ禁止/使能向量模式0 :向量中斷模式1 :非向量中斷模式1I1使能CPU的IRQ中斷,在使用IRQ中斷之前,必須清除該位0 : IRQ中斷使能1 : IRQ中斷禁止1F0使能

6、CPU的FIQ中斷,在使用FIQ中斷之前,必須清除該 位10 : FIQ中斷使能1 : FIQ中斷禁止2)中斷狀態(tài)寄存器該寄存器用于檢查中斷來源,該寄存器是只讀屬性的。表5-4中斷狀態(tài)寄存器寄存器名稱地址讀寫 狀態(tài)描述復(fù)位值INTPND0X01E00004R指示中斷請求狀態(tài)0:中斷已被響應(yīng)1:有中斷請求0x03)中斷模式寄存器用于設(shè)置相應(yīng)中斷的工作模式,是IRQ模式還是FIQ模式。表5-5中斷模式寄存器寄存器名稱地址讀寫 狀態(tài)描述復(fù)位值INTMOD0X01E00008R/W中斷模式寄存器0 : IRQ模式1 : FIQ模式0x04)中斷屏蔽寄存器表5-6中斷屏蔽寄存器寄存器名稱地址讀寫 狀態(tài)描

7、述復(fù)位值INTMSK0X01E0000CR/W確定哪一個中斷 源被屏蔽,屏蔽的 中斷源將不引發(fā) 中斷0 :中斷服務(wù)有效1 :中斷服務(wù)屏蔽0X7FFFFFF5)中斷清除寄存器中斷處理之后需要清除相應(yīng)的標(biāo)志位,中斷清除寄存器說明如下:表5-7中斷清除寄存器寄存器名稱地址讀寫 狀態(tài)描述復(fù)位值l_ISPC0X01E00024WIRQ中斷請求清0寄存 器未定義F_ISPC0X01E0003CWFIQ中斷請求清0寄存 器未定義4. JX44B0 中斷處理S3C44B0X處理器的中斷處理與其他CPU的處理模式基本上是一致的,只是由于它引入了幾種不同的處理器模式,使中斷處理變得更加容易。其典型的步驟如下:1)

8、保存現(xiàn)場:當(dāng)系統(tǒng)出現(xiàn)中斷時,處理器首先要做的就是保存現(xiàn)場,這一過程包括:保存當(dāng)前的PC值到lr中,保存當(dāng)前的程序運(yùn)行狀態(tài)到 spsr中。值得注意的就是由于 ARM7 采用3級流水線結(jié)構(gòu),此時的 PC值實(shí)際上等于當(dāng)前指令地址加上 8( ARM指令時),所 以返回時還需要將保存的 PC值減4 ;2)模式切換:當(dāng)處理器完成現(xiàn)場保護(hù)后,就進(jìn)入中斷模式,并將PC值置為一個固定的值0X00000018 ,這也就是IRQ模式的中斷入口地址。在中斷模式下,有兩個獨(dú)立的寄 存器R13、R14,這樣可以便于中斷程序使用自己特有的堆棧。但這樣隨之而來產(chǎn)生一個問題,就是中斷處理時堆棧溢出保護(hù)的問題,需要我們認(rèn)真地估計

9、堆棧的大小,同時在中斷處理時也要盡量減少函數(shù)調(diào)用的層次,否則將產(chǎn)生一些不可預(yù)知的錯誤;3)獲取中斷源:所有的IRQ中斷都從0X00000018 開始執(zhí)行,通常在該地址處放一 條跳轉(zhuǎn)指令,進(jìn)一步跳到我們的中斷程序中;4)處理中斷:在中斷程序中需要進(jìn)一步獲取中斷源,即誰引發(fā)了該中斷,然后通過查 表獲取相應(yīng)中斷的處理程序入口,并調(diào)用對應(yīng)的函數(shù);5)中斷返回,恢復(fù)現(xiàn)場:在返回時需要恢復(fù)處理器模式,包括恢復(fù)中斷處理用到的所有寄存器、恢復(fù)被中斷的程序運(yùn)行狀態(tài)到CPSR,并跳轉(zhuǎn)到被中斷的主程序。下圖為JX44B0教學(xué)實(shí)驗(yàn)系統(tǒng)中處理外部中斷0的流程:中斷人口 -.第二釈跡裟一第三次蹴轉(zhuǎn)申斷分發(fā)例程中劭向園表L

10、11R PC, =OKOCOOnOOi)ci>?na)naBHandleiIKUlarlRQEINTO IsroxontDoaDi oxooanaaiiUXDCtUU<uu uxucauiKoIMDCFFFFDIIXUUVUIUU*HandlerIRQ圖5-8 JX44B0中斷處理示意圖中斷的入口代碼(匯編代碼)0X00000018:LDR pc, =0X0C0000200X0C000020:bHandlerIRQHandlerIRQ:subsp,sp,#4/*為中斷分發(fā)例程入口地址預(yù)留??臻g*/stmfdsp!,r0/*保存R0 */ldrr0,=HandleIRQ/*將中斷分發(fā)

11、例程入口地址指針保存到R0 中 */ldrr0,r0/*將中斷分發(fā)例程入口地址保存到R0中*/strr0,sp,#4/*將中斷分發(fā)例程入口地址保存到預(yù)留的堆??臻g*/ldmfdsp!,r0,pc/*將R0和中斷分發(fā)例程入口地址出棧,這條指令也*/*實(shí)現(xiàn)了一個跳轉(zhuǎn) */上述代碼實(shí)際上就是一個三級跳,即從FLASH中跳到了 RAM的中斷入口,然后又從中Han dlelRQ 地址處保斷入口跳到中斷分發(fā)例程入口。在此我們有一個前提條件,即必須在存正確的分發(fā)例程入口地址,如使用下面代碼后IsrIRQ就是中斷分發(fā)例程:ldr r0,=HandleIRQldrr1,=lsrlRQstrr1,r0中斷分發(fā)例程

12、可以采用匯編語言和C語言兩種格式編寫,下面將分別列出這兩種方式。1)用匯編代碼編寫的中斷分發(fā)例程:IsrIRQ:/*using I_ISPR register.*/sublr,lr,#4stmfdsp!,lr/*保存中斷返回的 PC值 */stmfdsp!,r0-r4/*備份寄存器R0-R4*/subsp,sp,#4/*為PC預(yù)留??臻g*/stmfdsp!,r8-r9/*備份寄存器R8-R9*/Idrr9,=l_ISPR/*讀取中斷狀態(tài)*/Idrr9,r9cmpr9, #0x0/*檢查中斷狀態(tài)*/beqi2movr8,#0x0/* R8保存中斷表的偏移 */i0:/*逐位檢查中斷狀態(tài)*/mov

13、sr9,r9,Isr #1bcsi1/*如果該位等于1,則處理這一中斷*/addr8,r8,#4/*修改當(dāng)前的中斷偏移 */bi0/*處理下一比特*/i1:Idrr9,=HandleADC/* HandIeADC 位于中斷向量表起始位置,我們將該地址用作是中斷向量表的基地址*/addr9,r9,r8/*計算入口地址指針:中斷基地址加上偏移*/Idrr9,r9/*從地址向量表中獲取入口地址*/strr9,sp,#8/*將入口地址保存到堆棧,并移動堆棧指針*/movIr,pc/*保存當(dāng)前PC*/Idmfdsp!,r8-r9,pc/*調(diào)用中斷例程 */iO-Idmfdsp!,r0-r4, pcA/*

14、中斷返回,并恢復(fù)中斷前的處理器模式*/i2:Idmfdsp!,r8-r9/*如果當(dāng)前沒有任何中斷,直接返回*/addsp,sp,#4/*移動堆棧指針,該空間由第4句指令預(yù)留*/Idmfdsp!,r0-r4, pcA/*中斷返回,并恢復(fù)中斷前的處理器模式*/2)用C代碼編寫的中斷分發(fā)例程:attribute如果采用GNU編譯器,需要將該函數(shù)定義為中斷類型,使用關(guān)鍵字:(interrupt("IRQ")。如下所示代碼為 C語言的IsrIRQ實(shí)現(xiàn):typedef (*ISR_ROUTINE_ENTRY)(void);void IsrIRQ() _attribute_ (inter

15、rupt("IRQ");void IsrIRQ()int count = 0;unsigned int isr_pending;unsigned int isr_mask = 0x00000001;unsigned int isr_mask_set = rINTMSK;/* 讀取中斷掩碼 */ISR_ROUTINE_ENTRY isr_routine_entry = (ISR_ROUTINE_ENTRY)0x0; isr_pending = (rINTPND & isr_mask_set);/* 讀取中斷狀態(tài) */*查表*/while(isr mask)if(isr

16、_pending&isr_mask)/*找到中斷源,獲取中斷例程入口地址*/isr_routine_entry = (ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count); break;count+=4;isr_mask <<= 1;/*調(diào)用中斷服務(wù)例程*/if(isr_routine_entry) (*isr_routine_entry)();中斷處理例程(該函數(shù)無需定義為中斷類型)void EINT0_Isr()rl_ISPC=BIT_EINTO;/*清除中斷標(biāo)志 */中斷向量表中各個中斷的偏移表5-8中斷向量表中各個中斷的偏移中斷源向

17、量表的偏移ADC( AD轉(zhuǎn)換中斷)0X20RTC (實(shí)時時鐘中斷)0X244.實(shí)驗(yàn)參考代碼及說明/*包含文件*/#include "44b.h"typedef (*ISR_ROUTINE_ENTRY)(void);void delay();void extO_int_isr(void);void IsrIRQ() _attribute_ (interrupt("IRQ");/* 聲明為中斷服務(wù)里例程*/int ext0_count = 0;int dither_count = 0;/*/ Function name : IsrIRQ/ Descripti

18、on/:非矢量方式下中斷的查表處理中斷地址表位于 0x0c7fff00 開始的256字節(jié)/ Return type:void/ Argument:void*void lsrlRQ()int count = 0;unsigned int isr_pending;unsigned int isr_mask = 0x00000001;unsigned int isr_mask_set = rINTMSK;ISR_ROUTINE_ENTRY isr_routine_entry = (ISR_ROUTINE_ENTRY)OxO;_asm_ ("STMFDSP!, r1,r4-r8 SAVE r

19、1,r4-r10 n""nop n");isr_pending = (rINTPND & isr_mask_set);while(isr_mask)if(isr_pending&i sr_mask)isr_routine_entry = (ISR_ROUTINE_ENTRY)(*(int*)(HandleADC+count); break;count+=4;isr_mask <<= 1;if(isr_routine_entry) (*isr_routine_entry)();_asm_ ("LDMFDSP!, r1,r4-r8

20、 RESTORE r1,r4-r10 n""nop n");/ Function name/ Description/ Return type:init_interrupt_handler非矢量方式下中斷向量表初始化處理:void/ Argument: irq_handler/中斷處理函數(shù)入口*void init_interrupt_handler(unsigned int irq_handler) int i;rINTPND = 0x00000000;/*清除所有未決的中斷*/rl_ISPC = 0x03FFFFFF;for( i = 0; i < 256

21、; i+=4)*(unsigned int*)(_ISR_STARTADDRESS+i) = 0;/*清除中斷表*/*(unsigned int*)(HandleIRQ) = irq_handler;/*設(shè)置IRQ模式處理函數(shù)*/'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'

22、k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k/ Function name:install_isr_handler

23、/ Description/ Return type/ Argument:非矢量方式下中斷向量的安裝:void:irq_no, 中斷號/irq_routine,中斷處理函數(shù)地址*-void install_isr_handler(int irq_no, void* irq_routine)*(unsigned int*)(irq_no) = (unsigned int)irq_routine;'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k

24、'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k'k

25、'k'k'k'k'k'k'k'k/ Function name:Main/ Description:中斷測試程序主函數(shù)/實(shí)現(xiàn)外部中斷0的測試,引發(fā)中斷后在中斷處理函數(shù)中顯示跑馬燈/ Return type/ Argument:int:void*-int Main()int old_index ;rINTCON=0x7;/* Non-vect,IRQ disable,FIQ disable*/init interrupt handler(unsigned int)IsrIRQ);install_isr_handler(HandleEINTO, (void*)extO_int_isr);rlNTMOD=OxO;/*設(shè)置所有中斷為IRQ模式*/*使能外部中斷O*/rlNTMSK=(0x07ffffff&(BIT_GLOBAL|BIT_E

溫馨提示

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

最新文檔

評論

0/150

提交評論