<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > vxworks嵌入式操作系統下串行設備驅動(dòng)程序開(kāi)發(fā)思路

vxworks嵌入式操作系統下串行設備驅動(dòng)程序開(kāi)發(fā)思路

作者: 時(shí)間:2012-10-09 來(lái)源:網(wǎng)絡(luò ) 收藏

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ě)的最后一步:在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)函數不同,在安裝設備的過(guò)程中,無(wú)論設備相同與否,有幾個(gè)設備則上述過(guò)程需調用幾次。以上各函數的加載主要在usrinit()函數中完成。

3. 結束語(yǔ)

需要說(shuō)明的是,在VxWorks下,設備既可以嵌入內核隨系統一起啟動(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不再難懂)

上一頁(yè) 1 2 3 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>