一種基于Salvo的通用CAN/LIN網(wǎng)關(guān)
4 網(wǎng)關(guān)軟件
CAN總線(xiàn)與LIN總線(xiàn)比較相似,協(xié)議數據單元比較接近,網(wǎng)關(guān)軟件數據處理量不大;而且,網(wǎng)關(guān)軟件本身功能相對單一,一般不需要操作系統支持。但本文討論的是一個(gè)通用網(wǎng)關(guān),針對不同場(chǎng)合系統功能需要適當的裁剪和擴充,有操作系統的支持更便于系統功能的裁剪和擴充,提高系統的可移植性,增加系統通用性。另外,有操作系統的支持系統開(kāi)發(fā)時(shí)間大大縮短,而且可靠性也大大提高。
4.1 實(shí)時(shí)操作系統Salvo
系統軟件開(kāi)發(fā)采用實(shí)時(shí)操作系統RTOS會(huì )占用部分系統硬件資源,目前大多數RTOS 適用于A(yíng)RM 或X86 等可配備豐富硬件資源的微處理器系統。實(shí)時(shí)操作系統Salvo 占用系統硬件資源少,且功能強大,適合硬件資源相對貧乏的單片機,尤其是存儲器資源貧乏的PIC 系列單片機。Salvo 占用程序存儲器容量取決于用戶(hù)調用的系統函數,一般典型系統占用1~2K 程序存儲器。占用數據存儲器容量取決于用戶(hù)定義的變量、任務(wù)和事件的數量,以PIC16 系列單片機為例,每個(gè)全局變量占10b,任務(wù)占5b,事件占3b,一般典型系統占用50~100b 數據存儲器。
Salvo 是一個(gè)基于優(yōu)先級任務(wù)切換,支持事件驅動(dòng)的多任務(wù)實(shí)時(shí)操作系統。Salvo 共支持16 個(gè)任務(wù)優(yōu)先級,且多個(gè)任務(wù)可以共用一個(gè)優(yōu)先級,任務(wù)按優(yōu)先級高低切換,對于多個(gè)同一優(yōu)先級的任務(wù),以時(shí)間片循環(huán)方式切換。Salvo 支持任務(wù)和事件的數量不限,取決于RAM 的大小。
4.2 任務(wù)分割及功能確定
基于RTOS 的軟件開(kāi)發(fā)主要工作是任務(wù)分割、任務(wù)功能確定和任務(wù)代碼編寫(xiě)。任務(wù)分割的基本原則是任務(wù)內的內聚度強而任務(wù)間的偶合性弱。為減少Salvo在任務(wù)切換時(shí)占用過(guò)多的系統資源,任務(wù)分割盡量減少任務(wù)數,系統分割成5個(gè)任務(wù)(參見(jiàn)圖4):
CAN_TXD任務(wù):由ENCANTXD信號觸發(fā),將經(jīng)PDU_Conversion任務(wù)轉換的數據送到CAN模塊的發(fā)送緩沖寄存器,并啟動(dòng)CAN發(fā)送器發(fā)送數據。
CAN_RXD任務(wù):由ISR_CANRXD中斷服務(wù)程序發(fā)送ENCANRXD事件觸發(fā),接收CAN模塊接收緩沖器的數據,發(fā)送CANTOLIN信號觸發(fā)PDU_Conversion任務(wù)。
LIN_RXD任務(wù):由ISR_LINRXD中斷服務(wù)程序發(fā)送ENLINRXD事件觸發(fā),接收USART模塊發(fā)送來(lái)的數據。根據LIN協(xié)議分析標識場(chǎng)確定報文的內容和長(cháng)度,分析校驗和場(chǎng)確定報文的正確性,發(fā)送LINTOCAN信號觸發(fā)PDU_Conversion任務(wù)。
LIN¬_TXD任務(wù):由ENLINTXD信號觸發(fā),將經(jīng)PDU_Conversion任務(wù)轉換的數據送到USART模塊,并控制USART模塊安LIN協(xié)議發(fā)送數據。
PDU_Conversion任務(wù):由LINTOCAN或CANTOLIN信號觸發(fā),將服務(wù)數據單元SDU轉換成CAN協(xié)議數據單元或LIN協(xié)議數據單元,并通過(guò)ENCANTXD信號或ENNLINTXD信號觸發(fā)CAN_TXD任務(wù)或LIN_TXD任務(wù)向CAN總線(xiàn)或LIN總線(xiàn)發(fā)送數據。
4.3 任務(wù)間通信及任務(wù)優(yōu)先級
現場(chǎng)總線(xiàn)一般對實(shí)時(shí)性要求較高,為提高系統的實(shí)時(shí)性,減少數據在網(wǎng)關(guān)的延時(shí),系統采用中斷方式接收CAN總線(xiàn)和LIN總線(xiàn)的數據。若CAN總線(xiàn)上有節點(diǎn)發(fā)送數據,網(wǎng)關(guān)的CAN模塊接收器接收數據,存于信息集中緩沖器MAB,同時(shí)根據接收屏蔽器信息,比較接收過(guò)濾器與接收信息標示區是否相符,若相符將信息集中緩沖器信息裝入接收緩沖器(RXB0或RXB1,PIC18F4680的CAN模塊有兩個(gè)接收緩沖器),并通過(guò)中斷標志寄存器PIR3的RXB0IF或RXB1IF(CAN模塊接收緩沖器中斷標志位)申請中斷,CPU進(jìn)入ISR_CANRXD中斷服務(wù)程序,在ISR_CANRXD中發(fā)送ENCANRXD事件觸發(fā)CAN_RXD任務(wù)啟動(dòng)。CAN_RXD任務(wù)讀取接收緩沖器中SDU數據,存入一個(gè)CANSDU全局數組,并發(fā)送CANTOLIN信號觸發(fā)PDU_Conversion任務(wù)啟動(dòng)。PDU_Conversion任務(wù)接收全局數組CANSDU數據,轉換成LIN總線(xiàn)的協(xié)議數據單元,存于LINPDU全局數組,并發(fā)送ENLINTXD信號觸發(fā)LIN_TXD任務(wù)啟動(dòng)。LIN_TXD任務(wù)接收全局數組LINPDU數據,控制USART模塊按LIN總線(xiàn)協(xié)議發(fā)送數據。以上是CAN/LIN網(wǎng)關(guān)從CAN總線(xiàn)接收數據發(fā)送到LIN總線(xiàn)的各任務(wù)同步及通信過(guò)程,CAN/LIN網(wǎng)關(guān)從LIN總線(xiàn)接收數據發(fā)送到CAN總線(xiàn)的各任務(wù)同步及通信過(guò)程基本與其相似。
評論