www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式軟件
[導(dǎo)讀]汽車ECU標(biāo)定系統(tǒng)CAN驅(qū)動(dòng)模塊的實(shí)現(xiàn)

1  前言

標(biāo)定是指根據(jù)整車的各種性能要求(如動(dòng)力性、經(jīng)濟(jì)性、排放及輔助功能等),來(lái)調(diào)整、優(yōu)化和確定整車上各ECU(如發(fā)動(dòng)機(jī)、AT等各子系統(tǒng) ECU)控制參數(shù)的控制算法。標(biāo)定系統(tǒng)主要是由上位機(jī)和底層ECU這二部分組成,因此,上位機(jī)和底層ECU的通信方式對(duì)整個(gè)標(biāo)定系統(tǒng)的性能起到了至關(guān)重要的作用。目前,一般的標(biāo)定系統(tǒng)都是采用基于串行口的點(diǎn)對(duì)點(diǎn)的通信方式,這種通信方式容易實(shí)現(xiàn),但存在著通信速度較慢、可靠性較低等缺陷。這里我們采用的是CAN總線的通信方式,相對(duì)串口通信,基于CAN總線的通信方式具有通信可靠[1]、傳輸速度快、可實(shí)現(xiàn)在線編程等優(yōu)點(diǎn)。

2  總體設(shè)計(jì)

CAN通信可視為系統(tǒng)的一個(gè)I/O字符流設(shè)備[3],它在完成普通收發(fā)功能的同時(shí),還要能實(shí)現(xiàn)驅(qū)動(dòng)程序必備的設(shè)備無(wú)關(guān)性。即驅(qū)動(dòng)程序應(yīng)將系統(tǒng)所有的硬件特性封裝起來(lái),為使用該設(shè)備的應(yīng)用程序提供與硬件無(wú)關(guān)的、通用的編程接口,應(yīng)用層程序編寫(xiě)人員無(wú)需了解設(shè)備的原理,即可順利實(shí)現(xiàn)對(duì)設(shè)備的控制,通過(guò)該設(shè)備實(shí)現(xiàn)可靠的數(shù)據(jù)交換。另外,針對(duì)CAN通信和嵌入式系統(tǒng)的實(shí)時(shí)性要求,該驅(qū)動(dòng)程序要求收發(fā)數(shù)據(jù)代碼可靠,延遲短,占用系統(tǒng)時(shí)間短,中斷執(zhí)行時(shí)間短,關(guān)閉中斷時(shí)間短,并在收發(fā)錯(cuò)誤和發(fā)生異常情況時(shí),向應(yīng)用程序匯報(bào)。另外,該驅(qū)動(dòng)程序需要監(jiān)控CAN控制器的工作狀態(tài),在出現(xiàn)致命錯(cuò)誤和脫離總線時(shí),為CAN模塊復(fù)位,并向系統(tǒng)匯報(bào)。

圖1 驅(qū)動(dòng)程序總體結(jié)構(gòu)圖

基于以上需求分析,結(jié)合其他OS中實(shí)現(xiàn)I/O串行設(shè)備的驅(qū)動(dòng)方案及CAN的總線要求特點(diǎn),設(shè)計(jì)總體驅(qū)動(dòng)程序結(jié)構(gòu)如圖1。   

3  CAN驅(qū)動(dòng)模塊的實(shí)現(xiàn)

基于以上總體設(shè)計(jì)框架,首先定義一個(gè)CAN類來(lái)封裝CAN通信中的數(shù)據(jù)結(jié)構(gòu)和函數(shù),最下面一層為中斷級(jí)程序,中斷處理程序在每次CAN控制器完成收發(fā)時(shí),喚醒驅(qū)動(dòng)程序,進(jìn)行下一步工作。在中斷處理程序中,根據(jù)不同的中斷向量來(lái)確定當(dāng)前發(fā)生的是發(fā)送完成中斷還是接受完成中斷,并完成相應(yīng)工作。中間一層為底層驅(qū)動(dòng)程序,底層驅(qū)動(dòng)程序主要是通過(guò)對(duì)CAN控制器寄存器的讀寫(xiě),完成對(duì)CAN端口的配置和狀態(tài)檢測(cè)等工作,同時(shí)為設(shè)備無(wú)關(guān)軟件和用戶程序提供接口。在這一層中,必須要建立一個(gè)環(huán)狀緩沖結(jié)構(gòu),該緩沖由一個(gè)接收環(huán)狀緩沖區(qū)和一個(gè)發(fā)送環(huán)狀緩沖區(qū)組成,其數(shù)據(jù)結(jié)構(gòu)如下代碼所示,對(duì)于每個(gè)環(huán)狀緩沖區(qū),設(shè)計(jì)了一個(gè)存入指針指向下一個(gè)待存入CANMsg的存入地址,一個(gè)讀出指針指向緩沖區(qū)下一個(gè)待取出的(最舊的)CANMsg的地址,一個(gè)計(jì)數(shù)器記錄目前緩沖區(qū)中有多少個(gè)CANMsg待取出,一個(gè)信號(hào)量,用于與應(yīng)用程序交換消息。接收環(huán)狀緩沖區(qū)用于緩沖接收到的總線消息,等待應(yīng)用程序處理,發(fā)送環(huán)狀緩沖區(qū)用于緩沖應(yīng)用程序發(fā)送出的消息,等待發(fā)送中斷程序來(lái)處理。

typedef struct{   //環(huán)形緩沖區(qū)的數(shù)據(jù)結(jié)構(gòu)

INT16U   RingBufRxCtr;       //接收計(jì)數(shù)器

OS_EVENT *RingBufRxSem;    //信號(hào)量

CAN_msg  *RingBufRxInPtr;    //接收緩沖區(qū)的存入指針

CAN_msg  *RingBufRxOutPtr;  //接收緩沖區(qū)的讀出指針

CAN_msg  RingBufRx[CAN_RX_BUF_SIZE];  //接收緩沖區(qū)的消息存儲(chǔ)

INT16U   RingBufTxCtr;  //發(fā)送計(jì)數(shù)器

OS_EVENT *RingBufTxSem;

CAN_msg  *RingBufTxInPtr;    //發(fā)送緩沖區(qū)的存入指針

CAN_msg  *RingBufTxOutPtr;  //發(fā)送緩沖區(qū)的讀出指針

CAN_msg  RingBufTx[CAN_TX_BUF_SIZE];  //發(fā)送緩沖區(qū)的消息存儲(chǔ)

}CAN_RING_BUF;

 3.1 底層驅(qū)動(dòng)

底層驅(qū)動(dòng)模塊為我們應(yīng)用程序提供了接收和發(fā)送消息的接口函數(shù)。

圖2  CAN接收消息

當(dāng)接收消息時(shí)[3],如圖2所示,應(yīng)用程序在信號(hào)量處等待;收到一個(gè)消息后,ISR從串行端口讀入消息,將其存入環(huán)型緩沖區(qū)。然后ISR發(fā)出信號(hào)量,通知在等待串口數(shù)據(jù)的任務(wù)已收到一個(gè)消息。等待任務(wù)收到信號(hào)量后,進(jìn)入就緒狀態(tài),準(zhǔn)備被OS調(diào)度器激活。當(dāng)內(nèi)核調(diào)度該任務(wù)運(yùn)行時(shí),該任務(wù)從環(huán)狀緩沖區(qū)中取出消息,完成接收消息的過(guò)程。

void CAN_GetMsg(CAN_msg *msg){

INT8U   oserr;

OS_CPU_SR cpu_sr;

CAN_RING_BUF *pbuf;

pbuf = &ringbuf;

OSSemPend(pbuf->RingBufRxSem,0,&oserr);   //等待信號(hào)量

OS_ENTER_CRITICAL();//關(guān)中斷

pbuf->RingBufRxCtr--;//接收計(jì)數(shù)器減1

CopyMsg(pbuf->RingBufRxOutPtr++,msg); //從環(huán)形緩沖區(qū)中取出信號(hào)量         

if(pbuf->RingBufRxOutPtr==&pbuf->RingBufRx[CAN_RX_BUF_SIZE]) {pbuf->RingBufRxOutPtr= &pbuf->RingBufRx[0];

//如果環(huán)形緩沖區(qū)的讀出指針達(dá)到緩沖區(qū)的最末端,將其改為指向緩沖區(qū)的首地址  }

OS_EXIT_CRITICAL();  //開(kāi)中斷,允許CPU響應(yīng)中斷   }

發(fā)送CAN消息與接受消息類似。后臺(tái)進(jìn)程將欲發(fā)送的消息幀存儲(chǔ)于發(fā)送環(huán)狀緩沖區(qū)中。當(dāng)CAN端口準(zhǔn)備發(fā)送一幀消息時(shí),產(chǎn)生一個(gè)中斷,CAN消息從緩沖區(qū)中取出,并由ISR輸出[4]。但其中出現(xiàn)了一個(gè)問(wèn)題:CAN端口只能在發(fā)送上一個(gè)數(shù)據(jù)結(jié)束的時(shí)候才會(huì)產(chǎn)生一個(gè)中斷,這個(gè)產(chǎn)生中斷的時(shí)刻與我們需要執(zhí)行中斷任務(wù)的時(shí)間是不一致的。解決這個(gè)問(wèn)題的方法就是,禁止發(fā)送端中斷使能直到需要再發(fā)送消息為止。在系統(tǒng)啟動(dòng)時(shí),禁止發(fā)送中斷,發(fā)送一個(gè)啟動(dòng)消息幀,這時(shí)發(fā)送完成中斷標(biāo)志位已經(jīng)被置位,但由于發(fā)送中斷使能位為低,所以無(wú)法發(fā)生中斷,系統(tǒng)繼續(xù)執(zhí)行。當(dāng)需發(fā)送第一個(gè)消息時(shí),將該消息放入發(fā)送環(huán)狀緩沖區(qū),然后運(yùn)行發(fā)送中斷,這時(shí),上一次發(fā)送消息完成中斷產(chǎn)生,發(fā)送該消息。在發(fā)送消息結(jié)束時(shí),若發(fā)送環(huán)狀緩沖區(qū)中有其他數(shù)據(jù)需要發(fā)送,則清中斷源,等待該消息發(fā)送完成中斷產(chǎn)生,來(lái)發(fā)送下一個(gè)消息,若沒(méi)有其他數(shù)據(jù)需要被發(fā)送,則直接禁止發(fā)送中斷,將該消息發(fā)送完成時(shí)產(chǎn)生的中斷保留到下一次有消息需要發(fā)送時(shí)發(fā)生。

圖3  CAN發(fā)送消息

發(fā)送消息的方法如圖3。當(dāng)發(fā)送環(huán)狀緩沖區(qū)已滿時(shí),信號(hào)量作為指示,暫停發(fā)送任務(wù)。發(fā)送消息時(shí),任務(wù)等待信號(hào)量。如果環(huán)狀緩沖區(qū)未滿,則任務(wù)繼續(xù)向環(huán)狀緩沖區(qū)存儲(chǔ)欲發(fā)送的消息。如果存儲(chǔ)的消息是緩沖區(qū)第一個(gè)字節(jié),則發(fā)送中斷允許,中斷程序準(zhǔn)備啟動(dòng)。CAN發(fā)送ISR從環(huán)行緩沖區(qū)中取出最舊的消息,同時(shí)發(fā)送信號(hào)量,通知發(fā)送任務(wù),表明環(huán)狀緩沖區(qū)有空間接收另外的消息,接著ISR將消息從發(fā)送到總線上。其實(shí)現(xiàn)代碼如下所示:

void CAN_PutMsg(CAN_msg *msg) {

INT8U oserr;

OS_CPU_SR cpu_sr;

CAN_RING_BUF *pbuf;

pbuf = &ringbuf;

OSSemPend(pbuf->RingBufTxSem, 0, &oserr);   //等待信號(hào)量

OS_ENTER_CRITICAL();//關(guān)中斷

pbuf->RingBufTxCtr++;   //發(fā)送計(jì)數(shù)器加1

CopyMsg(msg, pbuf->RingBufTxInPtr++);  //將消息放入環(huán)形緩沖區(qū)

if(pbuf->RingBufTxInPtr==&pbuf->RingBufTx[CAN_TX_BUF_SIZE]) {pbuf->RingBufTxInPtr=&pbuf->RingBufTx[0];

     }

if (pbuf->RingBufTxCtr==1) {

     CAN_TxIntEn();//為環(huán)形緩沖區(qū)的第一則消息,開(kāi)發(fā)送中斷

     }

     OS_EXIT_CRITICAL();

}

3.2 中斷服務(wù)程序

根據(jù)前面談到發(fā)送和接收消息的軟件結(jié)構(gòu),在CAN初始化時(shí)就要求CAN的接收中斷處入開(kāi)啟狀態(tài),而發(fā)送中斷僅僅是在發(fā)送緩沖區(qū)里面有了第一則消息后再開(kāi)啟的,因此在這里設(shè)計(jì)兩個(gè)接口函數(shù),CAN.TxIntEn()和CAN.TxIntDis(),分別將發(fā)送屏蔽位置1(允許發(fā)送完成中斷)和置0(禁止發(fā)送完成中斷)。

圖4  發(fā)送接收中斷程序流程圖

中斷級(jí)程序的核心就是CANRX_ISR()和CANTX_ISR(),它們由初始化時(shí)對(duì)該模塊的中斷設(shè)置寄存器設(shè)置的中斷級(jí)別。如圖4所示,若為接收完成中斷,則清除中斷源,將接收到的消息放入接收緩沖區(qū);將該消息存入接收緩沖區(qū)存入指針?biāo)赶虻牡刂?,將該指針向下移?dòng),接收緩沖區(qū)計(jì)數(shù)器加1,并發(fā)出信號(hào)量通知應(yīng)用程序有新的消息已經(jīng)接收到,若有任務(wù)正在等待CAN上的新消息,則該任務(wù)進(jìn)入就緒狀態(tài)等待OS的調(diào)度。若為發(fā)送完成中斷,則將發(fā)送緩沖區(qū)的待發(fā)送消息讀出;將有待發(fā)送消息且優(yōu)先級(jí)最高的一個(gè)中讀取最舊的消息(緩沖區(qū)取出指針?biāo)赶虻南ⅲ?,發(fā)送緩沖區(qū)計(jì)數(shù)器減1,發(fā)出信號(hào)量通知應(yīng)用程序有一個(gè)消息被發(fā)出,并匯報(bào)當(dāng)前發(fā)送緩沖區(qū)的狀態(tài);還應(yīng)判斷是否為最后一個(gè)待發(fā)送的消息,若不是,則清除中斷源并將消息發(fā)送到總線上,若是最后一個(gè),則禁止發(fā)送完成中斷后發(fā)送該消息,將這個(gè)發(fā)送完成中斷保留到應(yīng)用程序下一次發(fā)送消息的時(shí)候允許并產(chǎn)生。

3.3 應(yīng)用

該驅(qū)動(dòng)程序的應(yīng)用,如下代碼所示,這里使用的是uCOS-II,首先定義一個(gè)CAN消息對(duì)象(msg)和一個(gè)環(huán)狀緩沖區(qū)數(shù)據(jù)結(jié)構(gòu)(CANRingBuf),在主程序中,初始化OS以后調(diào)用Ringbuf_Init()函數(shù)初始化環(huán)形緩存區(qū),然后調(diào)用CAN_Init()函數(shù)初始化CAN端口。在啟動(dòng)OS后,用戶就可用在任何任務(wù)中調(diào)用CAN_PutMsg(CAN_msg *msg)和CAN_GetMsg(CAN_msg *msg)發(fā)送和接收總線消息了。

CAN_msg msg;

CAN_RING_BUF CANRingBuf;

void main(void) { 

OSInit();

Ringbuf_Init();

CAN_Init();

/* Creat task1 */

       OSStart();    }

void task1 (void * data)

{     CAN_PutMsg(&msg);

CAN_GettMsg(&msg);

}

4  結(jié)束語(yǔ)

通過(guò)改變芯片總線頻率、CAN通信速率這樣多次反復(fù)不斷的調(diào)試,此CAN驅(qū)動(dòng)在實(shí)時(shí)操作系統(tǒng)上運(yùn)行穩(wěn)定可靠,未出現(xiàn)數(shù)據(jù)丟失,較好的實(shí)現(xiàn)了上位機(jī)與ECU的通信,因此,具有很強(qiáng)的實(shí)用價(jià)值。

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

成都2022年10月19日 /美通社/ -- 近期,平安養(yǎng)老險(xiǎn)積極籌備個(gè)人養(yǎng)老金的產(chǎn)品設(shè)計(jì)和系統(tǒng)開(kāi)發(fā)工作,發(fā)展多樣化的養(yǎng)老金融產(chǎn)品,推動(dòng)商業(yè)養(yǎng)老保險(xiǎn)、個(gè)人養(yǎng)老金、專屬商業(yè)養(yǎng)老保險(xiǎn)等產(chǎn)品供給。 搭養(yǎng)老政策東風(fēng) ...

關(guān)鍵字: 溫度 BSP 東風(fēng) 大眾

廣東佛山2022年10月19日 /美通社/ -- 空間是人居生活的基礎(chǔ)單元,承載著生存與活動(dòng)的最基本功能。而對(duì)于理想空間的解構(gòu)意義卻在物理性容器之外,體現(xiàn)出人們對(duì)于空間和生活深層關(guān)系的思考,同時(shí)也塑造著人與空間的新型連接...

關(guān)鍵字: 溫度 BSP 智能化 進(jìn)程

上海2022年10月19日 /美通社/ -- 10月17日晚間,安集科技披露業(yè)績(jī)預(yù)告。今年前三季度,公司預(yù)計(jì)實(shí)現(xiàn)營(yíng)業(yè)收入7.54億元至8.33億元,同比增長(zhǎng)60.24%至77.03%;歸母凈利潤(rùn)預(yù)計(jì)為1.73億...

關(guān)鍵字: 電子 安集科技 BSP EPS

北京2022年10月19日 /美通社/ -- 10月18日,北京市經(jīng)濟(jì)和信息化局發(fā)布2022年度第一批北京市市級(jí)企業(yè)技術(shù)中心創(chuàng)建名單的通知,諾誠(chéng)健華正式獲得"北京市企業(yè)技術(shù)中心"認(rèn)定。 北京市企業(yè)技...

關(guān)鍵字: BSP ARMA COM 代碼

北京2022年10月18日 /美通社/ -- 10月14日,國(guó)際數(shù)據(jù)公司(IDC)發(fā)布《2022Q2中國(guó)軟件定義存儲(chǔ)及超融合市場(chǎng)研究報(bào)告》,報(bào)告顯示:2022年上半年浪潮超融合銷售額同比增長(zhǎng)59.4%,近5倍于...

關(guān)鍵字: IDC BSP 數(shù)字化 數(shù)據(jù)中心

上海2022年10月18日 /美通社/ -- 2022年9月5日,是首都銀行集團(tuán)成立60周年的紀(jì)念日。趁著首都銀行集團(tuán)成立60周年與首都銀行(中國(guó))在華深耕經(jīng)營(yíng)12年的“大日子”,圍繞作為外資金融機(jī)構(gòu)對(duì)在華戰(zhàn)略的構(gòu)想和業(yè)...

關(guān)鍵字: 數(shù)字化 BSP 供應(yīng)鏈 控制

東京2022年10月18日  /美通社/ -- NIPPON EXPRESS HOLDINGS株式會(huì)社(NIPPON EXPRESS HOLDINGS, INC.)旗下集團(tuán)公司上海通運(yùn)國(guó)際物流有限公司(Nipp...

關(guān)鍵字: 溫控 精密儀器 半導(dǎo)體制造 BSP

廣州2022年10月18日 /美通社/ -- 10月15日,第 132 屆中國(guó)進(jìn)出口商品交易會(huì)("廣交會(huì)")于"云端"開(kāi)幕。本屆廣交會(huì)上高新技術(shù)企業(yè)云集,展出的智能產(chǎn)品超過(guò)140,...

關(guān)鍵字: 中國(guó)智造 BSP 手機(jī) CAN

要問(wèn)機(jī)器人公司哪家強(qiáng),波士頓動(dòng)力絕對(duì)是其中的佼佼者。近來(lái)年該公司在機(jī)器人研發(fā)方面獲得的一些成果令人印象深刻,比如其開(kāi)發(fā)的機(jī)器人會(huì)后空翻,自主爬樓梯等。這不,波士頓動(dòng)力又發(fā)布了其機(jī)器人組團(tuán)跳男團(tuán)舞的新視頻,表演的機(jī)器人包括...

關(guān)鍵字: 機(jī)器人 BSP 工業(yè)機(jī)器人 現(xiàn)代汽車

南京2022年10月17日 /美通社/ -- 日前《2022第三屆中國(guó)高端家電品牌G50峰會(huì)》于浙江寧波落幕,來(lái)自兩百余名行業(yè)大咖、專家學(xué)者共同探討了在形勢(shì)依然嚴(yán)峻的當(dāng)下,如何以科技創(chuàng)新、高端化轉(zhuǎn)型等手段,幫助...

關(guān)鍵字: LINK AI BSP 智能家電

嵌入式軟件

15715 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉