摘要:基于提高CAN總線組網(wǎng)能力的考慮,提出一種新穎的CAN中繼器設(shè)計方法;闡述以LPC2119控制器為核心的硬件設(shè)計方案;詳細(xì)分析在μC/OSII實時操作系統(tǒng)下的軟件實現(xiàn)過程;針對中繼器的實時性和安全性以及總線與總線之間可能存在的速度不匹配的問題,確立提升緊急任務(wù)優(yōu)先級、建立相關(guān)事件標(biāo)志、合理地對事件與任務(wù)進(jìn)行同步的改進(jìn)方法,從而有效地解決組網(wǎng)中最遠(yuǎn)傳輸距離和最大節(jié)電數(shù)限制的問題。
關(guān)鍵詞:中繼器 CAN LPC2119 μC/OSII
引 言
CAN總線的直接通信距離只有10 km左右,而且由于收發(fā)器驅(qū)動能力的限制,總線上最多只能掛110個節(jié)點,給系統(tǒng)組網(wǎng)帶來一定的困難。CAN中繼器就是為了解決這個問題而設(shè)計的。對CAN中繼器初始化參數(shù)進(jìn)行設(shè)置,可以在不同的網(wǎng)段內(nèi)采用不同的通信速率,還可以對報文進(jìn)行過濾,減輕總線負(fù)擔(dān)。
1 CAN中繼器的硬件設(shè)計
1.1 微控制器LPC2119簡介
CAN中繼器是以ARM微控制器LPC2119為核心的軟硬件系統(tǒng)。LPC2119是Philips公司生產(chǎn)的一款基于支持實時仿真和跟蹤的16/32位ARM7TDMISMCU,帶有128 KB嵌入的高速Flash存儲器。獨(dú)特的加速結(jié)構(gòu)使32位代碼能夠在最大時鐘速率下運(yùn)行。對代碼規(guī)模有嚴(yán)格控制的應(yīng)用可使用16位Thumb模式將代碼規(guī)模降低超過30 %,而性能的損失卻很小。LPC2119內(nèi)部集成2個CAN控制器。它的主要特性有:單個總線上的數(shù)據(jù)傳輸速率高達(dá)1 Mb/s;32位寄存器和RAM訪問;兼容CAN 2.0B, ISO 118981規(guī)范;全局驗收濾波器可以識別所有的11位和29位Rx標(biāo)識符;驗收濾波器為選擇的標(biāo)準(zhǔn)標(biāo)識符提供Full CANstyle自動接收。
1.2 LPC2119內(nèi)部CAN控制器與SJA1000比較
LPC2119內(nèi)部集成的CAN控制器與Philips公司的SJA1000 CAN控制器相比較大致相同,只是在驗收濾波這一環(huán)略有不同,這為習(xí)慣SJA1000的開發(fā)人員采用LPC2119提供了方便。SJA1000驗收濾波器由驗收代碼寄存器和驗收屏蔽寄存器定義,要接收報文的位模式在驗收代碼寄存器中定義,相應(yīng)的驗收屏蔽寄存器允許定義某些位為“無關(guān)”,通過模式寄存器可以選擇不同的過濾模式:單過濾模式和雙過濾模式。而對LPC2119內(nèi)部集成的CAN控制器,全局驗收過濾器包含一個512×32(2 KB)的RAM,通過軟件處理,可在RAM中存放1~5個標(biāo)識符表格,整個RAM可容納1024個標(biāo)準(zhǔn)標(biāo)識符或512的擴(kuò)展標(biāo)識符或兩種類型混合的標(biāo)識符。同時有5個地址寄存器指向驗收過濾器RAM的表格:Full CAN標(biāo)準(zhǔn)地址,標(biāo)準(zhǔn)單個地址,標(biāo)準(zhǔn)地址范圍,擴(kuò)展單個地址或擴(kuò)展地址范圍。當(dāng)CAN控制器的接收端已接收到一個完整的標(biāo)識符時,它將通知驗收過濾器,驗收過濾器響應(yīng)這個信號,并讀出控制器編號、標(biāo)識符尺寸,以及來自控制器本身的標(biāo)識符,然后通過驗收過濾器搜索RAM中的表格,以決定接收或放棄這一幀信息。
1.3 CAN中繼器硬件結(jié)構(gòu)
中繼器的硬件結(jié)構(gòu)框圖如圖1所示。LPC2119分別通過CAN總線收發(fā)器與兩路總線相連;總線驅(qū)動器采用帶隔離的DC/DC模塊單獨(dú)供電,不僅實現(xiàn)了兩路CAN接口之間的電器隔離,也實現(xiàn)了中繼器與CAN總線的電器隔離。除此之外,還有LED顯示和鍵盤接口。LED用于顯示中繼器的工作狀態(tài),鍵盤用來修正總線的波特率。最終程序的調(diào)試與跟蹤通過JTAG調(diào)試口完成。
圖1硬件結(jié)構(gòu)框圖
2 系統(tǒng)軟件設(shè)計
2.1 引入μC/OSII實時操作系統(tǒng)
隨著應(yīng)用的復(fù)雜化,采用傳統(tǒng)前后臺設(shè)計方法,會顯得過于復(fù)雜,實時性得不到保證,而且容易發(fā)生死鎖。解決這些問題的最好方法就是采用實時操作系統(tǒng)。
μC/OSII完全是占先式的實時內(nèi)核, 是基于優(yōu)先級的, 即總是讓就緒態(tài)中優(yōu)先級最高的任務(wù)先運(yùn)行, 因此實時性比非占先式的內(nèi)核要好。 它包含了實時內(nèi)核、任務(wù)管理、時間管理、任務(wù)間通信同步(信號量、郵箱、消息隊列) 和內(nèi)存管理等功能; 它的絕大部分代碼是用C 語言編寫的, 可移植性強(qiáng), 可以在絕大多數(shù)8 位、16 位、32 位以至64 位微處理器、微控制器、數(shù)字信號處理器(DSP) 上運(yùn)行。
CAN中繼器對系統(tǒng)的實時性和可靠性要求比較高。采用μC/OSII實時操作系統(tǒng)可以有效地對任務(wù)進(jìn)行調(diào)度;對各任務(wù)賦予不同的優(yōu)先級可以保證任務(wù)及時響應(yīng),而且采用實時操作系統(tǒng),降低了程序的復(fù)雜度,方便程序的開發(fā)。
2.2 軟件設(shè)計中需考慮的問題
(1) 使用代碼的容量
在前/后臺系統(tǒng)的設(shè)計中,對存儲器容量的需求僅僅取決于應(yīng)用程序代碼,而使用RTOS的情況則很不一樣。RTOS 內(nèi)核本身需要額外的代碼空間。
總代碼量=應(yīng)用程序代碼+內(nèi)核代碼
每個任務(wù)都是獨(dú)立運(yùn)行的,必須給每個任務(wù)提供單獨(dú)的??臻g(RAM)。在決定分配給每個任務(wù)多少棧空間時,應(yīng)該盡可能使之接近實際的需求量。??臻g的大小不僅要計算任務(wù)本身的需求(局部變量、函數(shù)調(diào)用等) ,還需要計算最多中斷嵌套層數(shù)(保存寄存器、中斷服務(wù)程序中的局部變量等)。內(nèi)核的另一個應(yīng)該具有的特性是,每個任務(wù)所需的棧空間大小可以分別定義。所有內(nèi)核都需要額外的??臻g,以保證內(nèi)部變量、數(shù)據(jù)結(jié)構(gòu)、隊列等。如果內(nèi)核支持中斷用棧分離,則總的RAM需求量的表達(dá)式為:RAM總需求=應(yīng)用程序RAM 需求+內(nèi)核數(shù)據(jù)區(qū)RAM需求+各任務(wù)棧需求的總和+最多中斷嵌套棧需求。
除非有特別大的RAM空間可以使用,對棧的分配與使用均要特別小心。實時多任務(wù)系統(tǒng)比前后臺系統(tǒng)需要更多的代碼(ROM) 和數(shù)據(jù)空間(RAM) 。額外的代碼空間取決于內(nèi)核的大小,而RAM的用量則取決于系統(tǒng)中的任務(wù)數(shù)。
(2) 實時性和安全性
CAN中繼器是系統(tǒng)組網(wǎng)的關(guān)鍵設(shè)備之一,在稍大型的CAN總線系統(tǒng)中經(jīng)常會用到中繼器。它給系統(tǒng)組網(wǎng)帶來方便的同時,也給系統(tǒng)增加了一些存儲轉(zhuǎn)發(fā)時延,因此在軟件設(shè)計中必須考慮系統(tǒng)的實時性,盡量縮短數(shù)據(jù)的存儲轉(zhuǎn)發(fā)時間。這除了要求給系統(tǒng)數(shù)據(jù)轉(zhuǎn)發(fā)任務(wù)分配較高的優(yōu)先級之外,還應(yīng)建立一種通信機(jī)制,保證在收到一路總線上的數(shù)據(jù)時,能即時向另一路總線發(fā)送。另外,中繼器是兩路總線之間通信的橋梁,為了保證兩路總線之間正常的通信,應(yīng)盡量避免類似死鎖、總線故障之類的情況發(fā)生。所以系統(tǒng)必須設(shè)計一個監(jiān)控任務(wù),能對這類情況作出即時反應(yīng),同時為了不丟失還未轉(zhuǎn)發(fā)的數(shù)據(jù),必須為每一路總線設(shè)置一環(huán)形緩沖區(qū),用于存放新接收到的數(shù)據(jù),維護(hù)系統(tǒng)的安全性。
2.3 系統(tǒng)設(shè)計實現(xiàn)
嵌入式CAN中繼器主要實現(xiàn)兩路CAN總線數(shù)據(jù)之間相互轉(zhuǎn)發(fā),并且可以根據(jù)實際需要,改變某一路CAN控制器的波特率。采用μC/OSII實時操作系統(tǒng),整個設(shè)計由操作系統(tǒng)和一系列用戶應(yīng)用程序構(gòu)成。
主函數(shù)是程序首先執(zhí)行的一個函數(shù)。該函數(shù)永遠(yuǎn)不會返回,主要實現(xiàn)系統(tǒng)的硬件和操作系統(tǒng)的初始化。硬件包括中斷、鍵盤、顯示等初始化;操作系統(tǒng)包括任務(wù)控制快和事件控制快的初始化,而且在啟動多任務(wù)調(diào)度之前,必須至少創(chuàng)建一個任務(wù)。在此系統(tǒng)中創(chuàng)建了一個啟動任務(wù),主要負(fù)責(zé)時鐘的初始化和啟動,中斷的啟動,CAN控制器的初始化及啟動及任務(wù)的劃分等。在交出CPU的使用權(quán)之后,只做一些空閑處理。
(1) 任務(wù)的劃分
要完成實時多任務(wù)的各種功能,必須對任務(wù)進(jìn)行劃分。本程序根據(jù)各個任務(wù)的重要性和實時性,把程序分成六個具有不同優(yōu)先級的任務(wù),包括系統(tǒng)監(jiān)控、數(shù)據(jù)轉(zhuǎn)發(fā)、鍵盤輸入、LED顯示、接收隊列監(jiān)視和波特率設(shè)置。表1為任務(wù)劃分表。
除了6個主要應(yīng)用任務(wù)之外,還有兩個中斷服務(wù)子程序:一個時鐘節(jié)拍中斷,用于提供周期性信號源;一個CAN接收中斷,用于把接收數(shù)據(jù)寫入環(huán)形緩沖區(qū)。
評論
查看更多