文獻(xiàn)標(biāo)識碼: A
DOI:10.16157/j.issn.0258-7998.174385
中文引用格式: 陰晉冠,蘇鐵熊,馮云鵬,等. 基于Embedded Coder的ECU數(shù)據(jù)管理系統(tǒng)開發(fā)[J].電子技術(shù)應(yīng)用,2018,44(5):52-55.
英文引用格式: Yin Jinguan,Su Tiexiong,F(xiàn)eng Yunpeng,et al. The development of data management system for ECU based on the Embedded Coder[J]. Application of Electronic Technique,2018,44(5):52-55.
0 引言
基于模型的ECU軟件開發(fā)愈加重要[1-2]。對于發(fā)動機(jī)ECU系統(tǒng)來說,查表模塊要滿足離線數(shù)據(jù)燒寫和在線標(biāo)定兩方面的需求:離線燒寫時將查表模塊數(shù)據(jù)全部定義到固定的Flash區(qū)域中,在燒寫時,燒寫工具將該Flash區(qū)域的數(shù)據(jù)全部燒寫為新的值;進(jìn)行在線標(biāo)定時,內(nèi)存管理模塊將Flash中的查表模塊數(shù)據(jù)拷貝到RAM中,標(biāo)定RAM中的查表模塊數(shù)據(jù),并且讓發(fā)動機(jī)ECU軟件讀取RAM中的查表模塊數(shù)據(jù)。因此,需要在查表插值函數(shù)中,先通過內(nèi)存管理模塊得到查表模塊的實際地址,再進(jìn)行查表插值計算,返回查表結(jié)果。而Simulink自帶的Lookup Table模塊,在生成代碼時會自動生成查表插值函數(shù),但是該函數(shù)無法調(diào)用底層的內(nèi)存管理模塊,只能使用Flash中的查表模塊數(shù)據(jù)進(jìn)行計算,無法滿足在線標(biāo)定的需求。因此針對原有的底層模塊,自定義開發(fā)與之匹配的Simulink查表模塊是十分有必要的。另外,借鑒傳統(tǒng)手寫代碼中有益的經(jīng)驗,在MATLAB/Simulink環(huán)境下開發(fā)數(shù)據(jù)字典對模型中的變量及數(shù)據(jù)類型進(jìn)行管理可以減少模型定點化工作,提升開發(fā)速度。
1 變量存儲管理
Simulink提供了名為Simulink的包(Package),用于描述變量的名稱、維數(shù)、物理值、取值范圍、單位、描述以及數(shù)據(jù)類型的名稱[3]。Simulink包在生成代碼時不支持變量的Flash段定義,而是將模型中的變量當(dāng)做普通變量來處理。另一方面,不同類型的標(biāo)定變量的存儲結(jié)構(gòu)與查表差值函數(shù)的接口定義、數(shù)據(jù)讀取方法直接相關(guān)。尤其對于曲線和曲面變量,Simulink生成代碼時會將模型中的每個變量獨立定義,這就導(dǎo)致屬于同一CUR/MAP的軸參數(shù)等出現(xiàn)分散定義的情況,地址不一定連續(xù),順序也很可能是混亂的,這對于查表插值函數(shù)的影響相對較小,調(diào)整函數(shù)接口即可順利讀取到變量的軸數(shù)據(jù)地址,但是這將給a2l文件的生成帶來極大麻煩,因為很難通過軟件來識別分析每個軸變量分別屬于哪個CUR/MAP,也就無法生成正確的描述信息來描述標(biāo)定變量。所以要設(shè)計專門的包將標(biāo)定變量定義到指定的Flash段中,從而盡可能減小對已有查表插值函數(shù)的改動,并且便于手工修改變量,最大限度兼容已有的手寫代碼的變量結(jié)構(gòu)定義方式。
1.1 數(shù)據(jù)類型實現(xiàn)
MATLAB中可以表示浮點數(shù)和定點數(shù)變量,浮點數(shù)變量有兩種表示方法:一種是矩陣類型的變量,使用雙精度浮點數(shù),可在m語言和Simulink中使用;另一種是Parameter數(shù)據(jù)類,可在Simulink中使用。定點數(shù)變量也有兩種表示方法:一種是Parameter數(shù)據(jù)類;另一種是fi對象,適用于m語言。所以本文使用Parameter數(shù)據(jù)類來表示數(shù)據(jù)類型[4-5]。另外,根據(jù)從前手寫代碼的經(jīng)驗和規(guī)則,使用斜率和偏移來定義定點數(shù),使用單精度浮點數(shù)來表示浮點數(shù),并將以前使用的數(shù)據(jù)類型都導(dǎo)入到MATLAB中。
1.2 變量及其存儲實現(xiàn)
在Embedded Coder自動生成代碼時,要盡可能按照不同查表模塊結(jié)構(gòu)定義方式生成變量?;贓mbedded Coder的包自定義適合單片機(jī)的包,使得Simulink模型中的變量的各項屬性滿足在代碼生成時的各種要求。建立包的過程如圖1所示。
首先創(chuàng)建一個自定義的包,在該包上定義所需的數(shù)據(jù)類:定義Parameter數(shù)據(jù)類用于表達(dá)標(biāo)定變量,定義Signal數(shù)據(jù)類用于表達(dá)監(jiān)控變量。各數(shù)據(jù)類的屬性會默認(rèn)繼承Simulink包中相應(yīng)數(shù)據(jù)類的屬性。發(fā)動機(jī)電控系統(tǒng)的查表模塊必須定義在指定的Flash段空間內(nèi),所以需要定義數(shù)據(jù)類的自定義儲存類CSC(Custom Storage Class)來定制變量的儲存屬性,例如數(shù)據(jù)類型(結(jié)構(gòu)體或非結(jié)構(gòu)體)、內(nèi)存塊Memory Section(定義變量聲明和定義所在的儲存區(qū)域)、鏈接屬性(是否聲明為外部變量)等屬性。
2 創(chuàng)建查表模塊
查表模塊用于在模型中使用定點或浮點數(shù)據(jù)查表進(jìn)行建模仿真,在創(chuàng)建查表模塊時可以分為兩個步驟:查表模塊的封裝和相應(yīng)的底層內(nèi)存管理模塊封裝。
2.1 查表模塊封裝
查表模塊要在Simulink中進(jìn)行使用,在Simulink環(huán)境中可以封裝S函數(shù)來實現(xiàn)自定義功能。使用C語言編寫查表模塊的S函數(shù)。查表模塊S函數(shù)模塊的開發(fā)流程如圖2所示,主要分為編寫S函數(shù)文件和S函數(shù)模塊封裝兩部分。下面以曲線(Curve)模塊為例來詳細(xì)描述如何創(chuàng)建查表模塊。
曲線插值查表模塊含有1個輸入、1個輸出和7個參數(shù),7個參數(shù)分別為:(1)CUR的x軸變量;(2)CUR的y軸變量;(3)CUR的x軸數(shù)據(jù)類型;(4)CUR的y軸數(shù)據(jù)類型;(5)CUR的x軸數(shù)據(jù)類型編號;(6)CUR的y軸數(shù)據(jù)類型編號;(7)CUR名稱。
首先,根據(jù)曲線插值查表模塊的特性編寫S函數(shù)的C源代碼,其中須包含Simulink規(guī)定的必須有的宏定義和頭文件,針對查表模塊還應(yīng)當(dāng)包含定點數(shù)相關(guān)的頭文件等;實現(xiàn)參數(shù)的獲取和設(shè)置的各種回調(diào)方法,具體包括:
(1)初始化回調(diào):設(shè)置S函數(shù)的參數(shù)信息、狀態(tài)信息、輸入輸出端口信息、采樣時間信息、工作向量信息、仿真選項,具體流程如圖3所示。
(2)參數(shù)檢查回調(diào),用來檢查x軸數(shù)據(jù)類型名稱、維數(shù)、單調(diào)性是否有效,檢查y軸數(shù)據(jù)類型名稱是否有效、維數(shù)是否與x軸一致,具體流程如圖4所示。
(3)采樣時間回調(diào):設(shè)置采樣時間信息,具體流程如圖5所示。
(4)運行時參數(shù)回調(diào):用來建立運行時參數(shù)(Run-Time Parameter),即將CUR的軸變量注冊成為運行時參數(shù)以獲取其儲存值,具體流程如圖6所示。
(5)輸出回調(diào):用來獲取輸入、CUR數(shù)據(jù),設(shè)置輸出,流程如圖7所示。
(6)RTW回調(diào):用戶來將參數(shù)傳遞給RTW文件,具體流程如圖8所示。
然后,將C源代碼編譯為mex文件。在Simulink中自建模塊庫,使用S-Function模塊完成參數(shù)封裝,并與mex文件鏈接,完成查表模塊的封裝。
2.2 底層內(nèi)存管理模塊封裝
繼續(xù)以曲線插值查表模塊為例,為使該模塊生成的代碼能夠與底層庫中的查表插值函數(shù)和內(nèi)存管理函數(shù)相結(jié)合,定義以下接口方式使得曲線插值查表模塊生成如下格式的代碼來調(diào)用查表插值函數(shù):
輸出=曲線查表插值函數(shù)(x軸Flash地址,x軸點數(shù),x輸入)
在底層庫的查表插值函數(shù)中,首先調(diào)用內(nèi)存管理模塊的接口函數(shù),根據(jù)CUR的Flash地址查得其RAM地址,再讀取RAM地址中的CUR,進(jìn)行查表插值。在代碼生成時,CUR模塊要生成兩部分代碼:一是要生成頭文件中的查表插值函數(shù)的聲明語句,只需生成一遍;二是對于每個CUR模塊生成一次查表插值函數(shù)調(diào)用語句。底層內(nèi)存管理模塊封裝具體流程如圖9所示。
3 仿真與代碼實驗
在發(fā)動機(jī)控制系統(tǒng)中使用的數(shù)據(jù)類型基本上是定點數(shù)數(shù)據(jù)類型。本節(jié)以無符號、16位、斜率為2-5、偏移為0的定點類型為例,研究運用定點數(shù)所建立的查表模塊在仿真和生成代碼中的表現(xiàn)。實驗通過兩個定點數(shù)進(jìn)行加法、減法、乘法、除法的不溢出和溢出計算來比較定點運算在仿真和代碼中的表現(xiàn)。仿真設(shè)計如圖10所示。
實驗中,定點數(shù)a_fixed等于1,通過Lookp_1D_CUR查表模塊得出輸出為7.11,由于該定點類型的精度為0.031 25,因此查表得出的輸出為7.125。另一個定點數(shù)b_fixed等于11.7,同樣也丟失了一些精度,但在工程應(yīng)用中還可以接受。從圖10中可以看出,對于不溢出的加法、減法、乘法、不除0除法運算,計算結(jié)果受兩個輸入的影響也損失了一定精度。除0在理論上是不存在的,仿真實驗中計算結(jié)果為2 047.968 75,即儲存值達(dá)到最大值為65 535。d_fixed+e_fixed實驗了溢出加法計算,a_fixed查表后的結(jié)果減去b_fixed實驗了溢出減法計算,d_fixed與f_fixed相乘實驗了溢出乘法計算,其結(jié)果如圖10所示,與理論計算結(jié)果一致。
將該實驗?zāi)P蜕纱a后查看其代碼的表現(xiàn),結(jié)果顯示在進(jìn)行加法、減法、乘法計算時,單片機(jī)中的計算結(jié)果與前述仿真結(jié)果一致。在進(jìn)行除法計算時,單片機(jī)中的計算結(jié)果為:如果被除數(shù)小于除數(shù),則結(jié)果為0,否則結(jié)果為商的整數(shù)部分。這與仿真結(jié)果明顯不同。這是因為Simulink的除法模塊在進(jìn)行除法計算時,是先將除數(shù)與被除數(shù)當(dāng)做浮點數(shù)來計算浮點形式的商,然后再用定點類型來顯示這個商。這是定點代碼在代碼中的表現(xiàn)與在仿真中的表現(xiàn)的最大差異處。
4 結(jié)論
本文基于Embedded Coder 進(jìn)行了發(fā)動機(jī)的變量存儲管理、查表模塊封裝和底層內(nèi)存管理模塊封裝,從而定制了生成代碼中的變量定義方式和儲存方式,并將其與底層庫中的查表插值函數(shù)接口相匹配,使得查表模塊可以進(jìn)行仿真計算、離線數(shù)據(jù)標(biāo)定,其生成發(fā)動機(jī)控制代碼能夠支持在線標(biāo)定和離線燒寫。仿真和代碼實驗結(jié)果表明,所建查表模塊可以滿足開發(fā)需求;定點數(shù)在仿真和代碼中的表示都會損失一定的精度;定點數(shù)在仿真和代碼中進(jìn)行加法、減法、乘法計算結(jié)果一致,除法計算會有差異。
參考文獻(xiàn)
[1] DILLABER E,KENDRICK L,JIN W,et al.Pragmatic strategies for adopting model-based design for embedded applications[J].SAE Technical Paper,2010,2010-01-0935.
[2] HODGE G,YE J,STUART W.Multi-tar-get modeling for embedded software devel-opment for automotive applications[J].SAE Technical Paper,2004,2004-01-0269.
[3] The Math Works Inc.Embedded Coder reference[Z].2015.
[4] ERKKINEN T.Fixed-point ECU development with model-based design[J].SAE Technical Paper,2008,2008-01-0744.
[5] REDDY V,NADARAJAH S,BEALS G.Tips for fixed-point modeling and code generation for simulink[EB/OL].[2017-10-23].http://cn.mathworks.com/matlabcentral/fileexchange/7197-tips-for-fixed-point-modeling-and-code-generation-for-simulink-6.
作者信息:
陰晉冠1,蘇鐵熊1,馮云鵬2,劉 濤3,賈 利3,周慧芳3,張艷崗1
(1.中北大學(xué) 機(jī)電工程學(xué)院,山西 太原030051;
2.北京特種車輛研究所,北京100072;3.中國北方發(fā)動機(jī)研究所,天津300400)