曹清源,楊 濤,錢宏文
(中國電子科技集團公司第五十八研究所,江蘇 無錫 214035)
車載網(wǎng)關(guān)控制器作為汽車上不同總線或網(wǎng)段數(shù)據(jù)交互的中樞,是汽車總線系統(tǒng)的核心工作單元,對車載網(wǎng)關(guān)系統(tǒng)的設(shè)計優(yōu)化具有重要意義[1-2]。由于車載網(wǎng)關(guān)控制器工作環(huán)境較為苛刻,且對硬件成本限制極為嚴格,因此車載網(wǎng)關(guān)控制器通常使用車規(guī)級專用微控制器設(shè)計實現(xiàn)[3-4]。因此,數(shù)據(jù)傳輸實時性和運行可靠性是車載網(wǎng)關(guān)控制器的核心性能。
基于車規(guī)級專用微控制器的車載網(wǎng)關(guān)控制器通常有兩種軟件設(shè)計方案:基于操作系統(tǒng)的軟件設(shè)計和無操作系統(tǒng)的軟件設(shè)計。相對于無操作系統(tǒng)的軟件設(shè)計,基于操作系統(tǒng)的軟件設(shè)計具有實時性高、可靠性好和擴展能力強等優(yōu)勢。因此設(shè)計基于嵌入式操作系統(tǒng)的車載網(wǎng)關(guān)控制器是提高車載網(wǎng)關(guān)控制器性能的重要手段。
本文提出一種基于μC/OS-Ⅲ的車載網(wǎng)關(guān)控制器設(shè)計方案,主要包括網(wǎng)關(guān)控制器硬件設(shè)計、操作系統(tǒng)的移植和通信軟件設(shè)計。最后,使用專用測試工具和上位機軟件對網(wǎng)關(guān)的數(shù)據(jù)傳輸能力進行測試。結(jié)果表明,本文設(shè)計的網(wǎng)關(guān)控制器能有效保證網(wǎng)關(guān)功能可靠性和數(shù)據(jù)傳輸實時性。
網(wǎng)關(guān)控制器硬件框圖如圖1 所示。該網(wǎng)關(guān)控制器選用NXP 公司的Power 內(nèi)核MPC5646C 作為微控制器器。CAN接口選用TI 公司的TCAN1042 作為CAN 總線收發(fā)器,以太網(wǎng)接口選用NXP 公司生產(chǎn)的TJA1100 車載以太網(wǎng)收發(fā)器。

圖1 網(wǎng)關(guān)控制器硬件框圖
網(wǎng)關(guān)微控制器是由NXP 公司提供的32 位單片機MPC5646C,屬于Power 架構(gòu),具有e200z0h 和e200z4h 雙內(nèi)核處理器功能、更強的數(shù)據(jù)處理能力、更大的數(shù)據(jù)存儲空間和更低的功耗[5-6]。
本文采用的CAN 收發(fā)器型號為TCAN1042。該芯片是TI 公司生產(chǎn)的一款具有CAN FD 和故障保護功能的汽車類CAN 收發(fā)器,這款 CAN 收發(fā)器系列符合 ISO1189-2 (2016)高速CAN 物理層標準。所有器件均設(shè)計用于數(shù)據(jù)速率高達2 Mb/s 的 CAN FD 網(wǎng)絡(luò)。圖2 為CAN 接口硬件設(shè)計原理圖[7]。

圖2 CAN 接口硬件設(shè)計原理圖
TJA1101 是NXP 公司生產(chǎn)的符合100BASE-T1 標準的以太網(wǎng)收發(fā)器。該器件支持在一對非屏蔽雙絞線上實現(xiàn)100 Mb/s 的收發(fā)能力,傳輸線長度可達15 m 以上。TJA1101可以在保持汽車應(yīng)用所需魯棒性的同時,減小電源損耗和系統(tǒng)整體費用。圖3 為以太網(wǎng)收發(fā)器接口原理圖。

圖3 以太網(wǎng)收發(fā)器接口原理圖
為了方便移植,μC/OS-Ⅲ的絕大部分代碼使用C 語言編寫[8]。但在移植時,仍需要用C 語言和匯編語言編寫與處理器相關(guān)的代碼。μC/OS-Ⅲ中操作CPU 寄存器的代碼,仍只能使用匯編語言編寫,除非C 編譯器支持內(nèi)嵌匯編語言。圖6 給出了μC/OS-Ⅲ的結(jié)構(gòu)以及它與其他軟件文件和硬件的關(guān)系。使用μC/OS-Ⅲ時,需要編寫應(yīng)用軟件代碼,并配置μC/OS-Ⅲ。
μC/OS-Ⅲ的移植工作包括4 個內(nèi)核相關(guān)文件,分別是os_cpu.h、os_cpu_a.s、os_cpu_a.inc 和os_cpu_c.c。除此之外,移植工作還需要編寫3 個CPU 相關(guān)文件,分別是cpu.h、cpu_a.a 和cpu_c.c。
os_cpu.h 中定義了任務(wù)切換宏定義,OS_TASK_SW()。對于MPC5646C 微控制器而言,任務(wù)切換是通過執(zhí)行system call(sc, se_sc)指令,產(chǎn)生system call 中斷(IVOR8),并在system call中斷服務(wù)函數(shù)—IVOR8trap中執(zhí)行OSCtxSw實現(xiàn)任務(wù)切換。
os_cpu_a.s 文件中包含了所有需要使用匯編語言實現(xiàn)的函數(shù)。開發(fā)者需要在該文件中實現(xiàn)4 個函數(shù),即:OSStartHighRdy()、OSCtxSw()、OSIntCtxSw()和OSTickISR()。OSStartHighRdy()會被OSStart()函數(shù)調(diào)用來開始多任務(wù)管理。該函數(shù)僅在操作系統(tǒng)啟動時被執(zhí)行一次。OSCtxSw()是任務(wù)級的任務(wù)切換函數(shù),在IVOR8trap 中斷服務(wù)函數(shù)中被調(diào)用來切換任務(wù)。OSIntCtxSw()是中斷級任務(wù)切換函數(shù)。在所有嵌套的中斷服務(wù)程序都退出后,OSIntExit()函數(shù)會調(diào)用OSIntCtxSw(),使得在中斷函數(shù)執(zhí)行后,當前最高優(yōu)先級的任務(wù)能夠運行。OSTickISR()是系統(tǒng)時鐘節(jié)拍中斷服務(wù)函數(shù)。MPC5646 的e200z4 內(nèi)核中提供了時鐘基準定時器—Time Base,該定時器中包含了一個減計數(shù)器,當減計數(shù)器的值由1變?yōu)?時,將引發(fā)Decrementer中斷(IVOR10)。在Decrementer 中斷服務(wù)函數(shù)—IVOR10trap 中,需要調(diào)用OSTickISR()。
os_cpu_a.inc 文件中實現(xiàn)了匯編文件的宏定義,包括兩部分內(nèi)容:第一部分是CPU 中通用寄存器的地址;第二部分是中斷函數(shù)中要使用的prologue 和epilogue 功能。
os_cpu_c.c 文件中定義了10 個函數(shù),需要自己實現(xiàn)的函數(shù)是OSTaskStkInit,用于初始化每個任務(wù)的任務(wù)堆棧。其余函數(shù)應(yīng)保留函數(shù)定義,函數(shù)內(nèi)容可為空,或保持其默認狀態(tài)[9]。
微控制器MPC5646C 一共支持6 路FlexCAN 模塊。每個FlexCAN 模塊有64 個消息緩沖(Message Buffer),每個Buffer 都可以獨立配置為發(fā)送或接收功能。當Buffer 完成發(fā)送或接收動作后,中斷標志位將被置位。如果相應(yīng)的中斷允許位被打開,MPC5646C 將產(chǎn)生中斷,并進入相應(yīng)的中斷服務(wù)函數(shù)中。本文使用了“延遲中斷處理”的概念,在CAN接收中斷函數(shù)中讀取Buffer 中的報文,通過隊列發(fā)送給任務(wù)進行處理。如果當前隊列已滿,則清除中斷標志位,不執(zhí)行讀取操作,退出中斷函數(shù)。待下次進入中斷函數(shù)時,讀取所有接收的報文。CAN 中斷函數(shù)流程如圖4 所示。

圖4 CAN 中斷函數(shù)流程
本文對每一路CAN 都單獨分配一個任務(wù)(task),任務(wù)創(chuàng)建時初始化每一個任務(wù)對應(yīng)的CAN 模塊。在任務(wù)主循環(huán)中讀取隊列,如果當前隊列為空,當前任務(wù)則被操作系統(tǒng)掛起,出讓CPU 使用權(quán);當隊列非空時,任務(wù)被操作系統(tǒng)喚醒,并讀取隊列中收到的報文,執(zhí)行處理操作[10]。CAN 接收任務(wù)流程如圖5 所示。

圖5 CAN 接收任務(wù)流程
本文為每一路CAN 分配了一個互斥信號量,用于保護執(zhí)行發(fā)送操作的Message Buffer 不會被重入[11]。當任務(wù)需要在某一路CAN 模塊上發(fā)送報文時,首先申請該CAN 模塊對應(yīng)的互斥信號量,如果信號量被成功獲取,則在所有的發(fā)送Message Buffer中尋找空閑的Message Buffer,找到后通過寫寄存器實現(xiàn)發(fā)送操作;如果信號量沒有被獲取,則當前任務(wù)被掛起,任務(wù)的最長等待時間設(shè)置為5 ms,如果等待超時或沒有找到可用的Message Buffer,則返回錯誤信息。CAN 發(fā)送函數(shù)流程如圖6 所示。

圖6 CAN 發(fā)送函數(shù)流程
MPC5646C 的快速以太網(wǎng)控制器(FEC)使用了描述符結(jié)構(gòu)。描述符中包含了緩沖區(qū)首地址、數(shù)據(jù)長度、狀態(tài)和控制信息等。發(fā)送和接收描述符分別在兩個環(huán)形結(jié)構(gòu)中運行。在FEC 中可以分別設(shè)置發(fā)送和接收描述符的起始地址。每個環(huán)形結(jié)構(gòu)中的最后一個描述符由“Wrap”位進行定義。如果FEC 檢測到該位被定義,則下一個描述符位于環(huán)形結(jié)構(gòu)的開始位置,否則下一個描述符位于本次描述符的鄰接位置。
當任務(wù)需要發(fā)送以太網(wǎng)數(shù)據(jù)時,首先獲取一個空閑的發(fā)送數(shù)據(jù)描述符,在該描述符中填寫數(shù)據(jù)長度和數(shù)據(jù)起始地址,如果待發(fā)送數(shù)據(jù)由多個緩沖區(qū)組成,則需要按照發(fā)送順序依次填寫與緩沖區(qū)個數(shù)相同的描述符。之后,按照數(shù)據(jù)發(fā)送相反的順序,依次對發(fā)送數(shù)據(jù)描述符進行使能。最后,通知FEC 根據(jù)定義的描述符開始發(fā)送數(shù)據(jù)。以太網(wǎng)發(fā)送數(shù)據(jù)流程如圖7 所示。

圖7 以太網(wǎng)發(fā)送流程
由于本文使用了嵌入式操作系統(tǒng)μC/OS-Ⅲ,因此本文使用了一個專門的接收線程接收來自以太網(wǎng)控制器的數(shù)據(jù)。在以太網(wǎng)接收中斷函數(shù)中,向接收線程發(fā)送信號量,并清除相應(yīng)的中斷標志位,而后中斷服務(wù)函數(shù)立即返回。而接收線程一直判斷是否收到該信號量,如果收到信號量,則從以太網(wǎng)控制器中讀取接收到的數(shù)據(jù),并發(fā)送給協(xié)議棧進行處理。以太網(wǎng)接收任務(wù)流程如圖8 所示。

圖8 以太網(wǎng)接收任務(wù)流程
為了驗證所提系統(tǒng)性能, 使用USBCAN-4E-U 和USBCAN-2E-U 兩種高性能USB 轉(zhuǎn)CAN 接口卡對整個系統(tǒng)CAN 通信狀態(tài)進行監(jiān)控。使用USBCAN-4E-U 的CAN0 ~CAN3 分別連接網(wǎng)關(guān)的CAN0 ~CAN3,使 用USBCAN-2E-U 的CAN0 和CAN1 分別連接 網(wǎng)關(guān)的CAN4 和CAN5。網(wǎng)關(guān)控制器配置中繼轉(zhuǎn)發(fā)功能,CAN0 收到的數(shù)據(jù)轉(zhuǎn)發(fā)CAN1,CAN1 收到的數(shù)據(jù)轉(zhuǎn)發(fā)CAN0,CAN2 收到的數(shù)據(jù)轉(zhuǎn)發(fā)CAN3,CAN3 收到的數(shù)據(jù)轉(zhuǎn)發(fā)CAN2,CAN4 收到的數(shù)據(jù)轉(zhuǎn)發(fā)CAN5,CAN5 收到的數(shù)據(jù)轉(zhuǎn)發(fā)CAN4。當總線負載率為49.465 0%時,網(wǎng)關(guān)控制器轉(zhuǎn)發(fā)功能工作正常,如圖9 所示。

圖9 網(wǎng)關(guān)控制器轉(zhuǎn)發(fā)功能工作正常
使用JPERF 工具對以太網(wǎng)通信進行測試,結(jié)果如圖10所示。通過圖10 可以看到,傳輸速率穩(wěn)定在88 Mb/s 左右。

圖10 傳輸速率曲線圖
本文提出一種基于μC/OS-Ⅲ的車載網(wǎng)關(guān)控制器設(shè)計方案。為提高網(wǎng)關(guān)的安全性,本文引入了嵌入式操作系統(tǒng)μC/OS-Ⅲ對網(wǎng)關(guān)控制器的任務(wù)進行調(diào)度,增強處理器對外部事件的處理能力。采用MPC5646 作為網(wǎng)關(guān)的核心處理器。對于車載網(wǎng)關(guān)控制器所要求的報文轉(zhuǎn)發(fā)功能,在CAN 總線負載率為49.465 0%時,能夠滿足6 路CAN 同時工作并轉(zhuǎn)發(fā)報文,以太網(wǎng)傳輸速率能夠穩(wěn)定在88 Mb/s 左右。