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

正文內(nèi)容

vxworks驅(qū)動開發(fā)筆記(編輯修改稿)

2025-07-26 09:24 本頁面
 

【文章內(nèi)容簡介】 的設(shè)置等等。同樣,作為串口驅(qū)動的部分,也可以分為與硬件相關(guān)部分和與硬件無關(guān)部分。VxWorks操作系統(tǒng)的串口驅(qū)動與硬件無關(guān)部分主要有兩個函數(shù)庫來實現(xiàn),一是ttyDrv函數(shù)庫,主要用于7個通用函數(shù)中的5個函數(shù)的具體實現(xiàn),另一個是tyLib函數(shù)庫,主要用于處理收發(fā)緩沖區(qū)的處理。另一方面,從結(jié)構(gòu)TYCO_DEV來看,tyLib的主要數(shù)據(jù)結(jié)構(gòu)TY_DEV變量包含在結(jié)構(gòu)TYCO_DEV。函數(shù)庫ttyDrv與tyLib的層次關(guān)系函數(shù)庫ttyDrv主要通過結(jié)構(gòu)SIO_CHAN訪問底層函數(shù),在結(jié)構(gòu)TYCO_DEV中有一個SIO_CHAN結(jié)構(gòu)變量指針,該變量指針指向底層的操作函數(shù)。如圖13所示。ttyDrv庫與底層庫的函數(shù)接口首先分析ttyDrv函數(shù)庫,這個函數(shù)庫比較簡單,直接分析各個函數(shù)。1.STATUSttyDrv(void)函數(shù)ttyDrv主要調(diào)用了函數(shù)iosDrvInstall完成了7個函數(shù)的安裝,對串口來說,系統(tǒng)并不要完全安裝這7個函數(shù),比如delete函數(shù),如果操作系統(tǒng)不要求delete串口驅(qū)動,那么這個函數(shù)也就不需要了。實際上ttyDrv函數(shù)主要安裝了基本操作函數(shù)。函數(shù)ttyDrv主要安裝的函數(shù)這些函數(shù)中有ttyOpen、ttyClose、其他函數(shù)如tyRead、tyWrite則是由函數(shù)庫tyLib提供的。2.STATUSttyDevCreate(char*name,SIO_CHAN* pSioChan,intrdBufSize,intwrtBufSize)這個函數(shù)為一個tty設(shè)備創(chuàng)建了一個TYCO_DEV數(shù)據(jù)結(jié)構(gòu)并進(jìn)行初始化(包括硬件的初始化)。其中pSioChain是底層串行通道描述符(SIO_CHAN結(jié)構(gòu)變量)的地址。rdBufSize和wrtBufSize為讀寫緩沖區(qū)的大小。ttyDevCreate函數(shù)在執(zhí)行過程中調(diào)用了函數(shù)tyDevInit對tyLib庫進(jìn)行了初始化。注意調(diào)用函數(shù)tyDevInit的最后一個參數(shù)ttyStartup,這個函數(shù)對底層操作函數(shù)(pSioChan)pDrvFuncstxStartup進(jìn)行了封裝,也就是說只有函數(shù)ttyDrv直接與底層硬件操作函數(shù)向關(guān)聯(lián),而tyLib庫則完全被保護(hù)在了硬件無關(guān)層()。ttyDevCreate()。同時它指定了串口的處理模式為中斷模式(另一種為輪詢模式)。ttyDevCreate()函數(shù)操作的數(shù)據(jù)結(jié)構(gòu)注意這個函數(shù)和ioLib庫中的create函數(shù)是完全不同的概念,該函數(shù)的調(diào)用應(yīng)該在create之前。3.LOCALintttyOpen(TYCO_DEV* pTyCoDev,char* name,int flags,int mode)打開一個ttyDrv串行設(shè)備。所謂打開設(shè)備就是使其處于準(zhǔn)備收發(fā)數(shù)據(jù)的狀態(tài),對i8250串口控制芯片來說就是設(shè)定計算機(jī)準(zhǔn)備接收(DTR)和請求發(fā)送數(shù)據(jù)(RTS)的狀態(tài)。注意:每調(diào)用一次函數(shù)ttyOpen,該pTyCoDev,表明該設(shè)備打開的次數(shù)。4.LOCALintttyClose(TYCO_DEV* pTyCoDev)關(guān)閉一個ttyDrv設(shè)備。所謂關(guān)閉設(shè)備就是就是關(guān)閉其收發(fā)數(shù)據(jù)就緒的狀態(tài)。注意:每調(diào)用一次函數(shù)ttyClose,pTyCoDev,表明該設(shè)備打開的次數(shù)。5.LOCALintttyIoctl(TYCO_DEV* pTyCoDev,int request,void* arg)對硬件設(shè)備的控制操作。request是一個比較廣義的操作,包含的種類繁多,而且對同樣的操作,對不同的函數(shù)庫來說,參數(shù)也可能會有所不同,如波特率設(shè)置,在ttyDrv庫request為FIOBAUDRATE,而在sioLib庫中該參數(shù)為SIO_BAUD_SET,因此需要進(jìn)行參數(shù)的轉(zhuǎn)換;另一方面sioIoCtl函數(shù)和tyIoCtl函數(shù)處理的職責(zé)是不同的,因此需要首先嘗試調(diào)用sioIoCtl函數(shù),如果無此操作則嘗試tyIoCtl函數(shù)。6.LOCALvoidttyStartup(TYCO_DEV*pTyCoDev)發(fā)送數(shù)據(jù)函數(shù)。直接調(diào)用底層的發(fā)送函數(shù)。在函數(shù)ttyDrv中調(diào)用iosDrvInstall函數(shù)安裝了兩個函數(shù)tyRead和tyWrite,這兩個函數(shù)并在函數(shù)庫ttyDev中,而是在tyLib庫中。主要完成收發(fā)緩沖區(qū)的處理,下面要進(jìn)行tyLib庫的分析。函數(shù)庫tyLibtyLib函數(shù)在ttyDrv庫與底層硬件操作之間建立了一個收發(fā)緩沖區(qū),當(dāng)上層函數(shù)需要接收數(shù)據(jù)時并不是直接讀取硬件的接收寄存器,而是調(diào)用函數(shù)tyRead讀取tyLib的緩沖區(qū),同樣在發(fā)送數(shù)據(jù)時也是通過調(diào)用tyWrite函數(shù)將數(shù)據(jù)發(fā)送給tyLib的緩沖區(qū)中。tyLib負(fù)責(zé)對緩沖區(qū)進(jìn)行管理,包括在輪詢和中斷模式下自動從串口控制器中讀寫數(shù)據(jù),當(dāng)接收緩沖區(qū)占用了一定的空間之后,調(diào)用上層回調(diào)函數(shù)將接收緩沖區(qū)的數(shù)據(jù)取走等等,另外在不同的模式下,還要完成對接收緩沖區(qū)的數(shù)據(jù)進(jìn)行重新組織等任務(wù)。當(dāng)前tyLib庫的接收緩沖區(qū)管理主要實現(xiàn)了line模式和raw模式的緩沖區(qū)管理。所謂line模式就想當(dāng)我們的中斷輸入,只有在按下回車鍵以后,計算機(jī)才進(jìn)行相應(yīng)的動作,否則只是在屏幕上進(jìn)行顯示,如果在動作前按下了退格、CTRLX、CTRLC等等按鍵,那么還要重新對新輸入的line進(jìn)行修改等等。這在利用串口連接終端的情況下是十分有用的。在raw模式下,計算機(jī)每次指示讀取相應(yīng)的字符,并不對其中的含義進(jìn)行解釋,讀取完畢后就根據(jù)緩沖區(qū)的情況決定是否調(diào)用回調(diào)函數(shù)將接收緩沖區(qū)的數(shù)據(jù)取走。1.STATUStyDevInit下面分析tyLib庫中的各個函數(shù)。(FASTTY_DEV_IDpTyDev,intrdBufSize,intwrtBufSize,FUNCPTRtxStartup)用指定的參數(shù)初始化tty設(shè)備描述符。tty設(shè)備描述符是一個數(shù)據(jù)結(jié)構(gòu)TY_DEV的變量而不是硬件設(shè)備,該結(jié)構(gòu)變量在函數(shù)調(diào)用前已經(jīng)創(chuàng)建,因此這里只需要進(jìn)行初始化就行了,而不用重新創(chuàng)建。注意區(qū)分互斥變量和二進(jìn)制信號量的區(qū)別?;コ庾兞康哪康氖菫榱吮WC在一定的時間段內(nèi)一個任務(wù)對某個資源獨占,即只有當(dāng)前任務(wù)可以訪問某一資源,在這期間其他任務(wù)無法獲取到該資源,互斥變量的獲取和釋放都是由同一任務(wù)完成,它主要強(qiáng)調(diào)資源的獨占性;而二進(jìn)制信號量則是某一任務(wù)為了獲取某一資源,但是該資源卻是由其他任務(wù)來提供的,它的主要目的是為了確保不同任務(wù)的同步,即只有在資源有效的情況下,才能有任務(wù)實用該資源,二進(jìn)制信號量的獲取和提供往往是由不同的任務(wù)來完成的,通常是任務(wù)A提供了某一資源,任務(wù)B等待到任務(wù)A提供了資源后才能有效獲取。二者的區(qū)別主要在于二進(jìn)制信號量的資源是消耗性的,它分別由不同的任務(wù)生產(chǎn)和消耗;而互斥變量保護(hù)的資源則是獨占性,不存在生產(chǎn)和消耗之說,而僅僅是確保只有一個任務(wù)可以訪問該資源。這里的二進(jìn)制信號量rdSyncSem,這個信號量確保底層串口驅(qū)動tyIRd在輸入環(huán)狀緩沖區(qū)保存了一定的數(shù)據(jù)之后,tyRead上層函數(shù)才能有效獲取該信號量并開始讀取這些數(shù)據(jù)。二進(jìn)制信號量wrtSyncSem則是確保在輸出環(huán)狀緩沖區(qū)中有足夠的空間資源,當(dāng)有了足夠的空間資源則函數(shù)tyITx釋放掉一定的空間時候信號量有效,而tyWrite只有在獲取了該信號量后才可以向輸出環(huán)狀緩沖區(qū)中寫入數(shù)據(jù)?;コ庾兞縨utexSem的作用是為了確保對TY_DEV結(jié)構(gòu)變量的訪問保護(hù)。2.STATUStyDevRemove(TY_DEV_IDpTyDev)tyDevInit函數(shù)的逆過程。注意這里flushingRdBuf和flushingWrtBuf要在rdBuf和wrtBuf內(nèi)存被釋放之前置為True是為了確保中斷處理程序tyITx和tyIRd不會在釋放了之后訪問這段內(nèi)存。3.LOCALvoidtyFlush(FASTTY_DEV_IDpTyDev)這個函數(shù)比較簡單,直接調(diào)用函數(shù)tyFlushRd和函數(shù)tyFlushWrt對各自的buffer進(jìn)行flush。4.LOCALvoidtyFlushRd(FASTTY_DEV_IDpTyDev)該函數(shù)的作用是對輸入環(huán)狀緩沖區(qū)進(jìn)行flush。注意flush前需要將flushingRdBuf置位是為了確保不被中斷處理程序tyIRd搞亂。注意flush結(jié)束之后要發(fā)送一個XON信號提示對方串口設(shè)備接收準(zhǔn)備好,并將變量flushingRdBuf復(fù)位為False。5.LOCALvoidtyFlushWrt(FASTTY_DEV_IDpTyDev)該函數(shù)的作用是對輸出環(huán)狀緩沖區(qū)進(jìn)行flush。注意flush前需要將flushingWrtBuf置位是為了確保不被中斷處理程序tyITx搞亂。注意flush結(jié)束之后free空間很大,因此要給出一個wrtSyncSem信號量,并將變量flushingWrtBuf復(fù)位為False。最后還要利用_func_selWakeupAll通知各個函數(shù)輸出環(huán)狀緩沖區(qū)已經(jīng)空出來了。6.voidtyAbortFuncSet(FUNCPTRfunc)設(shè)置abort函數(shù),當(dāng)收到abort字符時執(zhí)行func函數(shù)。默認(rèn)為null。7.voidtyAbortSet(charch)設(shè)置abort字符,默認(rèn)該字符為CTRLC。8.voidtyBackspaceSet(charch)設(shè)定backspace字符,默認(rèn)字符為CTRLH。9.voidtyDeleteLineSet(charch)設(shè)置行刪除命令字符,默認(rèn)為CTRLU。10.voidtyEOFSet(charch)設(shè)置endoffile字符,默認(rèn)該字符為CTRLD。11.voidtyMonitorTrapSet(charch)設(shè)置TRAPTOMONITOR字符,默認(rèn)該字符為CTRLX。當(dāng)OPT_MON_TRAP選項有效時,輸入TRAPTOMONITOR字符,將會終止通常的多任務(wù)系統(tǒng)并進(jìn)入TRAPTOMONITOR程序。12.STATUStyIoctl(FASTTY_DEV_IDpTyDev,intrequest,intarg)處理tty設(shè)備的ioctl請求?,F(xiàn)有的bug:在line模式下,以參數(shù)FIONREAD調(diào)用返回的是輸入緩沖區(qū)中的字符數(shù),如果在buffer中有5個空行,每個空行字符占用一字節(jié),此外還有一個行字符數(shù)占用一字節(jié),那么其返回值為10。FIONREAD:返回接收環(huán)形緩沖區(qū)中的有效字符數(shù)(不包含正在輸入的未完成的行)。FIONWRITE:返回發(fā)送環(huán)形緩沖區(qū)中的有效字符數(shù)。FIOFLUSH:flush輸入發(fā)送環(huán)形緩沖區(qū)。FIOWFLUSH:flush接收環(huán)形緩沖區(qū)。FIORFLUSH:flush發(fā)送環(huán)形緩沖區(qū)。FIOGETOPTIONS:讀取設(shè)備選項。FIOSETOPTIONS:設(shè)置設(shè)備選項。FIOCANCEL:取消設(shè)備的讀寫。FIOISATTY:返回TRUE。FIOPROTOHOOK:設(shè)定函數(shù)pTyDevprotoHook。FIOPROTOARG:設(shè)定函數(shù)pTyDevprotoHook的參數(shù)pTyDevprotoArg。FIORBUFSET:重新設(shè)定發(fā)送環(huán)形緩沖區(qū)。FIOWBUFSET:重新設(shè)定發(fā)送環(huán)形緩沖區(qū)。FIOSELECT:增加selWakeupList。FIOUNSELECT:刪掉selWakeupList中指定的item。13.inttyWrite(FASTTY_DEV_IDpTyDev,char*buffer,FASTintnbytes)向TY_DEV的發(fā)送環(huán)形緩沖區(qū)中寫入數(shù)據(jù)。并啟動tyTxStartup開始向device發(fā)送。注意在寫入前take二進(jìn)制信號量wrtSyncSem確保有足夠的空間,寫完后檢查是否有空間,如果有空間則需要give二進(jìn)制信號量wrtSyncSem,方便其他任務(wù)寫入。14.inttyRead(FASTTY_DEV_IDpTyDev,char*buffer,intmaxbytes)從接收環(huán)形緩沖區(qū)中讀取數(shù)據(jù)。pTyDevlnBytesLeft變量記錄了上次讀取數(shù)據(jù)時,讀取行中剩余的字節(jié)數(shù),如果為0說明已經(jīng)完整地讀取了一整行。否則說明上次讀取的行中還有一定的字節(jié)沒有讀取,這時候可以直接讀取。讀取完畢之后要檢查接收環(huán)形緩沖區(qū)中空閑的空間否足夠,如果足夠的話且OPT_TANDEM選項有效且當(dāng)前為XOFF,這時候需要向device發(fā)送一個XON信號表明接收準(zhǔn)備好。15.STATUStyITx(FASTTY_DEV_IDpTyDev,char*pChar)中斷級處理程序,取出下一個要發(fā)送的字符(注意并不是所有要發(fā)送的字符都是要先從發(fā)送環(huán)形緩沖區(qū)中取出來的,如XO
點擊復(fù)制文檔內(nèi)容
環(huán)評公示相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖片鄂ICP備17016276號-1