基于實(shí)時操作系統(tǒng)VxWorks的CAN驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)_第1頁
基于實(shí)時操作系統(tǒng)VxWorks的CAN驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)_第2頁
基于實(shí)時操作系統(tǒng)VxWorks的CAN驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)_第3頁
基于實(shí)時操作系統(tǒng)VxWorks的CAN驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)_第4頁
基于實(shí)時操作系統(tǒng)VxWorks的CAN驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)_第5頁
已閱讀5頁,還剩12頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、收稿日期:2005204218;修返日期:2005206214基金項(xiàng)目:國防預(yù)研資助項(xiàng)目(417010402基于實(shí)時操作系統(tǒng)Vx Wo rks 的CA N 驅(qū)動設(shè)計(jì)與實(shí)現(xiàn)3徐美榮,蔡銘,董金祥(浙江大學(xué)計(jì)算機(jī)科學(xué)與技術(shù)學(xué)院,浙江杭州310027摘要:設(shè)備驅(qū)動設(shè)計(jì)是嵌入式系統(tǒng)開發(fā)的難點(diǎn)。針對本系統(tǒng)可靠性和實(shí)時性要求嚴(yán)格的特點(diǎn),在詳細(xì)分析Vx Works 實(shí)時操作系統(tǒng)設(shè)備驅(qū)動機(jī)制的基礎(chǔ)上,通過采用內(nèi)核過程的方式實(shí)現(xiàn)了Vx Works 下CAN 設(shè)備驅(qū)動,達(dá)到了預(yù)期的目標(biāo)。所給出的Vx Works 下設(shè)備驅(qū)動設(shè)計(jì)的一般步驟為Vx Works 其他設(shè)備驅(qū)動開發(fā)提供了參考。關(guān)鍵詞:Vx Works;實(shí)時

2、操作系統(tǒng);內(nèi)核過程;設(shè)備驅(qū)動;CAN 總線中圖法分類號:TP311111文獻(xiàn)標(biāo)識碼:A 文章編號:100123695(20060520185204Design and I m p lementati on of CAN D river Based on Real 2Ti m e Operati on Syste m Vx WorksXU Mei 2r ong,C A IM ing,DONG J in 2xiang(College of Co m puter Science &Technology,Zhejiang U niversity,Hangzhou Zhejiang 310027

3、,China Abstract:Design of device 2driver is a difficult task in e mbedded 2syste m s devel op ing .Considering the de mand of reliabilityand near real 2ti m e of this syste m,the mechanis m of device 2driver based on RT OS of Vx Works is analyzed firstly,then the de 2vice 2driver of CAN bus is i m p

4、 le mented by using kernel 2p r ocess technique .Thr ough thismethod,expectant perfor mance of tar 2get syste m is achieved .The general p r ocess of device 2driver 2design used in this paper can be refered by others device 2driver 2devel op ing based on Vx Works .Key words:Vx Works;RT OS;Kernel 2Pr

5、 ocess;Device D river;CAN Bus1引言目前,嵌入式系統(tǒng)的開發(fā)越來越受到重視,嵌入式產(chǎn)品的應(yīng)用越來越廣泛。開發(fā)所采用的操作系統(tǒng)中,Vx Works 是比較受歡迎的一種。Vx Works 是由W indR iver 公司開發(fā)的具有工業(yè)領(lǐng)導(dǎo)地位的高性能實(shí)時操作系統(tǒng)(Real 2Ti m e Operati on Syste m,RT OS ,是一個具有可伸縮、可裁剪和高可靠性,同時適用于所有主流CP U 目標(biāo)平臺的實(shí)時操作系統(tǒng)。Vx Works 的微內(nèi)核W ind 是一個具有較高性能的、標(biāo)準(zhǔn)的嵌入式實(shí)時操作系統(tǒng)內(nèi)核。其主要特點(diǎn)包括快速多任務(wù)切換、搶占式任務(wù)調(diào)度、任務(wù)間通信手

6、段多樣化等。在一個典型的Vx Works 嵌入式系統(tǒng)應(yīng)用中,傳送和接收少量的重要數(shù)據(jù)是必要的,這些數(shù)據(jù)必須在一個實(shí)時的時間內(nèi)到達(dá)。這與非實(shí)時的網(wǎng)絡(luò)不同,如在PCLAN 中傳輸一個文件??刂破骶钟蚓W(wǎng)(C AN 是Bosch 公司在現(xiàn)代汽車技術(shù)中領(lǐng)先推出的一種多主機(jī)局域網(wǎng),由于其卓越的性能、極高的可靠性、獨(dú)特靈活的設(shè)計(jì)和低廉的價格,現(xiàn)已廣泛應(yīng)用于工業(yè)現(xiàn)場控制、智能大廈、小區(qū)安防、交通工具、醫(yī)療儀器、環(huán)境監(jiān)控等眾多領(lǐng)域。一般來說CAN 報(bào)文包允許傳輸最高八個字節(jié)的數(shù)據(jù),而總線仲裁的方法保證了一個重要數(shù)據(jù)能夠在一個保證的時間內(nèi)到達(dá)1。目前,Vx Works 對現(xiàn)場總線通信支持的驅(qū)動還是不多,本文詳細(xì)分

7、析了Vx Works 設(shè)備驅(qū)動機(jī)制,并通過CAN 驅(qū)動設(shè)計(jì)的實(shí)例給出了Vx Works 設(shè)備驅(qū)動設(shè)計(jì)的一般思路。2Vx Works 設(shè)備驅(qū)動分析Vx Works 操作系統(tǒng)有兩種方式實(shí)現(xiàn)驅(qū)動:把設(shè)備驅(qū)動程序作為獨(dú)立任務(wù)來實(shí)現(xiàn),直接在頂層任務(wù)中實(shí)現(xiàn)硬件操作,完成特有的專用驅(qū)動程序。Vx Works 的I/O 系統(tǒng)將設(shè)備驅(qū)動程序作為內(nèi)核過程實(shí)現(xiàn),這種方式可以大大減少系統(tǒng)的開銷,提高系統(tǒng)的可靠性和實(shí)時性。Vx Works 標(biāo)準(zhǔn)設(shè)備驅(qū)動是通過I/O 系統(tǒng)來存取的,這樣做的好處是可以屏蔽底層硬件,對上層應(yīng)用程序提供統(tǒng)一的接口。Vx Works 的I/O 系統(tǒng)有其獨(dú)特的特性,使得它比其他I/O 系統(tǒng)更快速、

8、靈活,這在實(shí)時系統(tǒng)中非常重要。還有一些特殊的設(shè)備驅(qū)動,如網(wǎng)絡(luò)設(shè)備驅(qū)動,由于其自身的特性,雖然不是通過標(biāo)準(zhǔn)I/O 來進(jìn)行存取的,但是也都有它們各自相關(guān)的規(guī)范2。在這里只介紹通過I/O 系統(tǒng)存取的標(biāo)準(zhǔn)設(shè)備驅(qū)動機(jī)制。211與設(shè)備驅(qū)動關(guān)聯(lián)的表在Vx Works 中,應(yīng)用程序是通過打開命名文件來訪問I/O 設(shè)備的。要理解Vx Works 設(shè)備驅(qū)動機(jī)制必須分清文件描述符表(F D _T ABLE 、設(shè)備鏈表(DE V I CE L I ST 和驅(qū)動表(DRV _T ABLE 三者的各自作用和關(guān)系3,如圖1所示。(1文件描述符表(F D_T ABLE 。主要用來管理已經(jīng)打開的文件。每一個打開的文件都會在F

9、D _T ABLE 中占用一個條目(F D_E NTRY 。隨后對文件的操作,都由應(yīng)用程序通過對文件在F D_T ABLE 中的索引fd 進(jìn)行操作來實(shí)現(xiàn)。F D _T ABLE 中所包含的F D _E NTRY 的數(shù)量,也就是系統(tǒng)一次所能打開的最大文件數(shù)。F D_E NTRY 記錄了與每一個已經(jīng)打開的文件相關(guān)的信息,主要包括該文件所在設(shè)備的設(shè)備頭指針pDevHdr,文件的名字na me,以及該條目是否可用的標(biāo)志等信息。在這里最主要的是設(shè)備頭指針pDevHdr,通過該指針,操作系統(tǒng)能夠找到實(shí)際要操作的文件設(shè)備,并調(diào)用設(shè)備的驅(qū)動程序來真正地完成對設(shè)備的操作。(2設(shè)備鏈表(DE V I CE L I

10、 ST 是Vx Works 設(shè)備的雙向鏈表。要編寫驅(qū)動的設(shè)備也必須加入到該鏈表中。每一個設(shè)備數(shù)據(jù)結(jié)構(gòu)的第一項(xiàng)必須是一個設(shè)備頭DE V_HDR 數(shù)據(jù)結(jié)構(gòu),其余是與設(shè)備相關(guān)的數(shù)據(jù),如操作設(shè)備所需的緩沖器和進(jìn)行同步或互斥用的信號量等數(shù)據(jù)。DE V _HDR 數(shù)據(jù)結(jié)構(gòu)記錄了某一類設(shè)備的主要信息,包括驅(qū)動號(drv_nu m 和設(shè)備名na me,以及一個用于將所有的設(shè)備鏈接起來的DL _NODE 數(shù)據(jù)結(jié)構(gòu),也就是Vx Works 中的雙向鏈表結(jié)構(gòu)node 。通過node,系統(tǒng)中所有存在的設(shè)備鏈接成一個鏈表,操作系統(tǒng)能夠遍歷這個鏈表,從而知道所需的設(shè)備是否存在。驅(qū)動號drv_nu m 代表了驅(qū)動表(DRV

11、_T ABLE 中的第幾個條目,這個條目里保存有該設(shè)備的實(shí)際操作函數(shù)指針。這樣,通過drv_nu m,操作系統(tǒng)就可以最終調(diào)用設(shè)備的驅(qū)動程序。(3驅(qū)動表(DRV_T ABLE 。由驅(qū)動條目組成。它維護(hù)了系統(tǒng)內(nèi)所有設(shè)備的驅(qū)動條目。驅(qū)動條目存放的是實(shí)際操作設(shè)備的驅(qū)動指針。在Vx Works 中,每一類設(shè)備的操作共分為七種類型,分別是生成、刪除、打開、關(guān)閉、讀、寫和I octl 。Vx Works I/O 系統(tǒng)的初始化工作是由根任務(wù)usr Root 調(diào)用i osI nit 例程來完成的。其原型如下:ST AT US i osI nit (int max_drivers,int max_files,ch

12、ar 3null D ev Na me 其中,參數(shù)max_drivers 是允許的最多驅(qū)動數(shù)也是驅(qū)動條目的最大數(shù)量;max_files 是允許一次打開的最多文件數(shù)也是最大的文件條目數(shù)量;null D ev Na me 是空設(shè)備的名稱。開始時,系統(tǒng)定義了一個空設(shè)備和一個空設(shè)備的寫操作;然后例程分配文件描述表,并清空所有的文件條目;分配驅(qū)動表,并清空所有的驅(qū)動條目;初始化設(shè)備鏈表;接著例程把驅(qū)動表的第一條目設(shè)置為一個空設(shè)備寫,將空設(shè)備掛入設(shè)備鏈表的第一個節(jié)點(diǎn)。至此已經(jīng)完成I/O 系統(tǒng)的初始化工作,就形成如圖1所示的結(jié)構(gòu)。212設(shè)備訪問過程Vx Works 為各種設(shè)備(包括字符設(shè)備、塊設(shè)備、虛擬設(shè)備

13、及網(wǎng)絡(luò)設(shè)備提供統(tǒng)一的訪問接口。用戶訪問設(shè)備是通過應(yīng)用程序界面(AP I 來實(shí)現(xiàn)的。I/O 系統(tǒng)所起的作用就是把用戶請求分配到與設(shè)備對應(yīng)的驅(qū)動例程中去。用戶在操作I/O 設(shè)備之前,與設(shè)備對應(yīng)的文件描述符必須被打開,這是通過調(diào)用open (或create (函數(shù)來完成的3。下面以某一個設(shè)備驅(qū)動程序?yàn)槔?說明設(shè)備的訪問過程(假設(shè)設(shè)備名為“/XX /0”,并且以XX 設(shè)備的驅(qū)動為例。(1調(diào)用open (“/XX /0”,O_RDWR,0644函數(shù);(2I/O 系統(tǒng)遍歷設(shè)備鏈表(DE V I CE L I ST ,尋找名字為“/XX /0”的設(shè)備項(xiàng),并找到該設(shè)備相應(yīng)的驅(qū)動號drv_num;(3I/O 系

14、統(tǒng)為設(shè)備文件在文件描述符表(F D _T ABLE 中分配一個空的文件條目(F D_E NTRY ;(4I/O 系統(tǒng)通過驅(qū)動號drv_nu m,在驅(qū)動表(DRV _T A 2BLE 中找到XX 設(shè)備的xx Open (xx_DE V pXX _DE V,char 3name,int flags 例程,該驅(qū)動例程返回設(shè)備描述符指針;(5如果打開成功,就將設(shè)備描述符指針、設(shè)備全文件名及驅(qū)動相關(guān)的返回值存放在新分配的文件條目里,并返回一個fd;如果設(shè)備打開失敗,就將已經(jīng)分配的文件條目釋放;(6讀、寫等操作可以直接通過調(diào)用fd 找到設(shè)備驅(qū)動號,進(jìn)而找到設(shè)備的驅(qū)動例程。213設(shè)備驅(qū)動設(shè)計(jì)過程通過分析知道

15、,設(shè)備驅(qū)動設(shè)計(jì)需以下的幾個步驟3,4:(1設(shè)備數(shù)據(jù)結(jié)構(gòu)的定義,其第一項(xiàng)必須是設(shè)備頭DE V _HDR 結(jié)構(gòu);(2設(shè)備驅(qū)動例程編寫,包括生成、刪除、打開、關(guān)閉、讀、寫和I octl 例程;(3設(shè)備驅(qū)動注冊,通過調(diào)用i os D rvI nstall (函數(shù)將自己的設(shè)備驅(qū)動注冊到I/O 系統(tǒng)的驅(qū)動表(DRV_T ABLE 中;(4設(shè)備掛載,通過調(diào)用i os Dev Add (函數(shù)將設(shè)備掛載到I/O 系統(tǒng)的設(shè)備鏈表(DE V I CE L I ST 中,調(diào)用int Connect (函數(shù)完成中斷服務(wù)程序的掛接,并用sysI ntEnableP I C (函數(shù)打開設(shè)備中斷;(5把文件或函數(shù)按照BSP

16、的目錄結(jié)構(gòu)加到正確的位置;(6編寫Makefile 文件,最后是編譯調(diào)試工作。3基于Vx W o rks 的CAN 設(shè)備驅(qū)動實(shí)現(xiàn)311I SA 2CAN 適配卡的硬件結(jié)構(gòu)I S A 2CAN 適配卡是I S A 接口的C AN 總線通信適配卡,其主要功能是讓計(jì)算機(jī)方便地連接到CAN 總線上,實(shí)現(xiàn)CAN 210B 協(xié)議(兼容CAN 2.0A 的連接通信,CAN 的通信協(xié)議主要由C AN 控制器SJA1000完成,如圖2所示 。適配卡使用系統(tǒng)內(nèi)存地址映射空間方式,對于I ntel x86體系的CP U,I S A 可以映射的空間為0xC80000xEFFFF 。使用比較器和地址選擇開關(guān)組成可選端口

17、地址譯碼電路,通過開關(guān)選通內(nèi)存映射基地址(C8000H,C9000H,C A000H,EF000H ,以避免與其他器件沖突。適配卡中斷I RQ 設(shè)置通過跳線進(jìn)行選擇,可選的I RQ有I RQ3,I RQ4,I RQ5,I RQ6,I RQ7, I RQ9,I RQ10,I RQ11,I RQ12和I RQ15。312CAN設(shè)備驅(qū)動主要實(shí)現(xiàn)技術(shù)31211主要數(shù)據(jù)結(jié)構(gòu)(1協(xié)議幀數(shù)據(jù)結(jié)構(gòu)typedef structunsigned l ong I D;/3報(bào)文I D3/unsigned char SendType;/3發(fā)送幀類型3/unsigned char Re moteFlag;/3是否是遠(yuǎn)程幀

18、3/unsigned char ExternFlag;/3是否是擴(kuò)展幀3/unsigned char Data Len;/3數(shù)據(jù)長度(<=83/unsigned char Data8;/3報(bào)文的數(shù)據(jù)3/CAN_FRAME;(2緩沖器數(shù)據(jù)結(jié)構(gòu)typedef structint pT oBuf;/3寫入指針3/int pFr omBuf;/3讀出指針3/int bufsize;/3緩沖器大小3/CAN_FRAME3buf;/3CAN數(shù)據(jù)幀指針3/CANR I N G;(3CAN設(shè)備描述符結(jié)構(gòu)typedef structDEV_HDR pCANHDR;/3I/O系統(tǒng)設(shè)備頭3/BOO creat

19、ed;/3TRUE如果設(shè)備已經(jīng)創(chuàng)建3/CANR I N G_I D CanRdBuf;/3環(huán)狀讀緩沖器指針3/SE MAPHORE rdSyncSem;/3讀同步信號量3/SE MAPHORE mutexSe m;/3互斥信號量3/CANR I N G_I D Can W rt B uf;/3環(huán)狀寫緩沖器指針3/SE MAPHORE wrtSyncSem;/3寫同步信號量3/SEL_WAKEUP_L I ST sel W akeupL ist;/3等待設(shè)備的任務(wù)列表3/CAN_DEV;31212具體實(shí)現(xiàn)技術(shù)主要完成所需緩沖器的操作和設(shè)備基本驅(qū)動例程。驅(qū)動主要包括設(shè)備驅(qū)動初始化和設(shè)備創(chuàng)建、設(shè)備打

20、開、報(bào)文的收發(fā)和I/O控制、中斷服務(wù)等。(1緩沖器操作CAN緩沖器CANR ing是一個先進(jìn)先出的環(huán)緩沖器,設(shè)有讀和寫兩個環(huán)緩沖器。創(chuàng)建時,比實(shí)際的要大一個數(shù)據(jù)幀空間。滿時,讀寫指針始終相差1;只有當(dāng)空時,讀寫指針相等。由于一個讀任務(wù)和一個寫任務(wù)是分別對讀指針和寫指針進(jìn)行修改的,所以它們可以同時訪問環(huán)緩沖器,這由其自身特點(diǎn)來保證,不需要額外的互斥操作。但對于多個讀任務(wù)或者多個寫任務(wù)同時訪問緩沖器的情況下,需要互斥機(jī)制來保證,如用信號量機(jī)制。由于C AN協(xié)議是按一幀進(jìn)行讀寫的,因此環(huán)緩沖器每項(xiàng)的大小也是按固定的一幀大小來創(chuàng)建的,使操作時變得簡單。(2設(shè)備驅(qū)動初始化Can D rv(和設(shè)備創(chuàng)建Ca

21、n Dev Create(設(shè)備驅(qū)動初始化時,判斷驅(qū)動是否已經(jīng)初始化。如還沒有初始化,則調(diào)用i os D rvI nstall(例程。該例程對于同一個設(shè)備驅(qū)動只需調(diào)用一次,它將驅(qū)動服務(wù)例程與I/O系統(tǒng)服務(wù)進(jìn)行關(guān)聯(lián),將C AN驅(qū)動例程加入到驅(qū)動表DRV_T ABLE中,并且分配給CAN設(shè)備一個驅(qū)動號。設(shè)備創(chuàng)建時,完成設(shè)備的一些初始化,包括分配讀緩沖器和寫緩沖器、創(chuàng)建讀寫同步和互斥信號量和初始化等待任務(wù)列表等;調(diào)用int Connect(例程完成C AN設(shè)備的中斷注冊,該例程將中斷服務(wù)程序Can I ntr與指定的中斷向量vect or連接;調(diào)用sysI ntEnableP I C(例程允許C AN

22、設(shè)備中斷;最后調(diào)用i os De2 v Add(例程,這個例程向I/O系統(tǒng)的設(shè)備鏈表DE V I CE L I ST 中加入一個CAN設(shè)備,并設(shè)置C AN設(shè)備頭結(jié)構(gòu)的驅(qū)動號(drv _nu m為設(shè)備驅(qū)動初始化時返回的驅(qū)動號和設(shè)備名na me為“/ can/0”(假設(shè)用這個設(shè)備名字,使得設(shè)備對于以后的open(和create(例程可用。(3設(shè)備打開Can Open(設(shè)備打開,主要完成CAN控制器的初始化工作,返回必須是一個CAN設(shè)備指針,這是由于該指針一定要賦值給文件表F D_T ABLE中文件條目F D_E NT RY的第一項(xiàng)pDevHdr。初始化CAN控制器,主要在復(fù)位時為各個寄存器設(shè)置正確

23、的初值。在設(shè)置控制器的寄存器前,必須通過讀模式寄存器的復(fù)位模式/請求(Reset Mode/Request標(biāo)志來檢查控制器是否已進(jìn)入復(fù)位模式,因?yàn)橐玫脚渲眯畔⒌募拇嫫?僅在復(fù)位模式可寫5。在復(fù)位模式中,必須配置下面的控制段寄存器:模式寄存器選擇模式;時鐘分頻寄存器;驗(yàn)收代碼寄存器和驗(yàn)收屏蔽寄存器;總線定時寄存器;輸出控制寄存器;中斷使能寄存器。退出復(fù)位模式時,必須清除模式寄存器的復(fù)位模式/請求標(biāo)志位,要必須先檢查標(biāo)志是否確實(shí)被清除,是否進(jìn)入了工作模式,才能進(jìn)行下一步的操作,這通過循環(huán)讀該標(biāo)志實(shí)現(xiàn)。(4報(bào)文的發(fā)送Can W rite(和報(bào)文的接收CanRead(數(shù)據(jù)流程的層次關(guān)系如圖3所示。應(yīng)

24、用層調(diào)用通用i oL ib 中的函數(shù)Read和W rite,這些函數(shù)從輸入的fd中找到相應(yīng)的設(shè)備描述符,然后找到DRV_T ABLE,調(diào)用DRV_T ABLE中的函數(shù)。DRV_T ABLE中的函數(shù)則是第二層的C AN驅(qū)動例程(Can2 Read,Can W rite,再由C AN驅(qū)動例程和真正的CAN設(shè)備打交道。第二層和底層的通信是通過中斷回調(diào)函數(shù)(Can I Rx、Can2 I Tx來實(shí)現(xiàn)。具體地說,中斷服務(wù)程序負(fù)責(zé)數(shù)據(jù)的收發(fā)。輸出時,底層驅(qū)動可以從CAN Out put R ing Buffer中得到數(shù)據(jù)并將數(shù)據(jù)發(fā)送到CAN Bus;輸入時,底層驅(qū)動將接收到的數(shù)據(jù)讀到C AN I nput

25、 R ing Buffer中 。報(bào)文的發(fā)送主要是完成用戶向C AN寫緩沖器寫數(shù)據(jù)的工作。報(bào)文發(fā)送是以循環(huán)方式依次將每一幀數(shù)據(jù)寫入寫緩沖器的。對于每一幀數(shù)據(jù):必須獲得寫同步信號量和互斥信號量獨(dú)占緩沖區(qū);將數(shù)據(jù)寫入寫緩沖器,修改寫緩沖器的寫指針;釋放互斥信號量,如果緩沖器還有空間,則釋放寫同步信號量,退出對C AN緩沖器的獨(dú)占使用。循環(huán)結(jié)束時,返回發(fā)送的數(shù)據(jù)字節(jié)數(shù)。設(shè)備創(chuàng)建Can DevCreate在創(chuàng)建寫緩沖器時釋放寫同步信號量,也就是說調(diào)用該例程的第一個任務(wù)是不阻塞的。寫同步信號量釋放條件是:寫緩沖器有空余空間。釋放的時機(jī)是:寫操作結(jié)束后,判斷寫緩沖器有空余空間時;中斷寫操作Can I Tx(

26、將一幀數(shù)據(jù)從寫緩沖器寫到C AN總線后;進(jìn)入寫操作后,但被I/O 控制操作取消時。調(diào)用該例程的任務(wù),如果寫緩沖器有空余空間時,完成寫數(shù)據(jù)的工作;如果寫緩沖器滿時,則任務(wù)阻塞。報(bào)文的接收主要是完成用戶從CAN 讀緩沖器中讀數(shù)據(jù)的工作:進(jìn)入一個循環(huán)。在循環(huán)體內(nèi)獲得讀同步信號量和互斥信號量,如果緩沖器中有數(shù)據(jù)則退出循環(huán),否則釋放互斥信號量并繼續(xù)循環(huán)。進(jìn)入依次讀取每一幀數(shù)據(jù)的循環(huán)。為了喚醒阻塞在讀同步信號量的任務(wù),讀完一幀數(shù)據(jù)后必須檢查緩沖器是否還有數(shù)據(jù),如果有,則釋放讀同步信號量,釋放互斥信號量。返回實(shí)際讀取的數(shù)據(jù)字節(jié)數(shù)。釋放讀同步信號量條件是:讀緩沖器有數(shù)據(jù)。釋放讀同步信號量的時機(jī):中斷讀Can

27、2I Rx (接收到C AN 總線上的數(shù)據(jù)幀,并把數(shù)據(jù)讀到讀緩沖器中后;讀操作結(jié)束后,判斷讀緩沖器還有數(shù)據(jù)時;進(jìn)入讀操作后,但被I/O 控制操作取消時。調(diào)用該例程的任務(wù),如果讀緩沖器有數(shù)據(jù)時,完成讀數(shù)據(jù)的工作;如果讀緩沖器空時,則任務(wù)阻塞。(5中斷服務(wù)Can I ntr (中斷服務(wù)Can I ntr (讀C AN 控制器的中斷寄存器來識別中斷源,然后根據(jù)不同的中斷源進(jìn)入不同的工作流程。這些中斷源是由控制器復(fù)位時中斷使能寄存器賦值決定的。這里只打開了發(fā)送和接收及數(shù)據(jù)溢出三種中斷。中斷寫Can I Tx (如圖4所示,CAN 控制器只有在發(fā)送狀態(tài)為空閑、上一幀發(fā)送完畢和發(fā)送緩沖器釋放的情況下,把中

28、斷寄存器的發(fā)送中斷位置高,并產(chǎn)生硬件中斷信號通知CP U 把數(shù)據(jù)發(fā)送到CAN Bus 上去。如果CAN 設(shè)備寫緩沖器有數(shù)據(jù)在等待發(fā)送,則馬上將數(shù)據(jù)寫入CAN 控制器發(fā)送緩沖器并命令發(fā)送數(shù)據(jù),同時釋放寫同步信號量并喚醒等待設(shè)備的寫任務(wù);如果CAN 設(shè)備寫緩沖器沒有數(shù)據(jù)在等待發(fā)送,就直接返回。中斷讀Can I Rx (如圖5所示,CAN 控制器發(fā)現(xiàn)CAN 總線上的數(shù)據(jù)己通過驗(yàn)收濾波器,則把數(shù)據(jù)存在接收數(shù)據(jù)緩沖器中,同時中斷寄存器的接收中斷位置高,并產(chǎn)生硬件中斷信號通知CP U 有數(shù)據(jù)已經(jīng)接收到。CP U 接收數(shù)據(jù)后,置位清除接收緩沖器位,釋放讀同步信號量并喚醒等待設(shè)備的讀任務(wù)。CAN 控制器自動發(fā)

29、送回應(yīng)信號表示已經(jīng)接收到數(shù)據(jù),對方節(jié)點(diǎn)可以馬上再發(fā)送另一幀數(shù)據(jù)到總線上 。當(dāng)接收數(shù)據(jù)數(shù)量超出CAN 控制器的接收緩沖器容量時,中斷寄存器數(shù)據(jù)溢出位被置高,并產(chǎn)生硬件中斷信號,通知CP U 已經(jīng)有數(shù)據(jù)丟失。此時,CP U 重新對控制器進(jìn)行初始化,再次進(jìn)入正常工作狀態(tài)。(6I/O 控制Can I octl (I/O 控制是根據(jù)I/O 請求控制代碼的類型來控制C AN 設(shè)備的,主要包括讀取或?qū)懢彌_器現(xiàn)有的數(shù)據(jù)幀數(shù)量;清除CAN 設(shè)備讀或?qū)懢彌_器;按照請求的大小重新分配CAN 設(shè)備的讀或?qū)懢彌_器;設(shè)置CAN 總線波特率;選擇或取消CAN 設(shè)備的Select 功能;取消本次傳輸。最主要的是設(shè)置CAN 總線波特率,因?yàn)榘岩粋€節(jié)點(diǎn)加入到C AN 總線上時,該節(jié)點(diǎn)的波特率必須與其他的節(jié)點(diǎn)一致6。這里采用自動波特率檢測算法,這是一個不影響網(wǎng)絡(luò)運(yùn)行操作的位速率檢測算法。在只聽模式,控制器不能發(fā)送報(bào)文也不能產(chǎn)生出錯幀,只能接收報(bào)文。在啟動時,用最高位速率接收報(bào)文之前,CAN 控制器使能接收中斷和出錯中斷如果C AN 總線產(chǎn)生錯誤,程序會轉(zhuǎn)向下一個較低的位速率,在成功地接收到一個報(bào)文后,C AN 控制器已經(jīng)檢測到正確的位速率,轉(zhuǎn)向正常工作模式。4結(jié)束語按照上述思路編

溫馨提示

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

評論

0/150

提交評論