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

正文內(nèi)容

vxworks驅(qū)動(dòng)開發(fā)筆記-資料下載頁

2025-06-29 09:24本頁面
  

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