0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

基于VxWorks操作系統(tǒng)實(shí)現(xiàn)PC/104-CAN適配卡的驅(qū)動(dòng)系統(tǒng)設(shè)計(jì)

電子設(shè)計(jì) ? 來(lái)源:?jiǎn)纹瑱C(jī)與嵌入式系統(tǒng)應(yīng)用 ? 作者:解月工,秦龍勇, ? 2020-09-08 17:51 ? 次閱讀

來(lái)源:單片機(jī)嵌入式系統(tǒng)應(yīng)用,作者:解月工,秦龍勇,謝拴勤,彭衛(wèi)東

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

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

基于VxWorks操作系統(tǒng)實(shí)現(xiàn)PC/104-CAN適配卡的驅(qū)動(dòng)系統(tǒng)設(shè)計(jì)

2 CAN地址譯碼和中斷選擇

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

00~FFH SJA1000的寄存器

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

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

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

3.1 VxWorks驅(qū)動(dòng)概述

VxWorks操作系統(tǒng)有兩種方式實(shí)現(xiàn)驅(qū)動(dòng)。第一種方式是,把設(shè)備驅(qū)動(dòng)程序作為獨(dú)立任務(wù)實(shí)現(xiàn),直接在頂層任務(wù)中實(shí)現(xiàn)硬件操作,完成特有專用的驅(qū)動(dòng)程序。第二種方式是,VxWorks的I/O系統(tǒng)將設(shè)備程序作為內(nèi)核過(guò)程實(shí)現(xiàn)。這種方式便于實(shí)現(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ū)動(dòng)方式。

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

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

VxWorks為各種設(shè)備(包括字符設(shè)備、塊設(shè)備、虛擬設(shè)備及網(wǎng)絡(luò)設(shè)備)提供統(tǒng)一的訪問(wèn)接口,包括七種基本的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)所起的作用就是,把用戶請(qǐng)求分配到與設(shè)備對(duì)應(yīng)的驅(qū)動(dòng)例程中去。VxWorks系統(tǒng)中有一個(gè)驅(qū)動(dòng)程序列表,其形式如表1所列。

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

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

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

DEV_HDR的定義如下:

Typedef struct

{

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

short drvNum; /*驅(qū)動(dòng)號(hào)碼*/

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

}DEV_HDR;

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

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

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

3.3 設(shè)備驅(qū)動(dòng)程序的訪問(wèn)過(guò)程

下面以CAN驅(qū)動(dòng)程序?yàn)槔?,說(shuō)明驅(qū)動(dòng)程序的訪問(wèn)過(guò)程。(假定設(shè)備名“/can/1”并且以CAN設(shè)備驅(qū)動(dòng)程序?yàn)槔?,上述中的XX在這里用Can代替。)

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

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

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

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

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

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

4 CAN驅(qū)動(dòng)程序的實(shí)現(xiàn)

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

int drv_num; ;/*驅(qū)動(dòng)號(hào)碼*/

typedef struct {

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

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

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

CAN_DEV can_chan_dev;

STATUS CanDrv(void){

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

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

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

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

}

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

STATUS CanDevCreate(){

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

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

}

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){

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

從接收緩沖區(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ā)送(釋放)信號(hào)量

}

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

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

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

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

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

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

6 小結(jié)

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

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

責(zé)任編輯:gt

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 驅(qū)動(dòng)器
    +關(guān)注

    關(guān)注

    51

    文章

    7997

    瀏覽量

    145007
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    15879

    瀏覽量

    175342
  • 操作系統(tǒng)
    +關(guān)注

    關(guān)注

    37

    文章

    6545

    瀏覽量

    122731
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    什么是VxWorks操作系統(tǒng)

    VxWorksVxWorks操作系統(tǒng)是美國(guó)WindRiver公司于1983年設(shè)計(jì)開發(fā)的一種實(shí)時(shí)操作系統(tǒng)。VxWorks擁有良好的持續(xù)發(fā)展能力、高性能的內(nèi)核以及良好的用戶開發(fā)環(huán)境,在實(shí)時(shí)操作系統(tǒng)
    發(fā)表于 06-07 14:17

    VxWorks系統(tǒng)CompactPCI總線怎么控制?

    ,硬件平臺(tái)為PC104+架構(gòu)。這里提出一種VxWorks操作系統(tǒng)下ComPactPCI總線驅(qū)動(dòng)程序的設(shè)計(jì)及
    發(fā)表于 08-29 06:13

    求一種CAN適配卡驅(qū)動(dòng)程序的設(shè)計(jì)方案

    CAN總線技術(shù)CAN適配卡驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn)基于WinCE環(huán)境的CAN
    發(fā)表于 04-23 06:43

    如何利用VxWorks操作系統(tǒng)實(shí)現(xiàn)PC/104-CAN適配卡驅(qū)動(dòng)系統(tǒng)設(shè)計(jì)

    求一種基于VxWorks操作系統(tǒng)實(shí)現(xiàn)PC/104-CAN適配卡
    發(fā)表于 04-28 06:17

    VxWorksPC/104-CAN驅(qū)動(dòng)程序設(shè)計(jì)

    詳細(xì)介紹實(shí)時(shí)多任務(wù)操作系統(tǒng)VxWorks環(huán)境下驅(qū)動(dòng)程序的設(shè)計(jì)原理;針對(duì)驅(qū)動(dòng)程序實(shí)現(xiàn)的困難,給出VxWor
    發(fā)表于 04-16 09:40 ?12次下載

    基于USB的CAN適配卡的設(shè)計(jì)與實(shí)現(xiàn)

    本文論述了CAN 總線系統(tǒng)CAN 適配卡的重要作用,在分析其他CAN 適配卡
    發(fā)表于 08-05 09:16 ?16次下載

    VxWorks操作系統(tǒng)下CF驅(qū)動(dòng)程序的開發(fā)

    描述了如何在VxWorks操作系統(tǒng)下進(jìn)行CF訪問(wèn)和創(chuàng)建CFIDE驅(qū)動(dòng)程序的方法,在系統(tǒng)
    發(fā)表于 08-21 08:35 ?27次下載

    Linux操作系統(tǒng)實(shí)現(xiàn)了在PC104 上的裁減和移植

    論文簡(jiǎn)要分析了Linux 操作系統(tǒng)啟動(dòng)過(guò)程,介紹了Busybox、MiniGUI 等優(yōu)秀的嵌入式專用軟件,以及以PC104 主板和CF(CompactFlash)構(gòu)建帶圖象用戶界面(GUI)的嵌入式Linux
    發(fā)表于 06-24 15:37 ?31次下載

    基于CP2102高速USB2.0-CAN適配卡的設(shè)計(jì)

    基于CP2102高速USB2.0-CAN適配卡的設(shè)計(jì) 基于橋接芯片CP2102,設(shè)計(jì)了USB2.0-CAN適配卡。系統(tǒng)采用USB和
    發(fā)表于 04-22 18:34 ?3311次閱讀
    基于CP2102高速USB2.0-<b class='flag-5'>CAN</b><b class='flag-5'>適配卡</b>的設(shè)計(jì)

    基于WinCE環(huán)境的CAN適配卡驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn)

    基于WinCE環(huán)境的CAN適配卡驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn) WinCE是一種為多種嵌入式系統(tǒng)和產(chǎn)品設(shè)計(jì)的緊湊、高效、可升級(jí)的
    發(fā)表于 10-26 09:04 ?987次閱讀

    VxWorks操作系統(tǒng)指南

    1.VxWorks操作系統(tǒng)概述 4 1.1.VxWorks 操作系統(tǒng)簡(jiǎn)介 4 1.2.VxWorks操作
    發(fā)表于 05-27 16:45 ?72次下載

    PC104總線實(shí)現(xiàn)VxWorks板載支持包BSP

    設(shè)計(jì)開發(fā)了嵌入式實(shí)時(shí)操作系統(tǒng)VxWorks 的一種基于PC104 總線的板載支持包, 完成了相關(guān)的外圍驅(qū)動(dòng)程序設(shè)計(jì)和調(diào)試工作。
    發(fā)表于 09-07 16:09 ?54次下載
    <b class='flag-5'>PC104</b>總線<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>VxWorks</b>板載支持包BSP

    基于WinCE環(huán)境的CAN適配卡驅(qū)動(dòng)程序的設(shè)計(jì)與實(shí)現(xiàn)

    本文簡(jiǎn)要介紹了嵌入式實(shí)時(shí)操作系統(tǒng)WinCE環(huán)境下驅(qū)動(dòng)程序的設(shè)計(jì)原理和CAN總線技術(shù)并詳細(xì)分析了依托PC/104總線的
    發(fā)表于 03-29 14:25 ?3次下載

    基于VxWorks操作系統(tǒng)下光纖通道通信軟件的實(shí)現(xiàn)

    基于VxWorks操作系統(tǒng)下光纖通道通信軟件的實(shí)現(xiàn)
    發(fā)表于 08-31 17:08 ?4次下載
    基于<b class='flag-5'>VxWorks</b><b class='flag-5'>操作系統(tǒng)</b>下光纖通道通信軟件的<b class='flag-5'>實(shí)現(xiàn)</b>

    VxWorks操作系統(tǒng)下CompactPCI總線驅(qū)動(dòng)程序的設(shè)計(jì)

    VxWorks操作系統(tǒng)下CompactPCI總線驅(qū)動(dòng)程序的設(shè)計(jì)(電源技術(shù)應(yīng)用 期刊)-該文檔為VxWorks操作系統(tǒng)下CompactPCI總
    發(fā)表于 08-31 16:09 ?17次下載
    <b class='flag-5'>VxWorks</b><b class='flag-5'>操作系統(tǒng)</b>下CompactPCI總線<b class='flag-5'>驅(qū)動(dòng)</b>程序的設(shè)計(jì)