vxworks嵌入式操作系統(tǒng)串行設(shè)備驅(qū)動(dòng)程序的編寫-基礎(chǔ)電子_第1頁(yè)
vxworks嵌入式操作系統(tǒng)串行設(shè)備驅(qū)動(dòng)程序的編寫-基礎(chǔ)電子_第2頁(yè)
vxworks嵌入式操作系統(tǒng)串行設(shè)備驅(qū)動(dòng)程序的編寫-基礎(chǔ)電子_第3頁(yè)
vxworks嵌入式操作系統(tǒng)串行設(shè)備驅(qū)動(dòng)程序的編寫-基礎(chǔ)電子_第4頁(yè)
vxworks嵌入式操作系統(tǒng)串行設(shè)備驅(qū)動(dòng)程序的編寫-基礎(chǔ)電子_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

精品文檔-下載后可編輯vxworks嵌入式操作系統(tǒng)串行設(shè)備驅(qū)動(dòng)程序的編寫-基礎(chǔ)電子摘要:目前,基于嵌入式操作系統(tǒng)的軟件開(kāi)發(fā)是國(guó)內(nèi)外研究的熱點(diǎn),works嵌入式操作系統(tǒng)又是目前的嵌入式操作系統(tǒng)之一。本文的目的在于通過(guò)分析works操作系統(tǒng)下串行通信設(shè)備驅(qū)動(dòng)程序的運(yùn)行機(jī)制,提出在此操作系統(tǒng)下開(kāi)發(fā)串行設(shè)備驅(qū)動(dòng)程序開(kāi)發(fā)的基本思路。

1.概述

我們?cè)诨趙orks嵌入式操作系統(tǒng)開(kāi)發(fā)產(chǎn)品時(shí),經(jīng)常會(huì)根據(jù)自行設(shè)計(jì)的硬件電路開(kāi)發(fā)專用的驅(qū)動(dòng)程序。Vxworks下的驅(qū)動(dòng)程序根據(jù)設(shè)備的不同特性,,大體可分為:chardriver、serialdriver、blockdriver、enddriver、scsidriver等類型,其中以chardriver簡(jiǎn)單,基礎(chǔ),以serialdriver常用。掌握驅(qū)動(dòng)程序的基本工作流程,無(wú)論對(duì)我們開(kāi)發(fā)上層的應(yīng)用還是自己編寫相應(yīng)的驅(qū)動(dòng)程序,都很有幫助。本文主要以i8250串口驅(qū)動(dòng)程序?yàn)槔榻B一下串行驅(qū)動(dòng)程序編寫的基本思路。

驅(qū)動(dòng)程序,簡(jiǎn)而言之就是對(duì)具體的硬件設(shè)備進(jìn)行管理和服務(wù)的程序。為了提高代碼的可移植性,works將所有的輸入/輸出設(shè)備都看成是一個(gè)文件,我們對(duì)設(shè)備的輸入/輸出操作,都可以看作是對(duì)指定文件的讀寫操作。例如,我們用c標(biāo)準(zhǔn)庫(kù)函數(shù)open()打開(kāi)一個(gè)文件,可以是打開(kāi)一個(gè)傳統(tǒng)意義上的文本文件,也可以是指定一個(gè)輸入/輸出設(shè)備,如指定對(duì)某一個(gè)串口的輸入/輸出操作。在works操作系統(tǒng)中,驅(qū)動(dòng)程序的主要作用是完成對(duì)相關(guān)設(shè)備的讀、寫、打開(kāi)、建立、關(guān)閉及控制等功能中的一項(xiàng)或幾項(xiàng),具體情況視具體的設(shè)備及設(shè)計(jì)要求而定。

概括的說(shuō),驅(qū)動(dòng)程序主要完成以下幾項(xiàng)工作:

(1)相關(guān)設(shè)備的初始化。

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

(3)相關(guān)設(shè)備與對(duì)應(yīng)驅(qū)動(dòng)程序的掛接。

我們就按照這個(gè)思路,以I8250串口為例,分析一下串行設(shè)備驅(qū)動(dòng)程序的編寫及加載流程。首先,給出串行設(shè)備驅(qū)動(dòng)的結(jié)構(gòu)框圖:

需要說(shuō)明的是,ttyDrv是一個(gè)虛擬的設(shè)備驅(qū)動(dòng),與tylib一起,用于處理I/O系統(tǒng)與底層實(shí)際設(shè)備之間的通信。主要完成以下工作:

(1)處理I/O系統(tǒng)的各種需求,如在drivertalbe中添加相應(yīng)的驅(qū)動(dòng)條目、創(chuàng)建設(shè)備標(biāo)識(shí)符(devisedescriptor)。

(2)實(shí)現(xiàn)與上層標(biāo)準(zhǔn)I/O函數(shù)及實(shí)際驅(qū)動(dòng)程序的無(wú)縫連接。其中,ttyDrv完成open和ioctl兩項(xiàng)功能(ttyopen()和ttyioctl())。Tylib完成read和write兩項(xiàng)功能(tyRead()和tyWrite())。

(3)管理輸入/輸出數(shù)據(jù)緩沖區(qū)。

下面,我們結(jié)合圖(一)給出的框圖,以i8250為例,開(kāi)始分析串行設(shè)備驅(qū)動(dòng)的設(shè)計(jì)流程。用戶在編寫自己的驅(qū)動(dòng)程序時(shí),可以不按照系統(tǒng)函數(shù)命名的方法命名,也可以不按照系統(tǒng)給定的方法進(jìn)行函數(shù)功能的劃分,但其初始化及實(shí)現(xiàn)流程卻不能改變。

2.驅(qū)動(dòng)程序設(shè)計(jì)流程分析

⑴i8250相關(guān)硬件設(shè)備的初始化。

編寫驅(qū)動(dòng)程序的步是完成相關(guān)硬件的初始化。與I8250相關(guān)的硬件初始化函數(shù)主要有以下三個(gè):sysSerialHwInit()、i8250HrdInit()、i8250InitChannel(),其調(diào)用順序是:sysSerialHwInit()ài8250HrdInit()ài8250InitChannel(),這條工作鏈的主要作用是,完成對(duì)I8250_CHAN數(shù)據(jù)結(jié)構(gòu)的初始化。

下面對(duì)分別這幾個(gè)函數(shù)的功能介紹一下:

l

sysSerialHwInit()

本函數(shù)完成的主要任務(wù)是初始化設(shè)備的中斷向量、串口的通信模式及相關(guān)存貯器,在函數(shù)的調(diào)用i8250HrdInit()對(duì)I8250_CHAN結(jié)構(gòu)進(jìn)一步初始化。

voidsysSerialHwInit(void)

{

inti;

for(i=0;iN_UART_CHANNELS;i++)

{

i8250Chan[i].int_vec=devParas[i].vector;/*初始化中斷向量*/

i8250Chan[i].channelMode=0;/*初始化SIO_MODE可以是INT或POLL*/

i8250Chan[i].lcr=UART_REG(UART_LCR,i);/*初始化linecontrolregister*/

………

i8250Chan[i].outByte=sysOutByte;/*掛接輸出函數(shù),此函數(shù)向指定的I/O地址寫入1bye*/

i8250Chan[i].inByte=sysInByte;/*掛接輸出函數(shù),此函數(shù)從指定的I/O地址讀出1byte*/

i8250HrdInit(i8250Chan[i]);/*調(diào)用i8250HrdInit()進(jìn)一步完成初始化*/

}

}

li8250HrdInit()

本函數(shù)完成的主要工作是掛接相應(yīng)的入口函數(shù),具體說(shuō)明如下:

voidi8250HrdInit

(

I8250_CHAN*pChan/*指向相應(yīng)設(shè)備的指針*/

)

{

if(i8250SioDrvFuncs.ioctl==NULL)

{

i8250SioDrvFuncs.ioctl=(int(*)())i8250Ioctl;/*掛接用于處理控制I8250相關(guān)輸入

輸出命令的函數(shù)*/

i8250SioDrvFuncs.txStartup=(int(*)())i8250Startup;/*如果設(shè)備工作于中斷模式下,

啟用此函數(shù)用于打開(kāi)中斷,使設(shè)備開(kāi)始工作*/

i8250SioDrvFuncs.callbackInstall=i8250CallbackInstall;/*安裝上層提供的回調(diào)函數(shù),

本例中是安裝的tyIRd()、tyITx()*/

i8250SioDrvFuncs.pollInput=(int(*)())i8250PRxChar;/*掛接輸入輪詢函數(shù)*/

i8250SioDrvFuncs.pollOutput=(int(*)(SIO_CHAN*,char))i8250PTxChar;/*掛接輸出輪詢函數(shù)*/

}

pChan-pDrvFuncs=i8250SioDrvFuncs;/*初始化CHAN結(jié)構(gòu),掛接接口函數(shù)列表*/

i8250InitChannel(pChan);/*resetthechannel*/

}

由上面掛接的函數(shù)可以看出,i8250驅(qū)動(dòng)主要實(shí)現(xiàn)了三個(gè)功能:read、write、ioctl,而并沒(méi)有實(shí)現(xiàn)所有和七項(xiàng)功能。同時(shí),值的注意的是,對(duì)同一種設(shè)備的驅(qū)動(dòng)只需掛接。

同時(shí)ttyDrv通過(guò)SIO_DRV_FUNCS使用xxDrv(i8250Drv)提供的服務(wù),而xxDrv通過(guò)回調(diào)函數(shù)(本例中是由i8250CallbackInstall()安裝的tyIRd()、tyITx())完成ttyDrv提出的請(qǐng)求。原理如下圖示:

i8250InitChannel()

本函數(shù)的主要作用是初始化特定的CHAN所描述的信道。具體分析如下。

staticvoidi8250InitChannel

(

I8250_CHAN*pChan/*pointertodevice*/

)

{

intoldLevel;

ldLevel=intLock();/*關(guān)中斷進(jìn)入臨界區(qū)*

(void)i8250BaudSet(pChan,I8250_DEFAULT_BAUD);/*設(shè)置信道的波特率*/

…………………

intUnlock(oldLevel);/*開(kāi)中斷響應(yīng),出臨界區(qū)*/

}

⑵掛接中斷服務(wù)程序

對(duì)i8250的硬件初始化完成后,接著掛接相關(guān)的中斷服務(wù)程序。主要有sysSerialHwinit2()函數(shù)完成。需要注意的是,掛接中斷應(yīng)放在系統(tǒng)初始化的,主要是因?yàn)橹袛鄴旖雍瘮?shù)intConnect()需要調(diào)用malloc()函數(shù),如果在系統(tǒng)的內(nèi)存分配還未初始化前調(diào)用,則會(huì)出錯(cuò)。下面請(qǐng)看源代碼:

voidsysSerialHwInit2(void)

{

inti;

for(i=0;iN_UART_CHANNELS;i++)

if(i8250Chan[i].int_vec)

{

(void)intConnect(INUM_TO_IVEC(i8250Chan[i].int_vec),i8250Int,(int)i8250Chan[i]);

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ù)的掛接、中斷初始化基本完成。開(kāi)始進(jìn)行下一步,將設(shè)備的驅(qū)動(dòng)函數(shù)安裝在DriverTable中。

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

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

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

①當(dāng)用戶調(diào)用write函數(shù)進(jìn)行寫操作時(shí),根據(jù)相應(yīng)的fd調(diào)用在DriverTable中注冊(cè)的函數(shù)tyWrite(),此函數(shù)的作用是將用戶緩沖區(qū)的內(nèi)容寫入相應(yīng)的輸出ringbuffer,當(dāng)發(fā)現(xiàn)緩沖區(qū)內(nèi)有內(nèi)容時(shí),開(kāi)始調(diào)用回調(diào)函數(shù)tyITX(),從ringbuffer讀取字符,由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)容讀入ringbuffer,當(dāng)用戶調(diào)用read函數(shù)進(jìn)行寫操作時(shí),會(huì)根據(jù)相應(yīng)的fd調(diào)用在DriverTable中注冊(cè)的函數(shù)tyRead(),此函數(shù)會(huì)將ringbuffer中的內(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ì)思路無(wú)緊密的聯(lián)系,本文也不做具體分析。

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

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

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

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

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

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

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

至此,驅(qū)動(dòng)程序的分析全部

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論