1引言
近年來,越來越多的公司采用AUTOSAR工具鏈進行車載ECU軟件開發,這對采用傳統手寫代碼方式設計程序的工程師而言是個不小的挑戰,主要體現在以下3個方面。 (1)AUTOSAR規范涉及到很多全新的概念,像RTE、SWC、BswM這些概念,很多手寫代碼多年的老工程師也是不懂的。 (2)C語言編程和使用工具鏈配置的方式進行軟件設計,在思路上存在不小的差異,在開發方式切換的過程中可能感到諸多不適應。 (3)雖然AUTOSAR規范也是用C語言實現的且源程序可見,但由于模塊繁多且每個功能塊所含的代碼量過于龐大,短期內很難再用“把每行代碼搞清楚”的方式保證程序質量,而且在程序執行異常時由于對代碼不熟悉,即使是有著多年C編程經驗的老工程師,也可能會有“問題查找無從下手”的感覺。 針對以上問題,我想從傳統的手工編程入手,逐一介紹AUTOSAR的基本概念和使用工具鏈開發的思路方法,希望對從手寫代碼切換至工具鏈開發的車載嵌入式軟件工程師有一點點幫助。 由于我學習使用AUTOSAR工具鏈的時間不長,很多概念和方法屬于“現學現賣”的階段,又在文中加入了不少自己的理解和感悟,其中的錯誤在所難免,懇請廣大同行們批評指正,共同進步。
2控制實例
在本文中,我們以應用在某重卡主駕座椅上的“ECAS控制器”為例,說明RTE的實現過程。該控制器的核心功能是“將座椅高度始終保持在設定位置上”,通過控制進氣閥和排氣閥的開閉調節空氣彈簧的充氣量,從而實現加載在座椅的重量發生變化時(不坐人或坐不同重量的人)其高度始終不變。表2-1為與之相關的主要部件及其功用。 表2-1:座椅ECAS控制器相關主要部件及其功用
序號 | 部件名稱 | 功用 |
1 | 高度傳感器 | 實時采集座椅當前高度 |
2 | 進氣閥和排氣閥 | (1)進氣閥打開,排氣閥關閉:空氣彈簧充氣,座椅高度上升 (2)進氣閥關閉,排氣閥打開:空氣彈簧放氣,座椅高度下降 (3)進氣閥和排氣閥都關閉:空氣彈簧無動作,座椅高度不變 (4)進氣閥和排氣閥都打開:錯誤狀態 |
3基本概念
為表述方便,首先對本文中出現的概念或術語進行說明,文中黑體字為“官方定義”,紅體字加入了本人的理解。 注:由于AUTOSAR規范本身非本文討論的范疇,其中的通用知識(如:分層架構、ARXML文件等)文中不再涉及,讀者可參照各類資料學習掌握。
3.1車載嵌入式軟件概念
(1)基礎軟件:包括微控制器驅動、外圍芯片驅動、嵌入式操作系統、軟件整體架構和集成等,部分公司稱其為“驅動和架構”。 (2)應用層軟件:主要涉及到特定ECU的控制邏輯和算法等,部分公司稱其為“算法和邏輯”。 大多數車載ECU軟件的核心由輸入、處理和輸出3部分組成,基礎軟件主要負責“輸入和輸出”部分,應用層軟件專注于“處理”部分。
3.2 AUTOSAR規范概念
(1)RTE:運行時環境。作為應用軟件層與基礎軟件層交互的橋梁,為軟硬件分離提供了可能。可以實現軟件組件間、基礎軟件間以及軟件組件與基礎軟件之間的通信。RTE封裝了基礎軟件層的通信和服務,為應用層組件提供了標準化的基礎軟件和通信接口,使得應用層可以通過RTE接口函數調用基礎軟件的服務。此外,RTE抽象了ECU之間的通信,即RTE通過使用標準化的接口將其統一為軟件組件之間的通信。 舉例來說,如果要設計“座椅ECAS控制器”的軟件,程序首先要獲取座椅的當前高度和目標高度,通過一系列算法處理(如PID算法),計算出當前時刻氣囊進氣口和出氣口的狀態,最后控制電磁閥進行座椅高度調節。這里面“采集座椅當前高度”由ADC模塊完成,“控制空氣彈簧進氣口和出氣口的電磁閥”由DO模塊完成,這兩者是基礎軟件的工作;“通過算法得到空氣彈簧進氣口和出氣口的狀態”由應用層軟件完成。而“將基礎軟件采集到的高度傳遞給應用層”和“將應用層的電磁閥控制指令傳遞給基礎軟件層”,就是RTE的任務了。 (2)SWC:軟件組件。封裝了部分或全部汽車電子功能的模塊,包括了其具體的功能實現以及對應的描述。 軟件組件可以理解為“一系列程序文件(函數)的集合”。 (3)Port:端口。根據輸入輸出方向可分為需型端口(Require Port,RPort,用于從其它軟件組件獲得所需數據或者所請求的操作)、供型端口(Provide Port,PPort,用于對外提供某種數據或者某類操作)與供需端口(Provide and Require Port,PRPort,兼有需型端口與供型端口的特性)。 AUTOSAR規范中的“端口”相當于C語言中的“變量”,它的“變量類型”就是下面要介紹的“端口接口”。 (4)Interface:端口接口。由于端口僅僅定義了方向,AUTOSAR中用端口接口(Port Interface)來表征端口的屬性,常用端口接口包括如下兩種類型: ①發送者-接收者接口(Sender-Receiver Interface, S/R),用于數據的傳遞關系; ②客戶端-服務器接口(Client-Server Interface, C/S),用于操作(Operation,OP),即函數調用關系。
對于引用“發送者-接收者”接口的一組端口而言,需型端口為接收者,供型端口為發送者;對于引用“客戶端-服務器”接口的一組端口而言,需型端口為客戶端,供型端口為服務器。 AUTOSAR規范中的“端口接口”相當于C語言中的“結構數據類型”,每個接口由一個或多個“數據元素”組成,相當于結構體的成員。但和數據類型不同的是,除了其包含的每個數據元素分別有一個數據類型之外,每個接口還有一個自己的類型,“S/R”類型表示數據傳遞,相當于C語言中的“b = a”;“C/S”類型表示函數調用,相當于C語言中的“b = func(a)”。
3.3信號
(1)系統信號:車載CAN網絡信號,即某ECU從CAN網絡接收和向CAN網絡發送的信號。 (2)內部信號:不同SWC間交互的信號。
4手寫代碼實現方法
這里所說的“手寫代碼”是指車載ECU程序的基礎軟件部分,應用層軟件使用simulink等工具建模完成,下面以“座椅ECAS控制器”程序為例,介紹基礎軟件與應用層軟件的“RTE”部分如何用手工編程的方式實現。
4.1參數接口
首先需要明確基礎軟件與應用層軟件的參數接口,如表4-1所列。 表4-1:座椅ECAS控制器基礎軟件與應用層軟件的參數接口
信號類型 | 信號名稱 | 精度 | 存儲類型 | 數據范圍 | 數據說明 |
輸入信號 | objectLevel | 0.1mm | uint16 | 0-200(mm) | 座椅目標高度,當數據為0時,表示該值無意義,或者程序處在初始化階段,或者系統上電后駕駛員沒有更新請求值;處在該值時,應用層算法不會進行運算 |
currentLevel | 0.1mm | uint16 | 0-200(mm) | 座椅當前高度,由ADC采集并計算 | |
level_quality | - | uint8 | 0-255 | 質量信號 2:一切正常(缺省值),所有源信號合法 6:由于硬件故障導致信號臨時性或永久性非法 8:初始化(初始化起始或從錯誤狀態恢復),所有源信號合法 | |
precision_upper | 0.1mm | sint16 | 0-100(mm) | 正向精度值 | |
precision_lower | 0.1mm | sint16 | -100-0(mm) | 負向精度值 | |
enable | 0/1 | boolean | 0-1 | 表示當前周期是否使能算法控制,若不使能,則輸入enable=0,以保證算法控制函數運行的完整性 | |
輸出信號 | Control_status | uint8 | 0-3 | value = 0:進氣閥和排氣閥均關閉 value = 1:進氣閥開啟,排氣閥關閉 value = 2:進氣閥開啟,排氣閥關閉 value = 3:本輪調節結束 | |
is_Control_Over | 0/1 | boolean | 0-1 | 表示當前的控制算法是否已調節完畢,并達到了給定的precision精度要求。 |
4.2函數接口
表4-2列出了基礎軟件與應用層軟件之間的函數接口。 表4-2:座椅ECAS控制器基礎軟件與應用層軟件的函數接口
序號 | 函數名稱 | 調用方式 |
1 | Controller_initialize | 僅在初始化階段調用1次 |
2 | Controller_step | 在主程序中以20ms為周期循環調用 |
4.3代碼實現
這里使用2個源文件標識座椅ECAS控制器RTE手寫代碼實現方法,圖4-1和圖4-2分別為logic.c和main.c的代碼截圖。 圖4-1:?邏輯模塊RTE實現手寫代碼截圖 ? 圖4-2:?主模塊RTE實現手寫代碼截圖 ?
5 AUTOSAR工具鏈實現方法
AUTOSAR主流工具鏈大多由德國公司提供,包括Vector、ETAS、EB等,本文以ETAS公司的ISOLAR-AB工具為例講述RTE的開發步驟,主要涉及到其中的2個子工具。 ISOLAR-A:進行系統級架構設計。 RTA-RTE:進行接口設計。 AUTOSAR工具鏈中的“架構設計”即應用層軟件組件的設計,可分為自上而下和自下而上2種開發方式?!白陨隙隆笔侵冈贗SOLAR-A中創建應用層SWC及其所包含的端口,再在Simulink中導入該SWC的arxml文件,并在此基礎上進行邏輯和算法開發;“自下而上”是指在Simulink中創建端口、運行實體等SWC元素,再在ISOLAR-A中導入對應arxml文件生成SWC。本文采用“自上而下”的開發方式。 下面介紹如何使用AUTOSAR工具鏈方式實現座椅ECAS控制器的RTE部分。
5.1工程導入
打開“ISOLAR-AB 4.0.2”環境,選擇“File -> Import -> Existing Projects into Workspace”,點擊“Next”。 按照圖5-1所示的方法將所用工程導入。 圖5-1: ISOLAR-AB工程導入方法 ?
5.2軟件組件創建
座椅ECAS控制器需要創建3個軟件組件,如表5-1所列。 表5-1:座椅ECAS控制器軟件組件
序號 | 軟件組件名稱 | 軟件組件功用 |
1 | Controller_SWC | 控制軟件組件,用于運行座椅高度控制的算法 |
2 | AlgorithmInput_SWC | 算法輸入軟件組件,用于提供座椅高度控制的輸入參數 |
3 | AlgorithmActuator_SWC | 算法執行軟件組件,用于執行進氣閥和排氣閥的開閉動作 |
下面以Controller_SWC為例,介紹軟件組件的創建步驟,其余2個軟件組件的創建與之類似。
5.2.1文件夾創建
在“...srcASW”路徑下創建“Controller_SWC”文件夾,再在其中創建“src”和“arxml”兩個子文件夾。
5.2.2為控制軟件組件創建arxml描述文件
在工程名上右鍵“New -> AUTOSAR File”,彈出圖5-3所示的對話框,這里新建一個名為“Controller_SWC.arxml”的描述文件,并同時創建一個名為“Controller_SWC”的AR Package。 圖5-2: arxml描述文件創建啟動 圖5-3:?控制軟件組件arxml描述文件創建界面 ?
5.2.3創建控制軟件組件
按照圖5-4和圖5-5所示的方法創建控制軟件組件。 圖5-4:?軟件組件創建啟動 圖5-5:?控制軟件組件創建操作示意圖 ?
5.2.4文件移動
在“...srcBSW”路徑下找到“Controller_SWC.arxml”,并將其剪切到“...srcASWController_SWCarxml”位置。
5.3接口創建
座椅ECAS控制器需要創建的接口如表5-2所列,下面以“hld_Mw_objectLevel”為例講述S/R接口的設計步驟,其余接口與之類似。 表5-2:座椅ECAS控制器需創建的接口
序號 | 接口 | 接口所包含的數據元素 | ||
接口名稱 | 接口類型 | 數據元素名稱 | 數據元素數據類型 | |
1 | hld_Mw_objectLevel | S/R | hld_Mw_objectLevel | uint16 |
2 | hld_Mw_currentLevel | S/R | hld_Mw_currentLevel | uint16 |
3 | hld_Mb_level_quality | S/R | hld_Mb_level_quality | uint8 |
4 | hld_Msw_precision_upper | S/R | hld_Msw_precision_upper | sint16 |
5 | hld_Msw_precision_lower | S/R | hld_Msw_precision_lower | sint16 |
6 | hld_Mbl_enable | S/R | hld_Mbl_enable | boolean |
7 | hld_Mb_Control_status | S/R | hld_Mb_Control_status | uint8 |
8 | hld_Mbl_is_Control_Over | S/R | hld_Mbl_is_Control_Over | boolean |
5.3.1接口創建
按照圖5-6和5-7所示創建接口。 圖5-6: S/R接口創建啟動 圖5-7:?接口創建過程 ?
5.3.2添加接口的數據元素
按照圖5-8和5-9所示添加接口的數據元素。 圖5-8:?添加接口數據元素 圖5-9:?選擇接口數據元素的數據類型 ?
5.4軟件組件行為設計
下面對表5-1所列3個軟件組件的行為進行設計,按照如下步驟進行。
5.4.1創建軟件組件內部行為
按照圖5-10所示依次創建Controller_SWC、AlgorithmInput_SWC和AlgorithmActuator_SWC的內部行為。 圖5-10:?軟件組件內部行為創建 ?
5.4.2添加軟件組件端口
控制軟件組件、算法輸入軟件組件和算法執行軟件組件須添加的端口分別如表5-3、表5-4和表5-5所列。 表5-3:控制軟件組件端口表
序號 | 端口 | 映射接口 | 說明 | ||
類型 | 名稱 | 類型 | 映射接口名 | ||
1 | RPort | C_RP_Mw_objectLevel | S/R | hld_Mw_objectLevel | 座椅目標高度 |
2 | RPort | C_RP_Mw_currentLevel | S/R | hld_Mw_currentLevel | 座椅當前高度 |
3 | RPort | C_RP_Mb_level_quality | S/R | hld_Mb_level_quality | 質量信號 |
4 | RPort | C_RP_Msw_precision_upper | S/R | hld_Msw_precision_upper | 正向精度值 |
5 | RPort | C_RP_Msw_precision_lower | S/R | hld_Msw_precision_lower | 負向精度值 |
6 | RPort | C_RP_Mbl_enable | S/R | hld_Mbl_enable | 算法控制使能標志 |
7 | PPort | C_PP_Mb_Control_status | S/R | hld_Mb_Control_status | 進氣閥和排氣閥狀態 |
8 | PPort | C_PP_Mbl_is_Control_Over | S/R | hld_Mbl_is_Control_Over | 控制算法調節完畢標志 |
表5-4:算法輸入軟件組件端口表
序號 | 端口 | 映射接口 | 說明 | ||
類型 | 名稱 | 類型 | 映射接口名 | ||
1 | PPort | I_PP_Mw_objectLevel | S/R | hld_Mw_objectLevel | 座椅目標高度 |
2 | PPort | I_PP_Mw_currentLevel | S/R | hld_Mw_currentLevel | 座椅當前高度 |
3 | PPort | I_PP_Mb_level_quality | S/R | hld_Mb_level_quality | 質量信號 |
4 | PPort | I_PP_Msw_precision_upper | S/R | hld_Msw_precision_upper | 正向精度值 |
5 | PPort | I_PP_Msw_precision_lower | S/R | hld_Msw_precision_lower | 負向精度值 |
6 | PPort | I_PP_Mbl_enable | S/R | hld_Mbl_enable | 算法控制使能標志 |
表5-5:算法輸出軟件組件端口表
序號 | 端口 | 映射接口 | 說明 | ||
類型 | 名稱 | 類型 | 映射接口名 | ||
1 | RPort | O_RP_Mb_Control_status | S/R | hld_Mb_Control_status | 進氣閥和排氣閥狀態 |
2 | RPort | O_RP_Mbl_is_Control_Over | S/R | hld_Mbl_is_Control_Over | 控制算法調節完畢標志 |
圖5-11為添加軟件組件端口的方法。 圖5-11:?添加軟件組件端口 ?
5.4.3添加運行實體
運行實體即在SWC中執行的函數。控制軟件組件、算法輸入軟件組件和算法執行軟件組件須添加的運行實體分別如表5-6、表5-7和表5-8所列。 表5-6:控制軟件組件運行實體
序號 | 運行實體名 | 函數名 | 功用 |
1 | Controller_initialize | Controller_initialize | 控制模塊初始化 |
2 | Controller_step | Controller_step | 控制模塊執行步驟 |
表5-7:算法輸入軟件組件運行實體
序號 | 運行實體名 | 函數名 | 功用 |
1 | AlgorithmInput | AlgorithmInput | 控制模塊輸入參數確定和傳遞 |
表5-8:算法執行軟件組件運行實體
序號 | 運行實體名 | 函數名 | 功用 |
1 | AlgorithmOutput | AlgorithmOutput | 控制模塊輸出參數接收和執行 |
圖5-12為添加運行實體的方法。 圖5-12:?添加軟件組件運行實體 ?
5.4.4添加運行實體與所屬軟件組件的端口訪問
本步的目的是添加與SWC中每個運行實體相關的端口,可以簡單的理解為添加某個函數(即運行實體)需要用到的變量(即端口)。這里將控制軟件組件、算法輸入軟件組件和算法執行軟件組件中的全部端口分別添加到Controller_step、AlgorithmInput和AlgorithmOutput運行實體中。 圖5-13為添加運行實體與所屬軟件組件端口訪問的方法。 圖5-13:?添加運行實體與所屬軟件組件的端口訪問 ?
5.4.5添加運行實體的RTE事件
將Controller_step、AlgorithmInput和AlgorithmOutput運行實體均配置為“周期性事件”,周期0.02s。 圖5-14:?添加運行實體的RTE事件 ?
5.5軟件組件添加
前面創建了3個軟件組件及其內部行為,這里將這些SWC與座椅控制器相關聯。
5.5.1將軟件組件加入部件
如果把軟件組件比作程序的“積木”,“部件”就相當于“積木箱”,圖5-15和圖5-16為將SWC加入部件的步驟。 圖5-15:?軟件組件加入部件操作啟動? 圖5-16:?軟件組件加入部件操作 ?
5.5.2將軟件組件映射到座椅控制器
將前面創建的3個SWC映射到座椅ECAS控制器軟件中,如圖5-17所示。 圖5-17:?軟件組件向ECU映射 ?
5.6信號連接
由于座椅ECAS控制器僅涉及到3個SWC間信號的傳遞,故只需要連接“內部信號”即可,如圖5-18和圖5-19所示。 圖5-18:?內部信號連接啟動 圖5-19:?座椅ECAS系統連接的內部信號 ?
5.7運行實體調度
將AlgorithmInput、Controller_step和AlgorithmOutput添加到操作系統20ms周期性執行的任務中,注意次序不要弄反。
5.8代碼生成
接下來就是生成代碼了,分為軟件組件抽取、RTE代碼生成和SWC代碼生成3個步驟。
5.8.1軟件組件抽取
“抽取”的含義就是將屬于座椅ECAS控制器軟件的3個SWC拿過來用,如圖5-20所示(上節的運行實體調度操作應在抽取之后完成)。 圖5-20:?軟件組件抽取操作 ?
5.8.2 RTE代碼生成
如圖5-21所示。
圖5-21: RTE代碼生成操作 ?
5.8.3 SWC代碼生成
座椅ECAS控制器軟件僅需按照圖5-22和圖5-23所示生成算法輸入軟件組件和算法執行軟件組件的代碼,控制軟件組件在simulink環境下建模完成,只需提交Controller_SWC.arxml給應用層就可以了。 圖5-22: SWC代碼生成啟動 ? 圖5-23: SWC代碼生成操作 ?
5.9代碼添加
最后我們看看用AUTOSAR工具鏈自動生成的代碼是什么樣子的,圖5-24和圖5-25分別為算法輸入軟件組件和算法執行軟件組件的代碼截圖。 圖5-24:?算法輸入軟件組件代碼截圖 圖5-25:?算法執行軟件組件代碼截圖 ?
5.10事項說明
下面針對一些未明確事項進行說明。
5.10.1系統信號連接
座椅ECAS控制器軟件沒有涉及到系統信號,但對于大部分車載ECU來說,與車載CAN網絡的交互(從CAN網絡接收數據和向CAN網絡發送數據)是必不可少的,此時可參照圖5-26的方法進行系統信號連接。
圖5-26:?系統信號連接啟動 ?
5.10.2控制軟件組件初始化函數調用
細心的讀者可能會注意到,在工具鏈實現RTE的過程中,并沒有涉及算法模塊初始化函數Controller_initialize的調用。因為這涉及到AUTOSAR的一個重要的BSW模塊- EcuM的使用,我們留待下篇再講,可以期待一下。
6結論
綜上可以看出,單就RTE實現而言,AUTOSAR工具鏈方式要比傳統手工編程方式復雜,但也體現出了如下優點:軟件組件獨立,功能劃分明確;使用標準化接口設計運行時環境,模塊獨立開發便于項目組成員協同工作。特別是在大型車載ECU軟件中,使用AUTOSAR工具鏈方式可以極大的保證軟件質量、縮短開發周期。
-
軟件開發
+關注
關注
0文章
607瀏覽量
27331 -
AUTOSAR
+關注
關注
10文章
350瀏覽量
21479 -
ecu
+關注
關注
14文章
881瀏覽量
54405
原文標題:從手寫代碼到AUTOSAR工具鏈_RTE入門篇
文章出處:【微信號:eng2mot,微信公眾號:汽車ECU開發】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論