![C語言進階-第六講中斷與驅動_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/4e5b982d-c811-4d4d-8240-a39e88420918/4e5b982d-c811-4d4d-8240-a39e884209181.gif)
![C語言進階-第六講中斷與驅動_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/4e5b982d-c811-4d4d-8240-a39e88420918/4e5b982d-c811-4d4d-8240-a39e884209182.gif)
![C語言進階-第六講中斷與驅動_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/4e5b982d-c811-4d4d-8240-a39e88420918/4e5b982d-c811-4d4d-8240-a39e884209183.gif)
![C語言進階-第六講中斷與驅動_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/4e5b982d-c811-4d4d-8240-a39e88420918/4e5b982d-c811-4d4d-8240-a39e884209184.gif)
![C語言進階-第六講中斷與驅動_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/26/4e5b982d-c811-4d4d-8240-a39e88420918/4e5b982d-c811-4d4d-8240-a39e884209185.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、12#CNASIC典型的設備(控制器+驅動器)CPU總線r總線接口數(shù)據(jù)FIFO配置寄存器L狀態(tài)寄存器控制時序電路I控制器中斷信號驅動電路集成為. 模塊控制電流/電壓硬件系統(tǒng)亠般設備驅動的結構應用應用應用程序1程序2程序n編程接口 API文件系統(tǒng)OS內核H 十 H lai Ml F!設備文件接口 I;= = = ,設備文件接口 T:7L:硬:件:管:理緩沖區(qū)管理中斷處理硬 件 管 理緩沖區(qū)管理FE-驅動中斷處理3#設備1設備nCNASIC中斷的分類I硬件中斷(Hardware Interrupt): 般是由外部(相對 CPU 內核而言)的硬件引起的事件,比如串口來數(shù)據(jù),鍵盤擊 鍵等;I軟件中斷(
2、Soft Interrupt ):通過在程序中執(zhí)行的中斷指 令引起的中斷,又叫軟陷;80X86 : int 指令68000 : trap 指令 ARM : SWI 指令軟中斷指令一般用于操作系統(tǒng)的系統(tǒng)調用入口;I異常(Exception ):由于CPU內部在運行過程中引起的 事件,比如指令預取錯,數(shù)據(jù)中止,未定義指令等等,異 常事件一般由操作系統(tǒng)接管。CNASIC中斷的處理過程雖然中斷產(chǎn)生的原因不同,但是中斷響應的硬件過程基本上是相同的。 拷貝 CPSR 至U SPSR <mode> m設置正確的cpsr位17切換到ARM狀態(tài)切換到異常模式 禁止中斷ITI保存返回地址在LR <
3、;mode>設置PC到異常向量地址原來中斷服務 程序完成I -中斷服務程序可能保存需要使用的寄存器(堆棧中)用戶服務程序可以打開中斷,以接受中斷嵌套恢復保存的寄存器口通過調用Reti (或其他相應指令)指令將 PSR和PC出棧 的執(zhí)行流程。CNASIC調用棧和中斷棧的不同Last argHighAutomatic or Scratch VarsAutomatic or Scratch VarsFirst argReturn AddressSaved RegsLow調用棧中斷棧HighLowCNASICC語言中的中斷處理在標準C中不包含中斷。許多編譯開發(fā)商在標準C上增加了對中斷的支持,提供
4、新的關鍵字用于標 示中斷服務程序(ISR),類似于_interrupt >#program in terrupt當一個函數(shù)被定義為ISR的時候,編譯器會自動 為該函數(shù)增加中斷服務程序所需要的中斷現(xiàn)場入 棧和出棧代碼。CNASIC用C編寫中斷服務程序應該注意的I不能返回值;不能向ISR傳遞參數(shù);ISR應該盡可能的短小精悍;I printf(char * IpFormatString, 函數(shù)會帶來重入和性能問 題,不能在ISR中采用。(在ARM平臺上由于半主機機 制,該函數(shù)的速度更慢?。㊣其實還包括所有的不可重入的函數(shù)都不應該在中斷中使用。程序 員應該仔細地評估ANSI C庫函數(shù)和OS的系統(tǒng)
5、調用 浮點運算以及其他的耗時操作都不應該在中斷程序中使用CNASIC加快中斷處理程序的方法在中斷處理程序中只進行最基本的硬件操作,比如讀出硬 件寄存器的數(shù)據(jù),或者改變狀態(tài)寄存器的值I然后通過一定的方法將中斷的事件做一個標志,在離開中 斷處理程序后,由其他代碼根據(jù)中斷標志進行后續(xù)的處理 這樣做的好處是大大加快了中斷的處理時間 常見的方法:在沒有OS的情況下可以使用自定義的隊列,在中斷處理程序之外 的主循環(huán)中對中斷的事件進行處理。Linux 下的 Bottom half & Top halfASIX OS中的系統(tǒng)任務CNASIC沒有OS的中斷服務隊列/*存放中斷的隊列*/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;/*對,我們的中斷類型解析很類似于消息驅動*/case xxx: /*我們稱其為"中斷驅動"吧?
7、*/break;intType = GetSystemType();case xxx:QueueAddTail(lpIntQueueHead, intType); /* 在隊列尾加入新的中斷*/break;1CNASIC有OS的情況下中斷將變得更復雜I 一般而言OS將接管中斷向量表,中斷發(fā)生 時,首先由OS接管中斷OS將檢查真正的中斷源是什么,然后才調 用真正的中斷處理程序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通知內核!為了通知內核中斷的發(fā)生,往往需要在用 戶的中斷服務程序中顯示地調用 OS提供的 系統(tǒng)調用I Ent_int()通知內核我們現(xiàn)在中斷中Ret_int()通知內河我們離開中斷了,如果系統(tǒng) 允許則進行調度,否則按照中斷的方式離開一 返回Samplesaving current enviunm
15、entinto, stackmnicjtAr intern mt n<itinn S *W I V «. V I! ! B B V I S F 嚴 « 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ù)調用ent_int();告訴內核,中斷發(fā)生了rtc_isr();/用戶真正的中斷服務程序ret_int();我們要返回了,或者我們要切換任務了CNASIC函數(shù)的可重入問題CNASIC什么是函數(shù)的重入由中斷調用引起的函數(shù)重入由另一個任務調用引起的函數(shù)重入還有其他原因嗎?是的!函數(shù)遞歸也會引起函數(shù)的重入!19函數(shù)的可重入問題什么是函數(shù)的重入12中斷服務程序Task函數(shù)的重入調用函數(shù)A中斷發(fā)生Taskl中斷服務程序函數(shù)的重入中斷發(fā)生Task2調用函數(shù)A#函數(shù)A中斷返回 并進行任務調度中斷返回函數(shù)A13#由
17、中斷調用引起的函數(shù)重入由另一個任務調用引起的函數(shù)重入#還有其他原因嗎?是的!函數(shù)遞歸也會引起函數(shù)的重入!14CNASJC重入函數(shù)的偽問題(pseudo Problem ) 雖然有些函數(shù)不能安全重入,但是也許這個函數(shù)根本就 沒有重入的可能性,那么對于這個函數(shù)的重入保護就是 多余的,這就是所謂重入的偽問題.這個函數(shù)是一個非遞歸函數(shù),并且,這個函數(shù)不會被中斷服務程序調用,并且,這個函數(shù)只會在一個任務中被調用,其他任務中不會調用這個 函數(shù)。Disable_IRQ(); /* 關中斷 */DoSomthing ;Sleep(1000);/* 掛起任務 1000 毫秒 */DoSomthing else;Sleep(1000);/* 掛起任務 1000 毫秒
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 以租代售物業(yè)租賃合同范本
- 中介資金管理合同范例
- 辦護照工作合同范本
- 買房以租代售合同范例
- 傷殘鑒定合同范例
- 公布勞動合同范本
- 2025年度新能源項目兼職研發(fā)人員保密協(xié)議書
- 2025年中國FIBC(集裝袋)行業(yè)競爭格局分析及投資規(guī)劃研究報告
- 2025年度裝飾裝修設計軟件授權轉讓協(xié)議
- 2025年二級水泥預制構件行業(yè)深度研究分析報告
- 2024年贛州民晟城市運營服務有限公司招聘筆試參考題庫附帶答案詳解
- 領導干部報告?zhèn)€人事項
- 9這點挫折算什么(課件)-五年級上冊生命與健康
- 價格監(jiān)督檢查知識培訓課件
- 駐場保潔方案
- 中國心理衛(wèi)生協(xié)會家庭教育指導師參考試題庫及答案
- 智能廣告投放技術方案
- 知識產(chǎn)權保護執(zhí)法
- 高質量社區(qū)建設的路徑與探索
- 數(shù)字化時代的酒店員工培訓:技能升級
- 足球守門員撲救技巧:撲救結合守護球門安全
評論
0/150
提交評論