C語言進(jìn)階-第六講中斷與驅(qū)動_第1頁
C語言進(jìn)階-第六講中斷與驅(qū)動_第2頁
C語言進(jìn)階-第六講中斷與驅(qū)動_第3頁
C語言進(jìn)階-第六講中斷與驅(qū)動_第4頁
C語言進(jìn)階-第六講中斷與驅(qū)動_第5頁
已閱讀5頁,還剩19頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、12#CNASIC典型的設(shè)備(控制器+驅(qū)動器)CPU總線r總線接口數(shù)據(jù)FIFO配置寄存器L狀態(tài)寄存器控制時序電路I控制器中斷信號驅(qū)動電路集成為. 模塊控制電流/電壓硬件系統(tǒng)亠般設(shè)備驅(qū)動的結(jié)構(gòu)應(yīng)用應(yīng)用應(yīng)用程序1程序2程序n編程接口 API文件系統(tǒng)OS內(nèi)核H 十 H lai Ml F!設(shè)備文件接口 I;= = = ,設(shè)備文件接口 T:7L:硬:件:管:理緩沖區(qū)管理中斷處理硬 件 管 理緩沖區(qū)管理FE-驅(qū)動中斷處理3#設(shè)備1設(shè)備nCNASIC中斷的分類I硬件中斷(Hardware Interrupt): 般是由外部(相對 CPU 內(nèi)核而言)的硬件引起的事件,比如串口來數(shù)據(jù),鍵盤擊 鍵等;I軟件中斷(

2、Soft Interrupt ):通過在程序中執(zhí)行的中斷指 令引起的中斷,又叫軟陷;80X86 : int 指令68000 : trap 指令 ARM : SWI 指令軟中斷指令一般用于操作系統(tǒng)的系統(tǒng)調(diào)用入口;I異常(Exception ):由于CPU內(nèi)部在運(yùn)行過程中引起的 事件,比如指令預(yù)取錯,數(shù)據(jù)中止,未定義指令等等,異 常事件一般由操作系統(tǒng)接管。CNASIC中斷的處理過程雖然中斷產(chǎn)生的原因不同,但是中斷響應(yīng)的硬件過程基本上是相同的。 拷貝 CPSR 至U SPSR <mode> m設(shè)置正確的cpsr位17切換到ARM狀態(tài)切換到異常模式 禁止中斷ITI保存返回地址在LR <

3、;mode>設(shè)置PC到異常向量地址原來中斷服務(wù) 程序完成I -中斷服務(wù)程序可能保存需要使用的寄存器(堆棧中)用戶服務(wù)程序可以打開中斷,以接受中斷嵌套恢復(fù)保存的寄存器口通過調(diào)用Reti (或其他相應(yīng)指令)指令將 PSR和PC出棧 的執(zhí)行流程。CNASIC調(diào)用棧和中斷棧的不同Last argHighAutomatic or Scratch VarsAutomatic or Scratch VarsFirst argReturn AddressSaved RegsLow調(diào)用棧中斷棧HighLowCNASICC語言中的中斷處理在標(biāo)準(zhǔn)C中不包含中斷。許多編譯開發(fā)商在標(biāo)準(zhǔn)C上增加了對中斷的支持,提供

4、新的關(guān)鍵字用于標(biāo) 示中斷服務(wù)程序(ISR),類似于_interrupt >#program in terrupt當(dāng)一個函數(shù)被定義為ISR的時候,編譯器會自動 為該函數(shù)增加中斷服務(wù)程序所需要的中斷現(xiàn)場入 棧和出棧代碼。CNASIC用C編寫中斷服務(wù)程序應(yīng)該注意的I不能返回值;不能向ISR傳遞參數(shù);ISR應(yīng)該盡可能的短小精悍;I printf(char * IpFormatString, 函數(shù)會帶來重入和性能問 題,不能在ISR中采用。(在ARM平臺上由于半主機(jī)機(jī) 制,該函數(shù)的速度更慢!)I其實還包括所有的不可重入的函數(shù)都不應(yīng)該在中斷中使用。程序 員應(yīng)該仔細(xì)地評估ANSI C庫函數(shù)和OS的系統(tǒng)

5、調(diào)用 浮點運(yùn)算以及其他的耗時操作都不應(yīng)該在中斷程序中使用CNASIC加快中斷處理程序的方法在中斷處理程序中只進(jìn)行最基本的硬件操作,比如讀出硬 件寄存器的數(shù)據(jù),或者改變狀態(tài)寄存器的值I然后通過一定的方法將中斷的事件做一個標(biāo)志,在離開中 斷處理程序后,由其他代碼根據(jù)中斷標(biāo)志進(jìn)行后續(xù)的處理 這樣做的好處是大大加快了中斷的處理時間 常見的方法:在沒有OS的情況下可以使用自定義的隊列,在中斷處理程序之外 的主循環(huán)中對中斷的事件進(jìn)行處理。Linux 下的 Bottom half & Top halfASIX OS中的系統(tǒng)任務(wù)CNASIC沒有OS的中斷服務(wù)隊列/*存放中斷的隊列*/While(1)在

6、主循環(huán)中檢查中斷并處理之typedef struct taglntQueueIf( !IsIntQueueEmpty()int intType; /* 中斷類型 */struct tagIntQueue *next;intType = GetFirstlnt();IntQueue;switch(intType) /*是不是很象 WIN32程序的消息解析函數(shù)?*/IntQueue IpIntQueueHead;_interrupt ISRexample()int intType;/*對,我們的中斷類型解析很類似于消息驅(qū)動*/case xxx: /*我們稱其為"中斷驅(qū)動"吧?

7、*/break;intType = GetSystemType();case xxx:QueueAddTail(lpIntQueueHead, intType); /* 在隊列尾加入新的中斷*/break;1CNASIC有OS的情況下中斷將變得更復(fù)雜I 一般而言O(shè)S將接管中斷向量表,中斷發(fā)生 時,首先由OS接管中斷OS將檢查真正的中斷源是什么,然后才調(diào) 用真正的中斷處理程序CNASiCASIX OS下的中斷初始化./*;file n ame :;descriti on;history:boot.sboot the arm processor2003-1-7 15:59 lc create;*/

8、include hardware_gfd.hexter nmai nAREA BOOT, CODE, READONLYENTRY;Mark first in structi on to execute;vector tablebalRST_DObalEXTENT_INSTRUbalSWI_DObalABORT_PREFETCH_DObalABORT_DATA_DOmovR1,R1;reserved excepti onbalIrq_Domovr0, r0balFiq_Do;the code for the fiqstmfdsp!, r0,r1ldrr0, =IRQ_R1strr1, r0ldm

9、fdsp!, r0ldrr1, =IRQ_R0strr0, r1addr13, r13, #4 ;/restore the sp_irq top to original irq topsubr14, r14, #4movr0, r14mrsr1, spsrorrr1, r1, #0x80msrcpsr_cxsf , r1;/change irq mode into svcbicr1, r1, #0x80;/clear the irq maskstmfdsp!, r0stmfdsp!, r14stmfdsp!, r1ldrr0, =IRQ_R1ldrr1, r0stmfdsp!, r1ldrr1

10、, =IRQ_R0ldrr0, r1stmfdsp!, r0ldmfdsp!, r0,r1stmfdsp!, r0 -r12;/save the registers r0 -r12IMPORTint vector handlerblint vector handler1314void (*I ntHa ndler32)(void)=/*interrupt number and description, .NULL, EXT0, EXT1, EXT2, EXT3, EXT4, EXT5, EXT6, EXT7, EXT8, EXT9, EXT1( EXT1-/* 00/* 01/* 02/* 0

11、3/* 04/* 05/* 06/* 07/* 08/* 09/* 10/* 11/* 12/* 13/* 14/* 15/* 16/* 17/* 18/* 19/* 20/* 21/* 22/* 23/* 24/* 25/* 26/* 27/* 28/* 29/* 30/* 31INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT INT*/ (PE0) (PE1) (PE2) (PE3) (PE4)

12、 (PE5) (PE6) (PE7)*/*/*/*/*/*/*/*/han dler */ ENT_INT_EMPTY ENT_INT_RING1 NULL,NULL,ENT_INT_RING2 NULL,NULL,ENT_INT_RING3 NULL,(PEd8 _vector_h_ _butTon ,QPE1d) */NULL,(PE$1gned long IFSTATe=*(RP)(IN1TC_IFSTAT);*/ t_vector_h*/EXT1;| (PHFSTAT <1)IFSTAT=L(RP)(INTC_ISTAT) & (*(RP)(INTC_IMSK) &

13、; *(RP)(INTC_IEXT13EXT1I (P H2).f/NONE*/.;EXT1fI (PH3)"extkI -EXT17lcdcAC97,PWM,UARTUARTMMC,SPI,USB,GPT,EMI,DMA,RTC,,(PHFSTat >1)稠 il*/(IFSTAT ) (ph4)fstat>>=1;7, (PH5i+;*/elSe i=0;*/if(ln*Ha ndleri else *ent_int ();pfin tf("Noret_i nt (); */*/*/ENT_INT_SSRT NULL,NULL,NULL,NULL,NU

14、LL,NULL,NULL,NULL,ndleri ')();)(*NULL,NULL,interriJEN TrINT_USBNT ,ENT_INT_GPT ,ENT_INT_EMI ,ENT_INT_DMA ,ENT_INT_RTC ;NO.%d n",i );EN);#CNASiC通知內(nèi)核!為了通知內(nèi)核中斷的發(fā)生,往往需要在用 戶的中斷服務(wù)程序中顯示地調(diào)用 OS提供的 系統(tǒng)調(diào)用I Ent_int()通知內(nèi)核我們現(xiàn)在中斷中Ret_int()通知內(nèi)河我們離開中斷了,如果系統(tǒng) 允許則進(jìn)行調(diào)度,否則按照中斷的方式離開一 返回Samplesaving current enviunm

15、entinto, stackmnicjtAr intern mt n<itinn S *W I V «. V I! ! B B V I S F 嚴(yán) « S ! V «.S S !ISRretjnt() Mrestore environmentjno nMgftarhinn nax十 taitk tn ri jnv v y、i e f J b i *w r < « b'W" j | | 材 | |Get this task'sLet it run!創(chuàng)刃PRE聞仃曲SI3GKCNASICASIX OS中用戶ISR的一般格

16、式void ENT_INT_RTC( void )int_vector_handler ()函數(shù)調(diào)用ent_int();告訴內(nèi)核,中斷發(fā)生了rtc_isr();/用戶真正的中斷服務(wù)程序ret_int();我們要返回了,或者我們要切換任務(wù)了CNASIC函數(shù)的可重入問題CNASIC什么是函數(shù)的重入由中斷調(diào)用引起的函數(shù)重入由另一個任務(wù)調(diào)用引起的函數(shù)重入還有其他原因嗎?是的!函數(shù)遞歸也會引起函數(shù)的重入!19函數(shù)的可重入問題什么是函數(shù)的重入12中斷服務(wù)程序Task函數(shù)的重入調(diào)用函數(shù)A中斷發(fā)生Taskl中斷服務(wù)程序函數(shù)的重入中斷發(fā)生Task2調(diào)用函數(shù)A#函數(shù)A中斷返回 并進(jìn)行任務(wù)調(diào)度中斷返回函數(shù)A13#由

17、中斷調(diào)用引起的函數(shù)重入由另一個任務(wù)調(diào)用引起的函數(shù)重入#還有其他原因嗎?是的!函數(shù)遞歸也會引起函數(shù)的重入!14CNASJC重入函數(shù)的偽問題(pseudo Problem ) 雖然有些函數(shù)不能安全重入,但是也許這個函數(shù)根本就 沒有重入的可能性,那么對于這個函數(shù)的重入保護(hù)就是 多余的,這就是所謂重入的偽問題.這個函數(shù)是一個非遞歸函數(shù),并且,這個函數(shù)不會被中斷服務(wù)程序調(diào)用,并且,這個函數(shù)只會在一個任務(wù)中被調(diào)用,其他任務(wù)中不會調(diào)用這個 函數(shù)。Disable_IRQ(); /* 關(guān)中斷 */DoSomthing ;Sleep(1000);/* 掛起任務(wù) 1000 毫秒 */DoSomthing else;Sleep(1000);/* 掛起任務(wù) 1000 毫秒

溫馨提示

  • 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

提交評論