freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

vxworks驅動開發(fā)筆記-資料下載頁

2025-06-29 09:24本頁面
  

【正文】 的安裝,這部分功能主要在函數(shù)庫sysSerial中完成。i8250Chan[N_UART_CHANNELS]變量,每個變量對應一個串口通道,此外它還定義了每個8250控制器的地址等參數(shù),這些參數(shù)保存在結構I8250_CHAN_PARAS變量devParas。這個文件定義了三個函數(shù)。1.sysSerialHwInit(void)這個函數(shù)主要完成兩件事情,一是給每個I8250_CHAN結構變量i8250Chan[i]賦值,主要確定了各個寄存器地址、對應的中斷向量、以及寄存器讀寫函數(shù)i8250Chan[i].outByte及i8250Chan[i].inByte;另一方面該函數(shù)調(diào)用函數(shù)i8250HrdInit給每個8250控制器進行初始化。2.sysSerialHwInit2(void)這個函數(shù)的功能比較簡單,一是調(diào)用函數(shù)intConnect安裝每個8250控制器的中斷處理程序,二是調(diào)用函數(shù)sysIntEnablePIC設置中斷允許。3.SIO_CHAN*sysSerialChanGet(intchannel)根據(jù)返回i8250Chan[channel],也就是說根據(jù)通道號返回其結構變量。注意這里使用了類似于面向對象中的多態(tài)的概念,i8250Chan[channel]的結構原本為i8250_CHAIN,這里強制將其轉變?yōu)榻Y構SIO_CHAIN。函數(shù)庫usrSerialvxWroks的代碼通常遵循一個規(guī)范,就是函數(shù)庫名以usr開頭的函數(shù)庫為用戶庫已進行配置的函數(shù)庫,串口驅動也不例外。vxWorks提供了一個對串口驅動進行配置的接口,即函數(shù)庫usrSerial。這個函數(shù)庫只有兩個函數(shù),1.staticchar*itos(intval)經(jīng)整數(shù)轉換為字符串輸出。如整數(shù)1234,函數(shù)將其轉換為字符串“1234”。2.STATUSusrSerialInit(void)串口初始化。主要包含兩個功能,一是調(diào)用函數(shù)ttyDevCreate初始化系統(tǒng)中的每個串口;并將其定義為終端控制接口。到目前為止,整個串口驅動的結構都已經(jīng)分析完畢了。當然這僅僅是一個靜態(tài)的分析,通過對串口驅動結構的靜態(tài)分析,可以了解vxWorks操作系統(tǒng)中串口驅動的結構組成。下面將從vxWorks操作系統(tǒng)中串口驅動程序的啟動和應用過程對串口驅動程序進行動態(tài)的說明。串口驅動程序的動態(tài)分析串口驅動程序的動態(tài)分析主要分為兩部分,第一部分是串口驅動程序的初始化,第二部分則是串口驅動程序的應用。串口驅動程序的初始化串口驅動程序的初始化主要包括一下幾個部分。l硬件地址的設置(指定)。硬件地址的指定可以通過在函數(shù)庫中直接指定相關變量的數(shù)值而達到目的,不一定非要執(zhí)行相關的函數(shù)。如sysSerial函數(shù)庫。因此它不需要函數(shù)調(diào)用過程來實現(xiàn)。l硬件的初始化。主要是通過函數(shù)執(zhí)行向硬件的控制寄存器寫入特定的數(shù)值來實現(xiàn),通常需要函數(shù)指定的動態(tài)過程。l中斷處理程序的安裝。需要函數(shù)執(zhí)行來安裝。l各個函數(shù)庫的初始化。主要是函數(shù)庫中相關數(shù)據(jù)結構的初始化,一般需要動態(tài)執(zhí)行和靜態(tài)指定相結合來實現(xiàn)。l串口驅動程序數(shù)據(jù)結構的搭建。主要體現(xiàn)在數(shù)據(jù)結構下面從vxWorks操作系統(tǒng)啟動的過程來分析驅動程序的安裝過程。vxWorks操作系統(tǒng)啟動過程中串口驅動的初始化過程(1)第一步初始化建立的數(shù)據(jù)關系串口驅動程序的第二步初始化則是通過調(diào)用函數(shù)usrRoot函數(shù)來完成的。串口驅動程序的第二步初始化iosInit函數(shù)初始化iosLib庫ttyDrvCreate運行完畢后形成的數(shù)據(jù)結構。表格2函數(shù)庫名稱初始化函數(shù)名稱說明ioLib無需初始化iosLibiosInitttyDrv無需初始化tyLibtyDevIniti8250Sioi8250HrdIniti8250InitChannelsysSerialsysSerialHwInitusrSerial無需初始化上面完整地分析了各個函數(shù)庫的初始化、硬件的初始化、以及數(shù)據(jù)結構關系的構建,vxWorks操作系統(tǒng)在初始化過程中通過這三個過程,完成了串口驅動的初始化以及安裝過程。中斷中斷是計算機系統(tǒng)中很常用的一種工作方式。在沒有中斷的計算機系統(tǒng)中,如果要求CPU在某一外設的狀態(tài)發(fā)生改變時立刻進行處理,為了保證及時處理CPU就必須不斷查詢該外設狀態(tài)是否發(fā)生改變,一旦發(fā)生改變則做出相應的處理。顯然這種方式會因為CPU不斷查詢而浪費極大資源。中斷方式的出現(xiàn)則解決了這個問題,它只在外設需要CPU做出處理的時候向CPU發(fā)出中斷信號,CPU收到中斷信號后則暫時擱置正在處理的任務轉入外設請求處理,待處理完畢后則重新返回繼續(xù)執(zhí)行已擱置的任務。一般來說中斷可以分為兩大類,硬中斷和軟中斷。其中硬中斷指的是來自CPU以外的IO設備或者電路產(chǎn)生的中斷,又稱作外部中斷,硬中斷則又可分為可屏蔽中斷和非屏蔽中斷。非屏蔽中斷主要用于處理某些影響系統(tǒng)正常運行的外部事件,如電源故障、RAM奇偶校驗錯等等。非屏蔽中斷不能被CPU用指令CLI來禁止。一旦出現(xiàn)就必須響應。而可屏蔽中斷則正好相反。軟中斷是由CPU內(nèi)部狀態(tài)或者執(zhí)行中斷指令引起中斷。對PC機來說,軟中斷又可以分為微處理器專用中斷和指令形式軟中斷兩種。在執(zhí)行中,如果CPU發(fā)現(xiàn)出現(xiàn)了某種狀態(tài)就會轉而執(zhí)行專用的處理程序,這部分中斷成為微處理器專用中斷,如除法錯、單步中斷、NMI中斷、斷點中斷、溢出錯、屏幕打印等等。指令中斷則是執(zhí)行了INTN指令產(chǎn)生的中斷,如DOS中斷、ROMBIOS中斷。在PC機上最常見中斷控制芯片為i8259可編程中斷控制器(ProgrammableInterruptController,PIC),i8259采用兩級方式,主8259和從8259一共兩片,其中從8259中斷輸出連接到主8259的2號中斷位置。i8259中斷控制器的連接方式中斷控制器i8259概述本節(jié)并不打算用大段的內(nèi)容描述i8259中斷控制器,只是重點強調(diào)幾個需要注意的幾個問題。關于i8259中斷控制器詳細的描述可以參考intel公司i8259控制器的相關資料。1.邊沿觸發(fā)和電平觸發(fā)的區(qū)別采用電平觸發(fā)時,如果IRQn上出現(xiàn)高電平,且此高電平一直保持到第一個INTA負脈沖到來,8259就會認為IRQn提出一個中斷申請,并使得相應的IRR位置1。這種方式可以提供重復的中斷申請直至IRn輸入變?yōu)榈碗娖綖橹?。若只要求產(chǎn)生一次中斷,那么應在CPU發(fā)出EOI命令之前或CPU再次開發(fā)中斷之前,讓已經(jīng)被相應的中斷申請變?yōu)榈碗娖?,否則CPU將會在發(fā)送完EOI之后再次接收到中斷請求。邊沿觸發(fā)式下,若在IR輸入端檢測到由低電平到高電平的跳變,且高電平保持到第一個INTA負脈沖,8259A就認為有中斷申請。顯然,在嵌套模式下,CPU為了檢測到從中斷控制器的多個中斷輸入,主中斷控制器必須使用電平觸發(fā)的方式,否則來自從中斷控制器上連續(xù)兩個中斷請求信號將不能被主中斷控制器檢測到。2.ISR和IRR寄存器IRR寄存器存放IRQn上發(fā)送的中斷請求,如果一個IRQn上來了一個有效的中斷請求,則會在IRR的相應位上置位。ISR寄存器存放當前正在服務的中斷申請,包括正在服務的高優(yōu)先級申請以及被打斷的低優(yōu)先級申請。3.完全嵌套模式和特殊嵌套模式在完全嵌套下,中斷優(yōu)先級從0到7依次降低(0為最高優(yōu)先級)。當一個中斷到來時,它對應的IS寄存器相應的位將被置位,直至CPU對其發(fā)送一個EOI信號。在發(fā)送EOI信號之前,同級別或低級別的中斷將不被處理,更高級的中斷可以處理。這種方式的一個缺點就是當進行主從8259級聯(lián)時,如果從片上先后連續(xù)發(fā)送兩次不同級別的中斷信號且后到的中斷優(yōu)先級較高的話,這時對主8259來說則接收不到從片上第二次到來的優(yōu)先級更高的中斷。為了解決這個問題,可以選擇特殊嵌套。該模式與完全嵌套模式在下列方面是不同的:1)當從片上的一個中斷請求正在被響應時,該從片上的其他更高優(yōu)先級的中斷都是可以被響應的。2)在退出中斷處理程序時,一定要檢查該主片上的中斷對應的從片是否只有一個中斷。如果是,則需要向主片發(fā)送一個EOI信號撤銷主片上的中斷,否則還有處理從偏上的其他中斷,直至該從片上的所有中斷都處理完畢才能向主片發(fā)送EOI信號。4.消除因處理時鐘中斷而導致其他中斷處理被延遲的一些辦法在PC主板上,ThePIC(8259A)IRQ0通過硬件連接到PIT(8253)通道0。IRQ0在8259控制的中斷中具有最高的中斷優(yōu)先級,因此系統(tǒng)時鐘中斷將會屏蔽掉其他所有低優(yōu)先級的中斷。這樣可能會導致其他的中斷處理出現(xiàn)延遲,從硬件的角度來看,這些延遲都是很正常的。可是從軟件的角度來看則不是那么理想了。因此vxworks提供了3種方法來解決這個問題。當然這三種方法則是互斥的。1)在IRQ0ISR中提前發(fā)送EOI命令(EarlyEOIMode)這種模式下,CPU會在IRQ0系統(tǒng)時鐘中斷服務執(zhí)行內(nèi)核任務前調(diào)用函數(shù)i8259IntBoiEem()向PIC發(fā)送EOI命令,這樣系統(tǒng)內(nèi)核中運行的中斷服務程序會被其他低優(yōu)先級中斷的最高者打斷。而在ISR執(zhí)行完畢后將不再發(fā)送EOI指令。2)在IRQ0的ISR中采用特別屏蔽模式(SpecialMaskMode)特殊屏蔽模式主要用于IRQ0的系統(tǒng)時鐘ISR。這樣做的一個結果就是導致當前被屏蔽的中斷ISR執(zhí)行的優(yōu)先級已經(jīng)降到了最低(注意是在其所在硬件中斷設備中的最低優(yōu)先級)。因為只有在其他硬件中斷不存在的情況下,該ISR才可能執(zhí)行。具體的操作方法是在ISR執(zhí)行之前執(zhí)行函數(shù)i8259IntBoiSmm()將IRQ0中斷屏蔽,并在該ISR執(zhí)行完畢后執(zhí)行函數(shù)i8259IntEoiSmm()撤銷IRQ0的屏蔽。3)自動EOI模式(AutomaticEOIMode)該模式是在CPU在中斷確認周期結束后立即自動向主PIC發(fā)送EOI信號,當然如果存在從PIC的情況下,如果從PIC有多個中斷,那么將會導致混亂,即從PIC的中斷還沒有處理完畢,而主PIC的中斷已經(jīng)關閉了,因此這種方法并不適用于級聯(lián)的PIC結構。顯而易見,這種方法不再需要軟件向PIC發(fā)送EOI信號。中斷驅動程序的結構對于VxWorks操作系統(tǒng)來說,它的一個基本的設計思想就硬件相關部分和硬件無關部分的分離。中斷驅動是一個比較特殊的驅動,這在于它不但和中斷控制芯片有關系,還和CPU的結構有關,因此它的接口被分成了兩部分,一部分是控制CPU的接口,一部分是控制終端控制芯片的接口。在vxWokrs系統(tǒng)中,函數(shù)庫intArchLib和intALib(匯編)為應用函數(shù)提供了一組中斷控制接口,該中斷接口采用通用的接口但是其實現(xiàn)則與CPU相關,不同CPU對應的intArchLib和intALib(匯編)文件不同但文件名相同,這些不同的文件保存在相應的CPU目錄下,如pentium處理器對應的intArhLib文件保存在目錄src\arch\i86目錄下;另一方面它通過函數(shù)庫sysLib實現(xiàn)了中斷控制器的通用接口,而由i8259Intr函數(shù)庫來負責8259中斷控制器的具體實現(xiàn)。中斷驅動程序各函數(shù)庫的層次關系函數(shù)庫intArchLib函數(shù)庫主要為上層應用程序提供了一組與外部硬件無關的中斷控制函數(shù)。其中比較常用的就是函數(shù)intConnect、intEnable、intDisable。1.STATUSintConnect(VOIDFUNCPTR*vector,VOIDFUNCPTRroutine,intparameter)該函數(shù)的作用是將一個C函數(shù)與一個硬件中斷連接起來,當發(fā)生了硬件中斷時,自動執(zhí)行該C函數(shù)。它主要完成了三件事情,一是調(diào)用函數(shù)(*intEoiGet)(......)獲取該中斷的ISR處理前后需要執(zhí)行的函數(shù)routineBoi、routineEoi及其參數(shù);二是調(diào)用函數(shù)intHandlerCreateI86填充數(shù)組intConnectCode,主要填充routineBoi、routine、routineEoi,組成完整的中斷執(zhí)行代碼;三是調(diào)用函數(shù)intVecSet將數(shù)組intConnectCode存放到參數(shù)vector指定的位置。注意:代碼中調(diào)用intHandlerCreate的情況屬較老的vxWorks版本,對于新版本已經(jīng)被intHandlerCreateI86函數(shù)所代替,因此不再過多分析。2.intEnable()允許一個特定的中斷,這個函數(shù)由全局函數(shù)指針sysIntLvlEnableRtn定義,不過目前是沒有定義,如果用戶需要的話可以自己定義sysIntLvlEnableRtn。3.intDisable()關閉一個特定的中斷,這個函數(shù)由全局函數(shù)指針sysIntLvlDisableRtn定義,不過目前是沒有定義,如果用戶需要的話可以自己定義sysIntLvlDisableRtn。4.intHandlerCreate()這是是早期的toanado版本。這個函數(shù)的作用是將intConnectCode復制到代碼段并填充代碼中的intEnt函數(shù)、C函數(shù)及參數(shù)、intExit函數(shù),如有必要(定義了intEOI),則同樣要填充_routineEoi函數(shù),如果不需要填充則直接將相應的位置填NOP指令代替,最終得到一個完整的中斷處理函數(shù)。不過需要注意的是這個函數(shù)并沒有填充intConnectCode代碼中的routineBoi函數(shù)及參數(shù)而是直接用NOP代替了。注意,routineEoi函數(shù)的參數(shù)沒有填充。此外還要注意routineBoi函數(shù)及參數(shù)的位置,用NOP填充了,因此就少了一個pushl指令,后面的addl $12,%esp指令也要做相應修正。5.intHandlerCreateI86()這個是目前的toanado版本實現(xiàn)。這個函數(shù)的功能和intHandlerCreate是一樣的,不過已經(jīng)進行了一些改進。主要在一下幾個方面:如果有必要(參數(shù)routineBoi有效)則填充函數(shù)_routineBoi函數(shù)及其參數(shù);否則用NOP填充。如有必要(參數(shù)routineEoi有效)中則填充_routineEoi函數(shù)及其參數(shù);否則用NOP只填充_routineEoi函數(shù)而不填充其參數(shù)。參考這段代碼的注釋:LOCALUCHARintConnectCode[] = /*intConnectstub*/{/**00e8kkkkkkkk call _intEnt *tellkernel*0550 pushl %eax *saveregs*0652 pushl %edx*0751 pushl %ecx*0868pppppppp pushl $_parameterBoi *pushBOIparam*13e8rrrrrrrr call _routineBoi *callBOIroutine*1868pppppppp pushl $_parameter *pushparam*23e8rrrrrrrr call _routine *callCroutine*2868pppppppp pushl $_parameterEoi *pushEOIparam*33e8rrrrrrrr call _routineEoi *callEOIroutine
點擊復制文檔內(nèi)容
環(huán)評公示相關推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1