當(dāng)前位置:首頁 > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]VxWorks下PC/104-CAN驅(qū)動程序設(shè)計

 摘要:詳細(xì)介紹實時多任務(wù)操作系統(tǒng)VxWorks環(huán)境下驅(qū)動程序的設(shè)計原理;針對驅(qū)動程序?qū)崿F(xiàn)的困難,給出VxWorks下實現(xiàn)驅(qū)動程序的工作步驟。文件以PC/104-CAN適配卡為例,簡要介紹硬件結(jié)構(gòu),重點給出驅(qū)動程序?qū)崿F(xiàn)的關(guān)鍵代碼。

    關(guān)鍵詞:RTOS VxWorks PC/104 CAN I/O系統(tǒng) 驅(qū)動系統(tǒng)

VxWorks是一款優(yōu)秀的實時多任務(wù)操作系統(tǒng),具有搶占式調(diào)試、中斷延遲小等特點。本文在簡要介紹必備的硬件環(huán)境下,以VxWorks為平臺,詳細(xì)介紹驅(qū)動程序的開發(fā)。

1 PC/104-CAN適配卡的硬件結(jié)構(gòu)

PC/104-CAN適配卡主要由CAN控制器(SJA1000)、光電隔離(6N137),收發(fā)驅(qū)動器(82C250)及譯碼電路組成。編程主要了解的是控制器SJA1000。CAN適配卡原理如圖1所示。

2 CAN地址譯碼和中斷選擇

系統(tǒng)104主板的CPU為486DX,其對接口板訪問有兩種方式:內(nèi)存映射和I/O訪問。I/O尋址采用專門的指令,每次只能傳送單個字節(jié)。內(nèi)存映射方式可以訪問較大的地址空間并且指令豐富,便于實現(xiàn)快速交換數(shù)據(jù)。本文討論的CAN卡采用存映射模式工作,與486DX接口是104總線,它與ISA總線兼容。對于Intel X86體系的CPU,ISA可以映射的空間為0xC8000~0xEFFFF。使用比較器和地址選擇開關(guān)組成可選端口地址譯碼電路,通過開關(guān)選通內(nèi)存映射基地址(C8000H、C9000H、CA000H、…、EF000H),以避免與其它器件沖突。CAN偏移地址分配如下:

00~FFH SJA1000的寄存器;

100H~1FFH 對該范圍內(nèi)的任意地址進(jìn)行寫操作,均可導(dǎo)致CAN硬件復(fù)位。

SJA1000的INT引腳通過跳線選擇IRQ3~7、IRQ9~12或IRQ15中的一個,避免與其它的適配卡沖突。

3 PC/104-CAN適配卡驅(qū)動實現(xiàn)

3.1 VxWorks驅(qū)動概述

VxWorks操作系統(tǒng)有兩種方式實現(xiàn)驅(qū)動。第一種方式是,把設(shè)備驅(qū)動程序作為獨立任務(wù)實現(xiàn),直接在頂層任務(wù)中實現(xiàn)硬件操作,完成特有專用的驅(qū)動程序。第二種方式是,VxWorks的I/O系統(tǒng)將設(shè)備程序作為內(nèi)核過程實現(xiàn)。這種方式便于實現(xiàn)I/O子系統(tǒng)的層次模型,便于文件系統(tǒng)一起把設(shè)備作為特殊文件處理,提供統(tǒng)一的管理、統(tǒng)一的界面和統(tǒng)一的使用方法,并把設(shè)備、文件及網(wǎng)絡(luò)通信組織成為一致的更高層次的抽象,為用戶提供統(tǒng)一的系統(tǒng)服務(wù)和用戶接口。我們和這種驅(qū)動方式。

    作為I/O系統(tǒng)和硬件設(shè)備之間的連接層,VxWorks驅(qū)動就是屏蔽硬件操作,為I/O系統(tǒng)提供服務(wù)。實現(xiàn)一個完整的驅(qū)動,必須了解VxWorks下I/O的三個基本元素:File、Driver和Dervice。File是為用戶提供訪問設(shè)備的統(tǒng)一接口;Driver是實現(xiàn)具體的基本控制函數(shù),也就是實現(xiàn)I/O系統(tǒng)所需要的接口;而Device則是一個抽象的硬件設(shè)備,是一系列的結(jié)構(gòu)體、變量和宏定義對實際物理設(shè)備的定義。一般而言,實現(xiàn)一個驅(qū)動應(yīng)該有三個基本的步驟:①用編程語言完成對實際物理設(shè)備的抽象;②完成系統(tǒng)所需要的各類接口及自身的特殊接口;③將驅(qū)動集成到操作系統(tǒng)中。之后還有一些調(diào)試工作。

3.2 VxWorks I/O系統(tǒng)驅(qū)動程序框架

VxWorks為各種設(shè)備(包括字符設(shè)備、塊設(shè)備、虛擬設(shè)備及網(wǎng)絡(luò)設(shè)備)提供統(tǒng)一的訪問接口,包括七種基本的I/O函數(shù):open(filename、flags、mode),create(filename、flags),read(fd、&buf、nBytes),write(fd、&buf、nBytes),ioctl(fd、command、arg),close(fd)及remove(filename)。I/O系統(tǒng)所起的作用就是,把用戶請求分配到與設(shè)備對應(yīng)的驅(qū)動例程中去。VxWorks系統(tǒng)中有一個驅(qū)動程序列表,其形式如表1所列。

表1 設(shè)備驅(qū)動列表(調(diào)試時可利用iosDrvShow()查看)

驅(qū)動號碼 create remove open close read write ioctl
1              
2 ca Open NULL ca Open ca Close ca Read ca Write ca Ioctl

I/O系統(tǒng)的可動態(tài)調(diào)用iosDrvInstall()函數(shù)將設(shè)備的驅(qū)動例程(即XXOpen()、XXClose()、XXRead()等)加入到設(shè)備驅(qū)動列表中,如圖2所示。

同樣,系統(tǒng)中有一個設(shè)備列表,每個設(shè)備對應(yīng)于設(shè)備列表中的一項,每一項包括設(shè)備名稱和設(shè)備驅(qū)動號,同時包括一個設(shè)備描述的結(jié)構(gòu)。該結(jié)構(gòu)第一個變量是DEV_HDR類型的變量DEV_HDR。

DEV_HDR的定義如下:

Typedef struct

{

DL_NODE node; /*設(shè)備列表節(jié)點*/

short drvNum; /*驅(qū)動號碼*/

char *name; /*設(shè)備名*/

}DEV_HDR;

系統(tǒng)調(diào)用iosDevAdd(),可以將設(shè)備加入到設(shè)備列表中。系統(tǒng)中將驅(qū)動和設(shè)備聯(lián)系起來的就是文件描述符列表,每個文件描述符列表除了包括驅(qū)動號、設(shè)備ID外,還包括文件名、可用標(biāo)志和指向DEV_HDR的指針。系統(tǒng)每次成功執(zhí)行open(),返回一個文件描述符,這樣對于設(shè)備的read()、write()及ioctl()就可以通過文件描述符進(jìn)行。

文件描述符表(調(diào)試時調(diào)用iosFdShow()查看)如下:

I/O系統(tǒng)的整體結(jié)構(gòu)如圖3所示。系統(tǒng)啟動時(一般掛接在usrroot()),XXDrv()和XXDevCreade()便將設(shè)備及其驅(qū)動加入相應(yīng)的列表中。

3.3 設(shè)備驅(qū)動程序的訪問過程

下面以CAN驅(qū)動程序為例,說明驅(qū)動程序的訪問過程。(假定設(shè)備名“/can/1”并且以CAN設(shè)備驅(qū)動程序為例,上述中的XX在這里用Can代替。)

①fd=open(“/can/1”,O_RDWR,0644)

②I/O系統(tǒng)在設(shè)備列表中尋找設(shè)備名為/can/1的設(shè)備項,找到相應(yīng)的設(shè)備驅(qū)動號。

③I/O系統(tǒng)在文件描述符中保留一個文件描述符空間。

④I/O系統(tǒng)在設(shè)備驅(qū)動列表中找到對應(yīng)的CanOpen(CAN_DEV*PCAN_DEV,UBYTE*remainder,int flags),該驅(qū)動例程返回設(shè)備描述符的指針。

⑤I/O系統(tǒng)將設(shè)備描述符的指針存儲在文件描述符列表的Device ID,同時將對應(yīng)的設(shè)備驅(qū)動號存儲在文件描述符的Driver num項。最后I/O系統(tǒng)返回該描述符項的索引(即為fd)。

⑥這樣應(yīng)用程序中的read()和write()等函數(shù)調(diào)用就可以根據(jù)fd找到相應(yīng)的設(shè)備驅(qū)動號,進(jìn)而找到相應(yīng)的驅(qū)動例程。

4 CAN驅(qū)動程序的實現(xiàn)

CAN驅(qū)動程序的實現(xiàn)即是完成下面七個函數(shù)的編寫。下面簡要介紹其完成的功能,并用偽指令進(jìn)行說明。

int drv_num; ;/*驅(qū)動號碼*/

typedef struct {

DEV_HDR pCANHDR; /*這個數(shù)據(jù)結(jié)構(gòu)必須放在設(shè)備描述符的最初部分*/

/*其余與驅(qū)動有關(guān)數(shù)據(jù)*/

}CAN_DEV; /*CAN設(shè)備描述符*/

CAN_DEV can_chan_dev;

STATUS CanDrv(void){

完成驅(qū)動的一些初始化;

intconnect(); /*連接所選的IRQ與中斷處理函數(shù)*/

sysIntEnablePIC(); /*486DX允許中斷*/

drv_num=iosDrvInstall(CanOpen,NULL,CanOpen,CanClose,CanRead,CanWrite,CanIoctl);/*將設(shè)備驅(qū)動例程裝入設(shè)備列表中*/

}

/*iosDrvInstall()將設(shè)備的CAN驅(qū)動例程加入設(shè)備驅(qū)動列表中,7個參數(shù)為7個驅(qū)動例程的進(jìn)入點(entry point),如果沒有某個例程,則傳遞NULL。*/

STATUS CanDevCreate(){

完成一些設(shè)備初始化

iosDevAdd (&Can_chan_dev.pCANHDR,“can0”,drv_num);/*將設(shè)備放入設(shè)備驅(qū)動列表中*/

}

int CanOpen(CAN_DEV *pCan_Dev,UBYTE *remainder,int flags){

CAN卡硬件復(fù)位

CAN卡關(guān)中斷

CAN卡進(jìn)入軟件復(fù)位模式

設(shè)置CAN卡工作寄存器,如接收碼寄存器和屏蔽碼寄存器等

CAN卡開中斷和進(jìn)入操作模式

Return((int)pCan_Dev); /*注意必須返回設(shè)備描述結(jié)構(gòu)指針*/

}

int CanRead(int CAN_DEV_ID,UBYTE * buf,int nBytes){

等待信號量(該信號量由中斷處理例程釋放)

從接收緩沖區(qū)讀取數(shù)據(jù)

釋放接收緩沖

返回接收數(shù)據(jù)數(shù)量

}

int CanWrite(int CAN_DEV_ID,UBYTE* buf,int nbyte){

查詢發(fā)送緩沖是否可用

向發(fā)送緩沖區(qū)寫數(shù)據(jù)

命令發(fā)送

查詢發(fā)送完成標(biāo)志

返回發(fā)送數(shù)據(jù)數(shù)量

}

void interrupt_handle_routin(int arg){

處理中斷事件

發(fā)送(釋放)信號量

}

限于篇幅,其它函數(shù)略。

圖3 I/O系統(tǒng)整體結(jié)構(gòu)

5 CAN驅(qū)動調(diào)試

硬件驅(qū)動的調(diào)試是件十分麻煩的事,經(jīng)驗十分重要。這里簡要介紹幾個幫助調(diào)試的函數(shù)。

①可以調(diào)用iosDrvShow()、iosDevShow()及iosFdShow()查看相關(guān)內(nèi)容,判斷并將驅(qū)動及設(shè)備中入相應(yīng)列表。

②使用logMsg()現(xiàn)實相關(guān)內(nèi)容,以定位錯誤。

初期調(diào)試,示波器和信號燈是非常有用的,可以確定硬件的工作狀況,從而有助于發(fā)現(xiàn)程序中的錯誤。

6 小結(jié)

筆者采用兩種方式完成了CAN卡驅(qū)動。相對于第一種(筆者亦完成),第二種方式——VxWorks的I/O系統(tǒng)將設(shè)備程序作為內(nèi)核過程實現(xiàn),大大減少了系統(tǒng)的開銷,實時性和可靠性有了很大的提高,并且為用戶提供了統(tǒng)一的接口,使用十分方便。

開發(fā)驅(qū)動程序,輔助工具是非常有用的。Windows下的開發(fā)工具就比較多,而在VxWorks下開發(fā)驅(qū)動的工具相對較少。Windriver是一款不錯的開發(fā)工具,可以開發(fā)VxWorks下的驅(qū)動程序(也可以開發(fā)其它操作系統(tǒng)下的驅(qū)動程序)。正確、熟練地使用這些輔助工具,會使開發(fā)工作事半功倍。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉