新聞中心

        EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > vxworks嵌入式操作系統(tǒng)下串行設(shè)備驅(qū)動(dòng)程序開發(fā)思路

        vxworks嵌入式操作系統(tǒng)下串行設(shè)備驅(qū)動(dòng)程序開發(fā)思路

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

        sysIntEnablePIC (devParas[i].intLevel);

        }

        }

        其中,宏INUM_TO_IVEC的作用是把中斷號(hào)轉(zhuǎn)為中斷向量。i8250Int是指向輸入/輸出中斷處理函數(shù)的指針。描述相應(yīng)硬件的結(jié)構(gòu)i8250Chan為函數(shù)i8250int()的入口參數(shù)。

        至此,設(shè)備硬件的初始化、相關(guān)的低層函數(shù)的掛接、中斷初始化基本完成。開始進(jìn)行下一步,將設(shè)備的驅(qū)動(dòng)函數(shù)安裝在Driver Table 中。

        ⑶ 與上層標(biāo)準(zhǔn)輸入/輸出函數(shù)的掛接

        在此處I/O系統(tǒng)通過調(diào)用ttyDrv()(在沒有定義INCLUDE_TYCODRV_5_2的情況下)將相應(yīng)驅(qū)動(dòng)函數(shù)添加到Driver Table中,從而完成與上層標(biāo)準(zhǔn)輸入/輸出函數(shù)的掛接。

        由上圖知,iosDrvInstall()函數(shù)在Driver Table中掛接的函數(shù)是tyWrite()和tyRead(),而不是我們實(shí)際編寫的輸入/輸出函數(shù)。其具體的調(diào)用過程是:

        ① 當(dāng)用戶調(diào)用write函數(shù)進(jìn)行寫操作時(shí),根據(jù)相應(yīng)的fd調(diào)用在Driver Table中注冊(cè)的函數(shù)tyWrite(),此函數(shù)的作用是將用戶緩沖區(qū)的內(nèi)容寫入相應(yīng)的輸出ring buffer,當(dāng)發(fā)現(xiàn)緩沖區(qū)內(nèi)有內(nèi)容時(shí),開始調(diào)用回調(diào)函數(shù)tyITX(),從ring buffer讀取字符,由I8250Startup()啟動(dòng)中斷輸出,最后由設(shè)備的輸出中斷服務(wù)程序(在本例中調(diào)用的是sysOutbyte())將字符發(fā)往指定的串口。

        ② 當(dāng)串口接收到數(shù)據(jù)時(shí)會(huì)調(diào)用輸入中斷服務(wù)程序(在本例中是sysInbyte()),將輸入的字符寫入指定的緩沖區(qū)。然后由回調(diào)函數(shù)tyIRd()將緩沖區(qū)的內(nèi)容讀入ring buffer,當(dāng)用戶調(diào)用read函數(shù)進(jìn)行寫操作時(shí),會(huì)根據(jù)相應(yīng)的fd調(diào)用在Driver Table中注冊(cè)的函數(shù)tyRead(),此函數(shù)會(huì)將ring buffer中的內(nèi)容讀入用戶緩沖區(qū)。

        關(guān)于具體的中斷輸入/輸出函數(shù)如何調(diào)用,本文不做詳細(xì)分析,請(qǐng)參閱i8250int()及i8250Startup()。

        對(duì)于輸入/輸出控制函數(shù)ioctl()的掛接,則是直接將命令傳到由用戶編寫的i8250ioctl()函數(shù),其具體的實(shí)現(xiàn)代碼與驅(qū)動(dòng)的設(shè)計(jì)思路無緊密的聯(lián)系,本文也不做具體分析。

        ⑷ 具體設(shè)備與相關(guān)驅(qū)動(dòng)的掛接

        當(dāng)Driver Table中相應(yīng)的驅(qū)動(dòng)函數(shù)掛接完成,開始編寫的最后一步:在Device Table中加入設(shè)備,完成具體設(shè)備與相關(guān)驅(qū)動(dòng)的掛接。此項(xiàng)工作是由ttyDevCreat()函數(shù)完成的。本函數(shù)主要實(shí)現(xiàn)以下功能:

        ① 分配并初始化一個(gè)device descriptor。

        ② 通過調(diào)用tyDevInit()初始化tyLib。此處主要完成輸入/輸出ring buffer的創(chuàng)建、建立用與相關(guān)函數(shù)的信號(hào)量、初始化selectLib。

        ③ 調(diào)用iosDevAdd()將串口設(shè)備加入Device Table。對(duì)于設(shè)備特性的描述信息是由sysSerialChanGet()函數(shù)得到,并以參數(shù)形式傳入的。

        ④ 為底層設(shè)備安裝回調(diào)函數(shù),在本例中是為i8250CHAN 安裝tyIRd()、tyITx()兩處回調(diào)函數(shù)。

        ⑤ 開中斷,設(shè)備開始以中斷方式工作。

        至此,的分析全部完成。與掛接驅(qū)動(dòng)函數(shù)不同,在安裝設(shè)備的過程中,無論設(shè)備相同與否,有幾個(gè)設(shè)備則上述過程需調(diào)用幾次。以上各函數(shù)的加載主要在usrinit()函數(shù)中完成。

        3. 結(jié)束語

        需要說明的是,在VxWorks下,設(shè)備既可以嵌入內(nèi)核隨系統(tǒng)一起啟動(dòng),也可以作為可加載模塊在系統(tǒng)啟動(dòng)之后運(yùn)行。相比之下,后一種方式比較簡(jiǎn)單,不用修改系統(tǒng)內(nèi)核,引入錯(cuò)誤的可能性小。但是無論采取哪種方式,其基本思路及需要完成的工作是相同的。本文沒有按照系統(tǒng)的調(diào)用過程進(jìn)行一步步分析,主要基于上述考慮。用戶在編寫相關(guān)驅(qū)動(dòng)程序時(shí),中心任務(wù)是按步驟完成上述功能,而沒有必要去死搬系統(tǒng)的加載步驟。

        linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

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

        評(píng)論


        相關(guān)推薦

        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 溧水县| 平谷区| 临泽县| 天全县| 东丽区| 玛曲县| 太康县| 黄石市| 仁怀市| 阜平县| 齐齐哈尔市| 安阳县| 昆明市| 蕲春县| 襄城县| 确山县| 靖安县| 三明市| 铁力市| 庄河市| 临高县| 永春县| 昔阳县| 南木林县| 施甸县| 宝丰县| 昌平区| 南岸区| 长乐市| 乌兰县| 麻栗坡县| 漠河县| 定日县| 江门市| 桐庐县| 平阴县| 榕江县| 灵武市| 高碑店市| 六盘水市| 宣化县|