国产毛片a精品毛-国产毛片黄片-国产毛片久久国产-国产毛片久久精品-青娱乐极品在线-青娱乐精品

VxWorks下PC/104-CAN驅動程序設計

發(fā)布時間:2010-2-28 09:07    發(fā)布者:qgq
關鍵詞: VxWorks , 程序設計 , 驅動
1 PC/104-CAN適配卡的硬件結構

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



2 CAN地址譯碼和中斷選擇

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

00~FFH SJA1000的寄存器;
100H~1FFH 對該范圍內的任意地址進行寫操作,均可導致CAN硬件復位。
SJA1000的INT引腳通過跳線選擇IRQ3~7、IRQ9~12或IRQ15中的一個,避免與其它的適配卡沖突。

3 PC/104-CAN適配卡驅動實現

3.1 VxWorks驅動概述

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



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

3.2 VxWorks I/O系統驅動程序框架

VxWorks為各種設備(包括字符設備、塊設備、虛擬設備及網絡設備)提供統一的訪問接口,包括七種基本的I/O函數: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系統所起的作用就是,把用戶請求分配到與設備對應的驅動例程中去。VxWorks系統中有一個驅動程序列表,其形式如表1所列。

表1 設備驅動列表(調試時可利用iosDrvShow()查看)
驅動號碼createremoveopenclosereadwriteioctl
1       
2ca OpenNULLca Openca Closeca Readca Writeca Ioctl


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

同樣,系統中有一個設備列表,每個設備對應于設備列表中的一項,每一項包括設備名稱和設備驅動號,同時包括一個設備描述的結構。該結構第一個變量是DEV_HDR類型的變量DEV_HDR。
DEV_HDR的定義如下:
Typedef struct
{
DL_NODE node; /*設備列表節(jié)點*/
short drvNum; /*驅動號碼*/
char *name; /*設備名*/
}DEV_HDR;

系統調用iosDevAdd(),可以將設備加入到設備列表中。系統中將驅動和設備聯系起來的就是文件描述符列表,每個文件描述符列表除了包括驅動號、設備ID外,還包括文件名、可用標志和指向DEV_HDR的指針。系統每次成功執(zhí)行open(),返回一個文件描述符,這樣對于設備的 read()、write()及ioctl()就可以通過文件描述符進行。
文件描述符表(調試時調用iosFdShow()查看)如下:



I/O系統的整體結構如圖3所示。系統啟動時(一般掛接在usrroot()),XXDrv()和XXDevCreade()便將設備及其驅動加入相應的列表中。

3.3 設備驅動程序的訪問過程

下面以CAN驅動程序為例,說明驅動程序的訪問過程。(假定設備名“/can/1”并且以CAN設備驅動程序為例,上述中的XX在這里用Can代替。)
①fd=open(“/can/1”,O_RDWR,0644)
②I/O系統在設備列表中尋找設備名為/can/1的設備項,找到相應的設備驅動號。
③I/O系統在文件描述符中保留一個文件描述符空間。
④I/O系統在設備驅動列表中找到對應的CanOpen(CAN_DEV*PCAN_DEV,UBYTE*remainder,int flags),該驅動例程返回設備描述符的指針。
⑤I/O系統將設備描述符的指針存儲在文件描述符列表的Device ID,同時將對應的設備驅動號存儲在文件描述符的Driver num項。最后I/O系統返回該描述符項的索引(即為fd)。
⑥這樣應用程序中的read()和write()等函數調用就可以根據fd找到相應的設備驅動號,進而找到相應的驅動例程。

4 CAN驅動程序的實現

CAN驅動程序的實現即是完成下面七個函數的編寫。下面簡要介紹其完成的功能,并用偽指令進行說明。
int drv_num; ;/*驅動號碼*/
typedef struct {
DEV_HDR pCANHDR; /*這個數據結構必須放在設備描述符的最初部分*/
/*其余與驅動有關數據*/
}CAN_DEV; /*CAN設備描述符*/
CAN_DEV can_chan_dev;
STATUS CanDrv(void){
完成驅動的一些初始化;
intconnect(); /*連接所選的IRQ與中斷處理函數*/
sysIntEnablePIC(); /*486DX允許中斷*/
drv_num=iosDrvInstall(CanOpen,NULL,CanOpen,CanClose,CanRead,CanWrite,CanIoctl);/*將設備驅動例程裝入設備列表中*/
}
/*iosDrvInstall()將設備的CAN驅動例程加入設備驅動列表中,7個參數為7個驅動例程的進入點(entry point),如果沒有某個例程,則傳遞NULL。*/
STATUS CanDevCreate(){
完成一些設備初始化
iosDevAdd (&Can_chan_dev.pCANHDR,“can0”,drv_num);/*將設備放入設備驅動列表中*/
}
int CanOpen(CAN_DEV *pCan_Dev,UBYTE *remainder,int flags){
CAN卡硬件復位
CAN卡關中斷
CAN卡進入軟件復位模式
設置CAN卡工作寄存器,如接收碼寄存器和屏蔽碼寄存器等
CAN卡開中斷和進入操作模式
Return((int)pCan_Dev); /*注意必須返回設備描述結構指針*/
}
int CanRead(int CAN_DEV_ID,UBYTE * buf,int nBytes){
等待信號量(該信號量由中斷處理例程釋放)
從接收緩沖區(qū)讀取數據
釋放接收緩沖
返回接收數據數量
}
int CanWrite(int CAN_DEV_ID,UBYTE* buf,int nbyte){
查詢發(fā)送緩沖是否可用
向發(fā)送緩沖區(qū)寫數據
命令發(fā)送
查詢發(fā)送完成標志
返回發(fā)送數據數量
}
void interrupt_handle_routin(int arg){
處理中斷事件
發(fā)送(釋放)信號量
}
限于篇幅,其它函數略。

圖3 I/O系統整體結構

5 CAN驅動調試

硬件驅動的調試是件十分麻煩的事,經驗十分重要。這里簡要介紹幾個幫助調試的函數。
①可以調用iosDrvShow()、iosDevShow()及iosFdShow()查看相關內容,判斷并將驅動及設備中入相應列表。
②使用logMsg()現實相關內容,以定位錯誤。

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

6 小結

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

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

參考文獻

   1. WindRiver System Inc Vxworks Programmer' sGuide 5 1998
   2. 楊憲惠 現場總線技術及其應用 1999
   3. 鄔寬明 CAN總線原理和應用系統設計 1996
   4. 孔祥營 嵌入式實時操作系統VxWorks及開發(fā)環(huán)境Tornado 2001

作 者: 西北工業(yè)大學 解月工 秦龍勇 謝拴勤
            中國民航飛行學院 彭衛(wèi)東  
來 源: 單片機與嵌入式系統應用
本文地址:http://www.qingdxww.cn/thread-8579-1-1.html     【打印本頁】

本站部分文章為轉載或網友發(fā)布,目的在于傳遞和分享信息,并不代表本網贊同其觀點和對其真實性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問題,我們將根據著作權人的要求,第一時間更正或刪除。
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

廠商推薦

  • Microchip視頻專區(qū)
  • PIC18-Q71系列MCU概述
  • 無線充電基礎知識及應用培訓教程3
  • 5分鐘詳解定時器/計數器E和波形擴展!
  • 想要避免發(fā)生災難,就用MPLAB® SiC電源仿真器!
  • 貿澤電子(Mouser)專區(qū)

相關視頻

關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
快速回復 返回頂部 返回列表
主站蜘蛛池模板: 野外做受三级视频 | 在线毛片一区二区不卡视频 | 亚洲欧美在线视频观看 | 2020久久 | 亚洲成人毛片 | 美女伊人网 | 日韩 欧美 中文字幕 不卡 | 色婷婷综合在线视频最新 | 亚洲天堂精品在线观看 | 无人视频完整免费版视频观看下载 | 日韩美女视频在线观看 | 欧美一级特黄aaa大片 | 一级黄色片a | 国产国拍亚洲精品福利 | 亚洲情a成黄在线观看动 | 男女做羞羞的视频 | bytv跳转接口点击进入网页 | 欧美日韩国产中文字幕 | 本道久久综合88全国最大色 | 正在播放日韩 | 狠狠的日视频 | 日本综合在线观看 | 精品一区二区三区视频在线观看 | 成人黄app福利网站大全 | 欧美日韩麻豆 | 天天操天天干天天操 | 91大神在线精品视频一区 | 四虎影视在线观看 | 国产在线色站 | 奇米一区 | 特黄aa级毛片免费视频播放 | 国产区一区二区三区 | 久久99综合 | 亚洲综合色就色手机在线观看 | 四虎精品视频在线永久免费观看 | 日韩欧美在线中文字幕 | 色综合狠狠 | 亚洲国产精品欧美综合 | 一级做a爰片久久毛片16 | 成人久久18网站 | 青青草华人在线 |