語言進階第六講中斷與驅(qū)動_第1頁
語言進階第六講中斷與驅(qū)動_第2頁
語言進階第六講中斷與驅(qū)動_第3頁
語言進階第六講中斷與驅(qū)動_第4頁
語言進階第六講中斷與驅(qū)動_第5頁
免費預覽已結束,剩余48頁可下載查看

下載本文檔

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

文檔簡介

第六講

中斷與設備驅(qū)動張哲ASIC工程中心

中斷的重要性?。±斫馓幚砥鲗χ袛嗟墓芾硪约斑@其中的堆棧管理對于理解操作系統(tǒng)是至關重要的!中斷是操作系統(tǒng)的入口,用戶訪問操作系統(tǒng)提供的服務的唯一途徑是依靠中斷來實現(xiàn)的。實時系統(tǒng)對異步事件的處理,依靠的是中斷!任務的調(diào)度靠的是中斷系統(tǒng)調(diào)用的實現(xiàn)靠的是中斷在有MMU的系統(tǒng)中,虛存的管理也是依靠中斷!中斷是理解操作系統(tǒng)的入口??!如何強調(diào)中斷的重要性都不過份,我們將在內(nèi)核的實現(xiàn)中詳細介紹!中斷概念中斷的分類硬件中斷(HardwareInterrupt):一般是由外部(相對CPU內(nèi)核而言)的硬件引起的事件,比如串口來數(shù)據(jù),鍵盤擊鍵等;軟件中斷(SoftInterrupt):通過在程序中執(zhí)行的中斷指令引起的中斷,又叫軟陷;80X86:int指令68000:trap指令ARM:SWI指令軟中斷指令一般用于操作系統(tǒng)的系統(tǒng)調(diào)用入口;異常(Exception):由于CPU內(nèi)部在運行過程中引起的事件,比如指令預取錯,數(shù)據(jù)中止,未定義指令等等,異常事件一般由操作系統(tǒng)接管。中斷的處理過程雖然中斷產(chǎn)生的原因不同,但是中斷響應的硬件過程基本上是相同的。拷貝CPSR到SPSR_<mode>設置正確的CPSR位切換到ARM狀態(tài)切換到異常模式禁止中斷保存返回地址在LR_<mode>設置PC到異常向量地址中斷服務程序可能保存需要使用的寄存器(堆棧中)用戶服務程序可以打開中斷,以接受中斷嵌套恢復保存的寄存器通過調(diào)用Reti(或其他相應指令)指令將PSR和PC出棧,從而恢復原來的執(zhí)行流程。硬件完成中斷服務程序完成ARM處理器的中斷類型異常類型具體含義復位Reset當處理器的復位電平有效時,產(chǎn)生復位異常,程序跳轉(zhuǎn)到復位異常處理程序處執(zhí)行。未定義指令UndefinedInstruction當ARM處理器或協(xié)處理器遇到不能處理的指令時,產(chǎn)生未定義指令異常??墒褂迷摦惓C制進行軟件仿真。軟件中斷SoftwareInterrupt該異常由執(zhí)行SWI指令產(chǎn)生,可用于用戶模式下的程序調(diào)用特權操作指令??墒褂迷摦惓C制實現(xiàn)系統(tǒng)功能調(diào)用。指令預取中止PrefetchAbort若處理器預取指令的地址不存在,或該地址不允許當前指令訪問,存儲器會向處理器發(fā)出中止信號,但當預取的指令被執(zhí)行時,才會產(chǎn)生指令預取中止異常。ARM處理器的中斷類型異常類型具體含義數(shù)據(jù)中止DataAbort若處理器數(shù)據(jù)訪問指令的地址不存在,或該地址不允許當前指令訪問時,產(chǎn)生數(shù)據(jù)中止異常。IRQ(外部中斷請求)當處理器的外部中斷請求引腳有效,且CPSR中的I位為0時,產(chǎn)生IRQ異常。系統(tǒng)的外設可通過該異常請求中斷服務。FIQ(快速中斷請求)當處理器的快速中斷請求引腳有效,且CPSR中的F位為0時,產(chǎn)生FIQ異常。異常向量表異常向量表中指定了各異常及其處理程序的對應關系,它通常存放在存儲器地址的低端。在ARM體系中,異常向量表的大小為32字節(jié)。其中,每個異常占據(jù)4個字節(jié)大小,保留了4個字節(jié)空間。每個異常對應了異常向量表中的4個字節(jié)的空間,其中存放了一個跳轉(zhuǎn)指令或者一個向PC寄存器中賦值的數(shù)據(jù)訪問指令。通過這兩種指令,程序?qū)⑻D(zhuǎn)到相應的異常處理程序處執(zhí)行。

當多個異常同時發(fā)生時,系統(tǒng)根據(jù)固定的優(yōu)先級決定異常的處理次序。當然有些異常是不可能同時發(fā)生的,如指令預取中止異常和軟件中斷(SWI)異常是由同一條指令的執(zhí)行觸發(fā)的,他們是不可能同時發(fā)生的。處理器執(zhí)行某個特定的異常的過程,稱為處理器處于特定的異常模式異常向量表地址異常進入模式優(yōu)先級(6最低)0x0000,0000復位管理模式10x0000,0004未定義指令未定義模式60x0000,0008軟件中斷管理模式60x0000,000C中止(預取指令)中止模式50x0000,0010中止(數(shù)據(jù))中止模式20x0000,0014保留保留未使用0x0000,0018IRQIRQ40x0000,001CFIQFIQ3向量表地址異常處理返回通用寄存器的恢復通用寄存器的恢復采用一般的堆棧操作指令狀態(tài)寄存器的恢復PC指針的恢復MOVSpc,lrSUBSpc,lr,#4LDMFDsp!,{pc}^從異常處理程序中返回包括下面兩個基本操作恢復被中斷的程序處理器的狀態(tài),即將SPSR_mode寄存器內(nèi)容復制到當前程序狀態(tài)寄存器CPSR中。返回到發(fā)生異常的下一條指令處執(zhí)行,即將lr_mode寄存器的內(nèi)容復制到程序計數(shù)器PC中。異常返回時另一個非常重要的問題返回地址的確定在異常發(fā)生時處理器會有一個保存LR的動作,但是該保存值并不一定是正確中斷的返回地址下面以一個簡單的指令執(zhí)行流水狀態(tài)圖來對此加以說明指令執(zhí)行流水狀態(tài)圖ARM處理器的中斷嵌套C語言中的中斷處理在標準C中不包含中斷。許多編譯開發(fā)商在標準C上增加了對中斷的支持,提供新的關鍵字用于標示中斷服務程序(ISR),類似于__interrupt、#programinterrupt當一個函數(shù)被定義為ISR的時候,編譯器會自動為該函數(shù)增加中斷服務程序所需要的中斷現(xiàn)場入棧和出棧代碼。

_irq關鍵字保存ATPCS(ARM-THUMBprocedurecallstandard)規(guī)定的被破壞的寄存器保存其他中斷處理程序中用到的寄存器同時將(LR-4)賦予程序計數(shù)器PC實現(xiàn)中斷處理程序的返回,并且恢復CPSR寄存器的內(nèi)容例子_irqvoidIRQHandler(void){volatileunsignedint*source=(unsignedint*)0x80000000;if(*source==1)int_handler_1();

*(source)=0;}STMFD SP!,{r0-r4,r12,lr}MOVr4,#0x80000000LDR r0,[r4,#0]CMP r0,#1BLEQ int_handler_1MOV r0,#0STR r0,[r4,#0] LDMFD sp!,{r0-r4,r12,lr}SUBS pc,lr,#4中斷處理的基本原則快速快速響應,也就是說CPU要盡快地響應中斷請求加快中斷處理的速度保護對于全局數(shù)據(jù)結構和其他臨界資源需要進行必要的互斥保護用C編寫中斷服務程序應該注意的不能返回值;不能向ISR傳遞參數(shù);ISR應該盡可能的短小精悍;printf(char*lpFormatString,…)函數(shù)會帶來重入和性能問題,不能在ISR中采用。(在ARM平臺上由于半主機機制,該函數(shù)的速度更慢?。┢鋵嵾€包括所有的不可重入的函數(shù)都不應該在中斷中使用。程序員應該仔細地評估ANSIC庫函數(shù)和OS的系統(tǒng)調(diào)用浮點運算以及其他的耗時操作都不應該在中斷程序中使用

加快中斷處理程序的方法在中斷處理程序中只進行最基本的硬件操作,比如讀出硬件寄存器的數(shù)據(jù),或者改變狀態(tài)寄存器的值然后通過一定的方法將中斷的事件做一個標志,在離開中斷處理程序后,由其他代碼根據(jù)中斷標志進行后續(xù)的處理這樣做的好處是大大加快了中斷的處理時間常見的方法:在沒有OS的情況下可以使用自定義的隊列,在中斷處理程序之外的主循環(huán)中對中斷的事件進行處理。

Linux下的Bottomhalf&TophalfASIXOS中的系統(tǒng)任務沒有OS的中斷服務隊列如何確保中斷處理程序盡快完成確保沒有在中斷處理程序中調(diào)用不可重入函數(shù)以及其他臨界資源。沒有OS的中斷服務隊列/*存放中斷的隊列*/

typedefstructtagIntQueue

{

intintType;/*中斷類型*/

structtagIntQueue*next;

}IntQueue;

IntQueuelpIntQueueHead;

__interruptISRexample()

{

intintType;

intType=GetSystemType();

QueueAddTail(lpIntQueueHead,intType);/*在隊列尾加入新的中斷*/

}While(1)//在主循環(huán)中檢查中斷并處理之

{

If(!IsIntQueueEmpty())

{

intType=GetFirstInt();

switch(intType)/*是不是很象WIN32程序的消息解析函數(shù)?*/

{

/*對,我們的中斷類型解析很類似于消息驅(qū)動*/

casexxx:/*我們稱其為"中斷驅(qū)動"吧?*/

break;

casexxx:

break;

}

}

}有OS的情況下中斷將變得更復雜一般而言OS將接管中斷向量表,中斷發(fā)生時,首先由OS接管中斷OS將檢查真正的中斷源是什么,然后才調(diào)用真正的中斷處理程序ASIXOS下的中斷初始化;/*****************************************************; filename: boot.s; descrition: bootthearmprocessor; history: 2003-1-715:59lccreate;*****************************************************/ includehardware_gfd.h

extern main AREABOOT,CODE,READONLY ENTRY ;Markfirstinstructiontoexecute;vectortable bal RST_DO bal EXTENT_INSTRU bal SWI_DO bal ABORT_PREFETCH_DO bal ABORT_DATA_DO mov R1, R1 ;reservedexception

bal Irq_Do mov r0,r0 bal Fiq_Do ;thecodeforthefiqASIXOS下的中斷初始化;*********************************Irq_Do

stmfd sp!,{r0,r1}ldr r0,=IRQ_R1str r1,[r0]ldmfd sp!,{r0}ldr r1,=IRQ_R0str r0,[r1]add r13,r13,#4 ; //restorethesp_irqtoptooriginalirqtopsub r14,r14,#4mov r0,r14mrs r1,spsrorr r1,r1,#0x80msr cpsr_cxsf,r1; //changeirqmodeintosvc;------------------------------------------------ bic r1,r1,#0x80; //cleartheirqmaskstmfd sp!,{r0}stmfd sp!,{r14}stmfd sp!,{r1}ldr r0,=IRQ_R1ldr r1,[r0]stmfd sp!,{r1}ldr r1,=IRQ_R0ldr r0,[r1]stmfd sp!,{r0}ldmfd sp!,{r0,r1}stmfd sp!,{r0-r12}; //savetheregistersr0--r12IMPORT int_vector_handlerbl int_vector_handlerASIXOS下的中斷初始化void(*IntHandler[32])(void)={/*interruptnumberanddescription,handler*//*00INT_NULL,*/ENT_INT_EMPTY,/*01INT_EXT0,(PE0)*/ENT_INT_RING1,/*02INT_EXT1,(PE1)*/ NULL,/*03INT_EXT2,(PE2)*/ NULL,/*04INT_EXT3,(PE3)*/ENT_INT_RING2,/*05INT_EXT4,(PE4)*/ NULL,/*06INT_EXT5,(PE5)*/ NULL,/*07INT_EXT6,(PE6)*/ENT_INT_RING3,/*08INT_EXT7,(PE7)*/ NULL,/*09INT_EXT8,(PE8)*/ NULL,/*10INT_EXT9,(PE9*/ENT_INT_BUTTON,/*11INT_EXT10,(PE10)*/ NULL,/*12INT_EXT11,(PE11)*/ NULL,/*13INT_EXT12,(PH0)*/ NULL,/*14INT_EXT13,(PH1)*/ENT_INT_SSRT,/*15INT_EXT14,(PH2)*/ NULL,/*16INT_NONE,*/ NULL,/*17INT_EXT15,(PH3)*/ NULL,/*18INT_EXT16,(PH4)*/ NULL,/*19INT_EXT17,(PH5)*/ NULL,/*20INT_LCDC,*/ NULL,/*21INT_AC97,*/ NULL,/*22INT_PWM,*/ NULL,/*23INT_UART1,*/ NULL,/*24INT_UART0,*/ NULL,/*25INT_MMC,*/ NULL,/*26INT_SPI,*/ NULL,/*27INT_USB,*/ ENT_INT_USB,/*28INT_GPT,*/ ENT_INT_GPT,/*29INT_EMI,*/ ENT_INT_EMI,/*30INT_DMA,*/ ENT_INT_DMA,/*31INT_RTC,*/ ENT_INT_RTC};ASIXOS下的中斷初始化voidint_vector_handler(void){inti;unsignedlongIFSTAT=*(RP)(INTC_IFSTAT);if(IFSTAT<1)IFSTAT=*(RP)(INTC_ISTAT)&(~*(RP)(INTC_IMSK))&*(RP)(INTC_IEN);if(IFSTAT>1){i=-1;while(IFSTAT){IFSTAT>>=1;i++;}}elsei=0;

if(IntHandler[i])(*IntHandler[i])();else{ent_int();printf("NointerruptentryforINTNO.%d\n",i);ret_int();}}通知內(nèi)核!為了通知內(nèi)核中斷的發(fā)生,往往需要在用戶的中斷服務程序中顯示地調(diào)用OS提供的系統(tǒng)調(diào)用Ent_int()通知內(nèi)核我們現(xiàn)在中斷中Ret_int()通知內(nèi)河我們離開中斷了,如果系統(tǒng)允許則進行調(diào)度,否則按照中斷的方式離開-返回SampleEnt_int()與Ret_int()函數(shù)代碼分析Ent_int()intent_int(void){ g_ubIntNestCnt++; g_ubSysStat|=TSS_INDP;//TSS_INDP=4}Ret_int()voidret_int(void){ENTER_CRITICAL_SECTION;

/*thisfunctionwillneverbacktoitscaller*/POP_NULL;/*******************************************saveinterruptedtask'senvironment.**thisoperationreducessomeefficiency,because**theseregistersmaybepopedagainatonce.*******************************************/M_REG;

/*ifinterruptnestexists,exitret_intand*continuetohandlenestedinterrupt.*/if(--g_ubIntNestCnt){/*popthemonlyafteralittletime.*efficiencyisreduced*/M_REG;RETI;}/*changesystemstatusandcheckit*/g_ubSysStat&=~TSS_INDP;if(g_ubSysStat&(TSS_LOC|TSS_DDSP))gotonot_dispatch;/*checkdelayeddispatch*/if(!(g_blDelay&0x01))gotonot_dispatch;/*cleardelayeddispatchflag*/g_blDelay&=0x0;/*savecurrenttask'sstackpoint:g_pCurTsk->uwSP=sp*/SAVE_CURTSK_SP;/*showcurrenttaskwasinterruped*/g_pCurTsk->ubIntinfo|=0x01;/*changecurrenttask'sstatetojoinindisptaching*/g_pCurTsk->ubStatus|=TTS_RDY;

schedule();

not_dispatch:M_REG;//INT_RETI;//whileuse"RETI;"inc33RETI;}ASIXOS中用戶ISR的一般格式voidENT_INT_RTC(void) //int_vector_handler()函數(shù)調(diào)用{

ent_int();//告訴內(nèi)核,中斷發(fā)生了

rtc_isr();//用戶真正的中斷服務程序

ret_int();//我們要返回了,或者我們要切換任務了}設備驅(qū)動設備驅(qū)動設備驅(qū)動是介于底層硬件與操作系統(tǒng)之間的一層軟件設備驅(qū)動對上(也就是操作系統(tǒng))提供一個統(tǒng)一的服務接口,使得操作系統(tǒng)以及應用程序可以通過這個接口訪問底層的硬件設備設備驅(qū)動對下要管理具體的硬件設備,包括設備的初始化、與設備相關的中斷處理、設備數(shù)據(jù)的讀寫操作以及與此相關的緩沖區(qū)管理總之,設備驅(qū)動程序的主要功能就是屏蔽硬件控制的具體細節(jié),對操作系統(tǒng)提供一個抽象的、統(tǒng)一的硬件資源訪問接口BootloaderBootLoader是一段固化在嵌入式系統(tǒng)目標系統(tǒng)ROM中的一段程序,它的主要作用就是引導操作系統(tǒng)如果是在調(diào)試階段,操作系統(tǒng)映象(Image)還沒有燒錄在目標系統(tǒng)的ROM中,這時就需要BootLoader在系統(tǒng)上電后初始化某個特定的通信端口,比如串口、網(wǎng)口、并口或者是USB接口等等,通過這個通信端口從調(diào)試主機下載編譯好的操作系統(tǒng)映象,并將控制權交給操作系統(tǒng)目前開源BootLoader中比較有代表性的是UBOOT,全稱UniversalBootLoader,是由德國DENX小組的開發(fā),并遵循GPL條款的開放源碼項目BootStrapBootStrap其實也是一段固化在處理器內(nèi)部ROM之中的一段代碼。用戶可以通過片外的管腳配置是否啟動BootStrap,如果用戶選擇啟動BootStrap,那么在系統(tǒng)上電復位時,固化在片上ROM中的代碼將獲得控制權,這段代碼將初始化片內(nèi)的一些硬件設備,比如外部存儲器接口控制器,通信接口等等在完成這些初始化后,BootStrap將通過這個通信接口等待調(diào)試主機發(fā)送來的命令,這些命令包括從調(diào)試主機下載一段映象到外部存儲器的某個特定地址,或者是將外部存儲器的內(nèi)容通過通信接口上傳到調(diào)試主機,從外部存儲器的某個地址開始運行等等BootStrapBSP(BoardSupportPackage)BSP也是一段固化在嵌入式系統(tǒng)目標系統(tǒng)ROM中的一段程序,BSP在系統(tǒng)上電的時候?qū)⒔庸芟到y(tǒng),完成必要板級硬件系統(tǒng)的自檢與初始化工作,并負責完成操作系統(tǒng)的引導如果在調(diào)試階段,BSP還將與調(diào)試主機上運行的調(diào)試器進行通信,完成調(diào)試功能。BSP與BootLoader不同的地方是除了上述的功能外,一般BSP還會提供一些板級硬件設備的基本輸入輸出操作的例程設備驅(qū)動程序可以通過調(diào)用這些最底層的操作函數(shù)來完成對硬件系統(tǒng)的控制設備驅(qū)動、BootLoader、BSP三者之間的關系BootLoader和BSP系統(tǒng)上電后的硬件自檢硬件系統(tǒng)的初始化引導操作系統(tǒng)支持與調(diào)試器的通信,并提供底層調(diào)試支持提供板級硬件系統(tǒng)的基本IO操作服務,為驅(qū)動程序提供底層支持設備的組成所謂外圍硬件設備是指在一個計算機系統(tǒng)中除了主處理器(CPU)和主存儲器外的其他硬件,比如鍵盤、顯示器、磁盤系統(tǒng)等等。一般而言,一個設備可以分為三個部分:控制器、驅(qū)動器以及具體的硬件??刂破髫撠熃邮誄PU的命令以及將硬件設備的狀態(tài)或是數(shù)據(jù)傳給CPU,另外控制器還將根據(jù)CPU的配置命令產(chǎn)生正確的控制時序驅(qū)動器根據(jù)控制器所產(chǎn)生的控制時序生成驅(qū)動硬件系統(tǒng)工作的電壓和電流硬件系統(tǒng)將在驅(qū)動器生成的驅(qū)動電壓或電流的控制器下完成相應的工作典型硬件設備的組成框圖設備驅(qū)動程序的結構設備驅(qū)動程序?qū)ι咸峁┮粋€統(tǒng)一的服務接口。這樣非常便于操作系統(tǒng)統(tǒng)一管理所有的外圍硬件設備?,F(xiàn)代操作系統(tǒng)往往采用文件的形式對設備進行封裝雖然現(xiàn)在的計算機系統(tǒng)的外圍設備千差萬別,但是很多操作系統(tǒng)依然延續(xù)了這個抽象方法,比如Linux將設備分為字符設備,塊設備和網(wǎng)絡設備三大類,對于一些特殊的設備采用特殊的方法進行管理,比如Linux上將屏幕抽象為Framebuffer進行管理等等。嵌入式系統(tǒng)的外圍設備隨著應用的不同而不同,對設備的管理也有多種方法,但總的來說,設備驅(qū)動可以分為四個部分:設備文件接口、硬件管理、緩沖區(qū)管理和中斷處理程序。設備驅(qū)動可以分為四個部分設備文件接口設備文件接口是設備驅(qū)動與操作系統(tǒng)的接口備也可

溫馨提示

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

評論

0/150

提交評論