日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁(yè)|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開(kāi)發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開(kāi)發(fā)
培訓(xùn)信息
贊助商
CAN能信卡的Linux設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)實(shí)現(xiàn)
CAN能信卡的Linux設(shè)備驅(qū)動(dòng)程序設(shè)計(jì)實(shí)現(xiàn)
 更新時(shí)間:2008-8-16 21:10:34  點(diǎn)擊數(shù):24
【字體: 字體顏色

    摘要:介紹了Linux下設(shè)備驅(qū)動(dòng)程序的結(jié)構(gòu),描述了CAN通信卡設(shè)備驅(qū)動(dòng)程序的軟件框架以及如何將CAN設(shè)備驅(qū)動(dòng)程序加入到Linux系統(tǒng)內(nèi)核中。討論了具體實(shí)現(xiàn)中為了提高通信效率和通信能力,改進(jìn)設(shè)備驅(qū)動(dòng)程序的緩沖區(qū)管理以及利用Linux的特點(diǎn)合理設(shè)計(jì)中斷處理程序。

    關(guān)鍵詞:Linux操作系統(tǒng) 設(shè)備驅(qū)動(dòng)程序 CAN通信卡 中斷處理程序

目前,許多工業(yè)現(xiàn)場(chǎng)如電力系統(tǒng)、化工系統(tǒng)等大量使用控制器局部網(wǎng)(CAN-Controller Area Network)現(xiàn)場(chǎng)總線網(wǎng)絡(luò),CAN通信卡作為計(jì)算機(jī)的外設(shè)將計(jì)算機(jī)接入CAN網(wǎng)絡(luò)。市場(chǎng)上有不少CAN通信卡,但基本上都不帶Linux驅(qū)動(dòng)程序,當(dāng)需要在Linux下使用CAN通信卡設(shè)備時(shí),需自己開(kāi)發(fā)Linux的驅(qū)動(dòng)程序。開(kāi)發(fā)Linux驅(qū)動(dòng)程序不但要求程序員要非常熟悉Linux系統(tǒng),而且要熟悉Linux驅(qū)動(dòng)程序開(kāi)發(fā)的規(guī)范。本文將詳細(xì)介紹CAN通信卡的Linux驅(qū)動(dòng)設(shè)備程序的設(shè)計(jì)和實(shí)現(xiàn)。

1 CAN通信卡的Linux設(shè)備驅(qū)動(dòng)程序結(jié)構(gòu)

Linux系統(tǒng)內(nèi)核通過(guò)設(shè)備驅(qū)動(dòng)程序與外圍設(shè)備進(jìn)行交互,設(shè)備驅(qū)動(dòng)程序是Linux內(nèi)核的一部分,它是一組數(shù)據(jù)結(jié)構(gòu)和函數(shù),這些數(shù)據(jù)結(jié)構(gòu)和函數(shù)通過(guò)定義的接口控制一個(gè)或多個(gè)設(shè)備。對(duì)應(yīng)用程序而言,設(shè)備驅(qū)動(dòng)程序隱藏了設(shè)備的具體細(xì)節(jié),對(duì)各種不同設(shè)備提供一致的接口,一般來(lái)說(shuō)是把設(shè)備射為一個(gè)特殊的設(shè)備文件,用戶(hù)程序可以象對(duì)普通文件一樣對(duì)此設(shè)備文件進(jìn)行操作。

Linux將每個(gè)設(shè)備看作一個(gè)文件,即可以像對(duì)待文件那樣使用read、write等系統(tǒng)調(diào)用進(jìn)行讀寫(xiě)。Linux的設(shè)備文件分為兩類(lèi):一是字符設(shè)備,只能對(duì)該類(lèi)設(shè)備進(jìn)行順序讀寫(xiě),對(duì)外提供字節(jié)流方式的操作;二是塊設(shè)備,可以對(duì)該類(lèi)設(shè)備進(jìn)行隨機(jī)訪問(wèn),一般是磁盤(pán)設(shè)備等大容量存儲(chǔ)設(shè)備。CAN通信卡設(shè)備屬于字符型設(shè)備。

對(duì)設(shè)備的訪問(wèn)是由設(shè)備驅(qū)動(dòng)程序提供的。Linux的設(shè)備驅(qū)動(dòng)程序可以用模塊的方式加載入內(nèi)核,設(shè)備驅(qū)動(dòng)程序與Linux系統(tǒng)的關(guān)系如圖1所示。

1.1 CAN通信卡設(shè)備的特點(diǎn)

控制器局部網(wǎng)(CAN)屬于現(xiàn)場(chǎng)總線的范疇,它是一種有效支持分布式控制或?qū)崟r(shí)控制的串行通信網(wǎng)絡(luò)。由于其性能優(yōu)異、價(jià)格低兼,很快被推廣到工業(yè)測(cè)控現(xiàn)場(chǎng)。

CAN通信卡硬件實(shí)現(xiàn)CAN定義的物理層和數(shù)據(jù)鏈路層功能,收發(fā)報(bào)文中數(shù)據(jù)長(zhǎng)度為0~8個(gè)字節(jié),有2032個(gè)報(bào)文標(biāo)識(shí)符。工作時(shí)通過(guò)報(bào)文標(biāo)識(shí)符確定總線訪問(wèn)優(yōu)先權(quán),高優(yōu)先級(jí)報(bào)文具有低延遲時(shí)間,數(shù)據(jù)傳送速率可編程(最高為1Mbps)。發(fā)送期間若丟二氧化碳仲裁或由于出錯(cuò)而破壞的報(bào)文可自動(dòng)重發(fā)。具有成組和廣播報(bào)文功能。

當(dāng)CAN通信卡接收到一個(gè)報(bào)文時(shí),數(shù)據(jù)保存在CAN通信卡上的接收緩存器中,并產(chǎn)生一接收中斷。當(dāng)一個(gè)報(bào)文被成功發(fā)關(guān)垢,發(fā)送緩沖器可再次被訪問(wèn),產(chǎn)生一個(gè)發(fā)送中斷信號(hào)。CAN通信卡發(fā)送報(bào)文,將數(shù)據(jù)送入CAN通信卡上的發(fā)送緩存器中,CAN通信卡將數(shù)據(jù)串行化發(fā)到CAN總線上。

1.2 CAN通信卡設(shè)備驅(qū)動(dòng)程序的任務(wù)

由于CAN一幀的數(shù)據(jù)長(zhǎng)度最大為8個(gè)字節(jié),可以用多幀的Hilon A協(xié)議來(lái)使CAN傳輸數(shù)據(jù)任意長(zhǎng)。CAN通信卡驅(qū)動(dòng)程序主要完成按照Hilon A協(xié)議解包接收和打包發(fā)送任務(wù),并要對(duì)接收的多幀進(jìn)行管理。

CAN通信卡驅(qū)動(dòng)程序應(yīng)該完成以下任務(wù):

(1)為應(yīng)用程序提供通過(guò)CAN卡發(fā)送和接收任意長(zhǎng)度數(shù)據(jù)的能力;

(2)為應(yīng)用程序提供設(shè)備CAN卡上CAN控制器運(yùn)行參數(shù)的能力;

(3)以阻塞或非阻塞方式讀寫(xiě)CAN設(shè)備文件;

(4)允許CAN卡同時(shí)收發(fā)多路數(shù)據(jù)。

1.3 CAN通信卡驅(qū)動(dòng)程序的處理流程

用戶(hù)進(jìn)程通過(guò)系統(tǒng)調(diào)用向驅(qū)動(dòng)程序傳送一幀任意長(zhǎng)度的數(shù)據(jù),驅(qū)動(dòng)程序中發(fā)送數(shù)據(jù)的程序按照Hilon A協(xié)議將該幀分段打包,放入發(fā)送隊(duì)列,并向CAN控制器請(qǐng)求發(fā)送,由中斷處理程序中發(fā)送部分負(fù)責(zé)發(fā)送完所有的數(shù)據(jù)包。

當(dāng)CAN通信卡接收到數(shù)據(jù)時(shí),產(chǎn)生接收中斷,啟動(dòng)接收中斷處理程序上半部將CAN控制器中接收緩沖器中的內(nèi)容復(fù)制到接收隊(duì)列中,由中斷處理的下半部負(fù)責(zé)解包和組幀的任務(wù),并將處理完的幀放入幀隊(duì)列中,最后用戶(hù)使用系統(tǒng)調(diào)用從接收幀隊(duì)列中讀取完整的一幀。

CAN通信卡設(shè)備驅(qū)動(dòng)程序處理框架如圖2所示。

2 CAN通信卡設(shè)備驅(qū)動(dòng)程序的模塊化程序設(shè)計(jì)

根據(jù)Linux對(duì)設(shè)備驅(qū)動(dòng)程序的要求,模塊化的CAN驅(qū)動(dòng)程序軟件結(jié)構(gòu)如圖3。

2.1 初始化加載和卸載部分

如果設(shè)備驅(qū)動(dòng)程序以模塊方式加入內(nèi)核,則一定會(huì)包括兩個(gè)模塊init_module和clear_module。init_module模塊用來(lái)加載設(shè)備,系統(tǒng)初始化時(shí)調(diào)用;clear_module模塊用來(lái)卸載設(shè)備,取消設(shè)備時(shí)調(diào)用。

設(shè)備驅(qū)動(dòng)程序是系統(tǒng)內(nèi)核的一部分。在任何程序使用設(shè)備驅(qū)動(dòng)程序之前,設(shè)備驅(qū)動(dòng)程序應(yīng)該向系統(tǒng)進(jìn)行登記,以便系統(tǒng)在適當(dāng)?shù)臅r(shí)候調(diào)用。Linux系統(tǒng)里,通過(guò)調(diào)用register_chrdev函數(shù)向系統(tǒng)注冊(cè)字符型設(shè)備驅(qū)動(dòng)程序。Register_chrdev定義為:

int register_chrdev(unsigned int major,const char *name,struct file_operations *fops);

其中,major是為設(shè)備驅(qū)動(dòng)程序向系統(tǒng)申請(qǐng)的主設(shè)備號(hào),如果為0則系統(tǒng)為此驅(qū)動(dòng)程序動(dòng)態(tài)分配一個(gè)主設(shè)備號(hào);name是設(shè)備名;fopsa是對(duì)各個(gè)系統(tǒng)調(diào)用的入口點(diǎn)的說(shuō)明 。

CAN通信卡使用中斷與系統(tǒng)交換數(shù)據(jù),CAN設(shè)備驅(qū)動(dòng)程序需要使用內(nèi)存來(lái)緩存接收到的數(shù)據(jù)和發(fā)送的數(shù)據(jù),中斷和內(nèi)存等資源是由Linux系統(tǒng)統(tǒng)一管理的,設(shè)備驅(qū)動(dòng)程序在初始化時(shí),需要申請(qǐng)資源。在資源不用的時(shí)候,應(yīng)該釋放它們,以利于資源的共享。在Linux系統(tǒng)里,對(duì)中斷的處理是屬于系統(tǒng)核心的部分,設(shè)備驅(qū)動(dòng)程序通過(guò)調(diào)用request_irq()函數(shù)來(lái)申請(qǐng)中斷,通過(guò)free_irq()函數(shù)來(lái)釋放中斷。作為系統(tǒng)核心的一部分,設(shè)備驅(qū)動(dòng)程序在申請(qǐng)和釋放內(nèi)存時(shí)不是調(diào)用malloc()函數(shù)和free()函數(shù),而代之以調(diào)用kmalloc函數(shù)和kfree()函數(shù)。

在init_module模塊中,先檢查是否存在CAN通信卡,如果不存在則退出設(shè)備驅(qū)動(dòng)程序的加載;如果存在,使用request_irq()函數(shù)為CAN通信卡申請(qǐng)系統(tǒng)中空閑的中斷,使用kmalloc()為設(shè)備驅(qū)動(dòng)程序申請(qǐng)輸入輸出緩存隊(duì)列,如果這些資源申請(qǐng)不成功,則釋放已經(jīng)申請(qǐng)到的系統(tǒng)資源,然后退出設(shè)備驅(qū)動(dòng)程序的加載,如果申請(qǐng)成功,使用register_chrdev()函數(shù)將CAN通信卡驅(qū)動(dòng)程序注冊(cè)到Linux系統(tǒng)中,加載完成。

在cleanup_module模塊中先使用free_irq()函數(shù)釋放init_module模塊中申請(qǐng)到的中斷,然后使用kfree()函數(shù)釋放init_module模塊中申請(qǐng)到的內(nèi)存空間,最后使用unregister_chrdev()函數(shù)釋放init_module模塊中注冊(cè)的設(shè)備驅(qū)動(dòng)程序,卸載完成。

  • 上一篇: DTMF信號(hào)收、發(fā)芯片在微機(jī)通信中的應(yīng)用
  • 下一篇: 一種電力線擴(kuò)頻載波通訊節(jié)點(diǎn)的具體實(shí)現(xiàn)
  • 發(fā)表評(píng)論   告訴好友   打印此文  收藏此頁(yè)  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評(píng)論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會(huì)員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對(duì)此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請(qǐng)聯(lián)系機(jī)電之家,機(jī)電之家將及時(shí)作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會(huì)
    中國(guó)行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營(yíng)許可證:浙B2-20080178-1