vxworks嵌入式操作系統下串行設備驅動(dòng)程序開(kāi)發(fā)思路
sysIntEnablePIC (devParas[i].intLevel);
}
}
其中,宏INUM_TO_IVEC的作用是把中斷號轉為中斷向量。i8250Int是指向輸入/輸出中斷處理函數的指針。描述相應硬件的結構i8250Chan為函數i8250int()的入口參數。
至此,設備硬件的初始化、相關(guān)的低層函數的掛接、中斷初始化基本完成。開(kāi)始進(jìn)行下一步,將設備的驅動(dòng)函數安裝在Driver Table 中。
⑶ 與上層標準輸入/輸出函數的掛接
在此處I/O系統通過(guò)調用ttyDrv()(在沒(méi)有定義INCLUDE_TYCODRV_5_2的情況下)將相應驅動(dòng)函數添加到Driver Table中,從而完成與上層標準輸入/輸出函數的掛接。
由上圖知,iosDrvInstall()函數在Driver Table中掛接的函數是tyWrite()和tyRead(),而不是我們實(shí)際編寫(xiě)的輸入/輸出函數。其具體的調用過(guò)程是:
① 當用戶(hù)調用write函數進(jìn)行寫(xiě)操作時(shí),根據相應的fd調用在Driver Table中注冊的函數tyWrite(),此函數的作用是將用戶(hù)緩沖區的內容寫(xiě)入相應的輸出ring buffer,當發(fā)現緩沖區內有內容時(shí),開(kāi)始調用回調函數tyITX(),從ring buffer讀取字符,由I8250Startup()啟動(dòng)中斷輸出,最后由設備的輸出中斷服務(wù)程序(在本例中調用的是sysOutbyte())將字符發(fā)往指定的串口。
② 當串口接收到數據時(shí)會(huì )調用輸入中斷服務(wù)程序(在本例中是sysInbyte()),將輸入的字符寫(xiě)入指定的緩沖區。然后由回調函數tyIRd()將緩沖區的內容讀入ring buffer,當用戶(hù)調用read函數進(jìn)行寫(xiě)操作時(shí),會(huì )根據相應的fd調用在Driver Table中注冊的函數tyRead(),此函數會(huì )將ring buffer中的內容讀入用戶(hù)緩沖區。
關(guān)于具體的中斷輸入/輸出函數如何調用,本文不做詳細分析,請參閱i8250int()及i8250Startup()。
對于輸入/輸出控制函數ioctl()的掛接,則是直接將命令傳到由用戶(hù)編寫(xiě)的i8250ioctl()函數,其具體的實(shí)現代碼與驅動(dòng)的設計思路無(wú)緊密的聯(lián)系,本文也不做具體分析。
⑷ 具體設備與相關(guān)驅動(dòng)的掛接
當Driver Table中相應的驅動(dòng)函數掛接完成,開(kāi)始編寫(xiě)驅動(dòng)程序的最后一步:在Device Table中加入設備,完成具體設備與相關(guān)驅動(dòng)的掛接。此項工作是由ttyDevCreat()函數完成的。本函數主要實(shí)現以下功能:
① 分配并初始化一個(gè)device descriptor。
② 通過(guò)調用tyDevInit()初始化tyLib。此處主要完成輸入/輸出ring buffer的創(chuàng )建、建立用與相關(guān)函數的信號量、初始化selectLib。
③ 調用iosDevAdd()將串口設備加入Device Table。對于設備特性的描述信息是由sysSerialChanGet()函數得到,并以參數形式傳入的。
④ 為底層設備安裝回調函數,在本例中是為i8250CHAN 安裝tyIRd()、tyITx()兩處回調函數。
⑤ 開(kāi)中斷,設備開(kāi)始以中斷方式工作。
至此,驅動(dòng)程序的分析全部完成。與掛接驅動(dòng)函數不同,在安裝設備的過(guò)程中,無(wú)論設備相同與否,有幾個(gè)設備則上述過(guò)程需調用幾次。以上各函數的加載主要在usrinit()函數中完成。
3. 結束語(yǔ)
需要說(shuō)明的是,在VxWorks下,設備驅動(dòng)程序既可以嵌入內核隨系統一起啟動(dòng),也可以作為可加載模塊在系統啟動(dòng)之后運行。相比之下,后一種方式比較簡(jiǎn)單,不用修改系統內核,引入錯誤的可能性小。但是無(wú)論采取哪種方式,其基本思路及需要完成的工作是相同的。本文沒(méi)有按照系統的調用過(guò)程進(jìn)行一步步分析,主要基于上述考慮。用戶(hù)在編寫(xiě)相關(guān)驅動(dòng)程序時(shí),中心任務(wù)是按步驟完成上述功能,而沒(méi)有必要去死搬系統的加載步驟。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)
評論