文獻(xiàn)標(biāo)識(shí)碼: 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]。對(duì)于發(fā)動(dòng)機(jī)ECU系統(tǒng)來說,,查表模塊要滿足離線數(shù)據(jù)燒寫和在線標(biāo)定兩方面的需求:離線燒寫時(shí)將查表模塊數(shù)據(jù)全部定義到固定的Flash區(qū)域中,,在燒寫時(shí),燒寫工具將該Flash區(qū)域的數(shù)據(jù)全部燒寫為新的值,;進(jìn)行在線標(biāo)定時(shí),,內(nèi)存管理模塊將Flash中的查表模塊數(shù)據(jù)拷貝到RAM中,標(biāo)定RAM中的查表模塊數(shù)據(jù),,并且讓發(fā)動(dòng)機(jī)ECU軟件讀取RAM中的查表模塊數(shù)據(jù),。因此,需要在查表插值函數(shù)中,,先通過內(nèi)存管理模塊得到查表模塊的實(shí)際地址,,再進(jìn)行查表插值計(jì)算,返回查表結(jié)果,。而Simulink自帶的Lookup Table模塊,,在生成代碼時(shí)會(huì)自動(dòng)生成查表插值函數(shù),但是該函數(shù)無法調(diào)用底層的內(nèi)存管理模塊,,只能使用Flash中的查表模塊數(shù)據(jù)進(jìn)行計(jì)算,,無法滿足在線標(biāo)定的需求。因此針對(duì)原有的底層模塊,,自定義開發(fā)與之匹配的Simulink查表模塊是十分有必要的。另外,,借鑒傳統(tǒng)手寫代碼中有益的經(jīng)驗(yàn),,在MATLAB/Simulink環(huán)境下開發(fā)數(shù)據(jù)字典對(duì)模型中的變量及數(shù)據(jù)類型進(jìn)行管理可以減少模型定點(diǎn)化工作,提升開發(fā)速度,。
1 變量存儲(chǔ)管理
Simulink提供了名為Simulink的包(Package),,用于描述變量的名稱、維數(shù),、物理值,、取值范圍、單位、描述以及數(shù)據(jù)類型的名稱[3],。Simulink包在生成代碼時(shí)不支持變量的Flash段定義,,而是將模型中的變量當(dāng)做普通變量來處理。另一方面,,不同類型的標(biāo)定變量的存儲(chǔ)結(jié)構(gòu)與查表差值函數(shù)的接口定義,、數(shù)據(jù)讀取方法直接相關(guān)。尤其對(duì)于曲線和曲面變量,,Simulink生成代碼時(shí)會(huì)將模型中的每個(gè)變量獨(dú)立定義,,這就導(dǎo)致屬于同一CUR/MAP的軸參數(shù)等出現(xiàn)分散定義的情況,地址不一定連續(xù),,順序也很可能是混亂的,,這對(duì)于查表插值函數(shù)的影響相對(duì)較小,調(diào)整函數(shù)接口即可順利讀取到變量的軸數(shù)據(jù)地址,,但是這將給a2l文件的生成帶來極大麻煩,,因?yàn)楹茈y通過軟件來識(shí)別分析每個(gè)軸變量分別屬于哪個(gè)CUR/MAP,也就無法生成正確的描述信息來描述標(biāo)定變量,。所以要設(shè)計(jì)專門的包將標(biāo)定變量定義到指定的Flash段中,,從而盡可能減小對(duì)已有查表插值函數(shù)的改動(dòng),并且便于手工修改變量,,最大限度兼容已有的手寫代碼的變量結(jié)構(gòu)定義方式,。
1.1 數(shù)據(jù)類型實(shí)現(xiàn)
MATLAB中可以表示浮點(diǎn)數(shù)和定點(diǎn)數(shù)變量,浮點(diǎn)數(shù)變量有兩種表示方法:一種是矩陣類型的變量,,使用雙精度浮點(diǎn)數(shù),,可在m語言和Simulink中使用;另一種是Parameter數(shù)據(jù)類,,可在Simulink中使用,。定點(diǎn)數(shù)變量也有兩種表示方法:一種是Parameter數(shù)據(jù)類;另一種是fi對(duì)象,,適用于m語言,。所以本文使用Parameter數(shù)據(jù)類來表示數(shù)據(jù)類型[4-5]。另外,,根據(jù)從前手寫代碼的經(jīng)驗(yàn)和規(guī)則,,使用斜率和偏移來定義定點(diǎn)數(shù),使用單精度浮點(diǎn)數(shù)來表示浮點(diǎn)數(shù),,并將以前使用的數(shù)據(jù)類型都導(dǎo)入到MATLAB中,。
1.2 變量及其存儲(chǔ)實(shí)現(xiàn)
在Embedded Coder自動(dòng)生成代碼時(shí),要盡可能按照不同查表模塊結(jié)構(gòu)定義方式生成變量,?;贓mbedded Coder的包自定義適合單片機(jī)的包,使得Simulink模型中的變量的各項(xiàng)屬性滿足在代碼生成時(shí)的各種要求。建立包的過程如圖1所示。
首先創(chuàng)建一個(gè)自定義的包,,在該包上定義所需的數(shù)據(jù)類:定義Parameter數(shù)據(jù)類用于表達(dá)標(biāo)定變量,,定義Signal數(shù)據(jù)類用于表達(dá)監(jiān)控變量。各數(shù)據(jù)類的屬性會(huì)默認(rèn)繼承Simulink包中相應(yīng)數(shù)據(jù)類的屬性,。發(fā)動(dòng)機(jī)電控系統(tǒng)的查表模塊必須定義在指定的Flash段空間內(nèi),,所以需要定義數(shù)據(jù)類的自定義儲(chǔ)存類CSC(Custom Storage Class)來定制變量的儲(chǔ)存屬性,例如數(shù)據(jù)類型(結(jié)構(gòu)體或非結(jié)構(gòu)體),、內(nèi)存塊Memory Section(定義變量聲明和定義所在的儲(chǔ)存區(qū)域),、鏈接屬性(是否聲明為外部變量)等屬性。
2 創(chuàng)建查表模塊
查表模塊用于在模型中使用定點(diǎn)或浮點(diǎn)數(shù)據(jù)查表進(jìn)行建模仿真,,在創(chuàng)建查表模塊時(shí)可以分為兩個(gè)步驟:查表模塊的封裝和相應(yīng)的底層內(nèi)存管理模塊封裝,。
2.1 查表模塊封裝
查表模塊要在Simulink中進(jìn)行使用,在Simulink環(huán)境中可以封裝S函數(shù)來實(shí)現(xiàn)自定義功能,。使用C語言編寫查表模塊的S函數(shù),。查表模塊S函數(shù)模塊的開發(fā)流程如圖2所示,主要分為編寫S函數(shù)文件和S函數(shù)模塊封裝兩部分,。下面以曲線(Curve)模塊為例來詳細(xì)描述如何創(chuàng)建查表模塊,。
曲線插值查表模塊含有1個(gè)輸入、1個(gè)輸出和7個(gè)參數(shù),,7個(gè)參數(shù)分別為:(1)CUR的x軸變量,;(2)CUR的y軸變量;(3)CUR的x軸數(shù)據(jù)類型,;(4)CUR的y軸數(shù)據(jù)類型,;(5)CUR的x軸數(shù)據(jù)類型編號(hào);(6)CUR的y軸數(shù)據(jù)類型編號(hào),;(7)CUR名稱,。
首先,根據(jù)曲線插值查表模塊的特性編寫S函數(shù)的C源代碼,,其中須包含Simulink規(guī)定的必須有的宏定義和頭文件,,針對(duì)查表模塊還應(yīng)當(dāng)包含定點(diǎn)數(shù)相關(guān)的頭文件等;實(shí)現(xiàn)參數(shù)的獲取和設(shè)置的各種回調(diào)方法,,具體包括:
(1)初始化回調(diào):設(shè)置S函數(shù)的參數(shù)信息,、狀態(tài)信息、輸入輸出端口信息,、采樣時(shí)間信息、工作向量信息,、仿真選項(xiàng),,具體流程如圖3所示。
(2)參數(shù)檢查回調(diào),用來檢查x軸數(shù)據(jù)類型名稱,、維數(shù),、單調(diào)性是否有效,檢查y軸數(shù)據(jù)類型名稱是否有效,、維數(shù)是否與x軸一致,,具體流程如圖4所示。
(3)采樣時(shí)間回調(diào):設(shè)置采樣時(shí)間信息,,具體流程如圖5所示,。
(4)運(yùn)行時(shí)參數(shù)回調(diào):用來建立運(yùn)行時(shí)參數(shù)(Run-Time Parameter),即將CUR的軸變量注冊(cè)成為運(yùn)行時(shí)參數(shù)以獲取其儲(chǔ)存值,,具體流程如圖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軸點(diǎn)數(shù),x輸入)
在底層庫的查表插值函數(shù)中,,首先調(diào)用內(nèi)存管理模塊的接口函數(shù),,根據(jù)CUR的Flash地址查得其RAM地址,再讀取RAM地址中的CUR,,進(jìn)行查表插值,。在代碼生成時(shí),CUR模塊要生成兩部分代碼:一是要生成頭文件中的查表插值函數(shù)的聲明語句,,只需生成一遍,;二是對(duì)于每個(gè)CUR模塊生成一次查表插值函數(shù)調(diào)用語句。底層內(nèi)存管理模塊封裝具體流程如圖9所示,。
3 仿真與代碼實(shí)驗(yàn)
在發(fā)動(dòng)機(jī)控制系統(tǒng)中使用的數(shù)據(jù)類型基本上是定點(diǎn)數(shù)數(shù)據(jù)類型,。本節(jié)以無符號(hào),、16位、斜率為2-5,、偏移為0的定點(diǎn)類型為例,,研究運(yùn)用定點(diǎn)數(shù)所建立的查表模塊在仿真和生成代碼中的表現(xiàn)。實(shí)驗(yàn)通過兩個(gè)定點(diǎn)數(shù)進(jìn)行加法,、減法,、乘法、除法的不溢出和溢出計(jì)算來比較定點(diǎn)運(yùn)算在仿真和代碼中的表現(xiàn),。仿真設(shè)計(jì)如圖10所示,。
實(shí)驗(yàn)中,定點(diǎn)數(shù)a_fixed等于1,,通過Lookp_1D_CUR查表模塊得出輸出為7.11,,由于該定點(diǎn)類型的精度為0.031 25,因此查表得出的輸出為7.125,。另一個(gè)定點(diǎn)數(shù)b_fixed等于11.7,,同樣也丟失了一些精度,但在工程應(yīng)用中還可以接受,。從圖10中可以看出,,對(duì)于不溢出的加法、減法,、乘法,、不除0除法運(yùn)算,計(jì)算結(jié)果受兩個(gè)輸入的影響也損失了一定精度,。除0在理論上是不存在的,,仿真實(shí)驗(yàn)中計(jì)算結(jié)果為2 047.968 75,即儲(chǔ)存值達(dá)到最大值為65 535,。d_fixed+e_fixed實(shí)驗(yàn)了溢出加法計(jì)算,,a_fixed查表后的結(jié)果減去b_fixed實(shí)驗(yàn)了溢出減法計(jì)算,d_fixed與f_fixed相乘實(shí)驗(yàn)了溢出乘法計(jì)算,,其結(jié)果如圖10所示,,與理論計(jì)算結(jié)果一致。
將該實(shí)驗(yàn)?zāi)P蜕纱a后查看其代碼的表現(xiàn),,結(jié)果顯示在進(jìn)行加法,、減法、乘法計(jì)算時(shí),,單片機(jī)中的計(jì)算結(jié)果與前述仿真結(jié)果一致,。在進(jìn)行除法計(jì)算時(shí),單片機(jī)中的計(jì)算結(jié)果為:如果被除數(shù)小于除數(shù),,則結(jié)果為0,,否則結(jié)果為商的整數(shù)部分,。這與仿真結(jié)果明顯不同,。這是因?yàn)镾imulink的除法模塊在進(jìn)行除法計(jì)算時(shí),,是先將除數(shù)與被除數(shù)當(dāng)做浮點(diǎn)數(shù)來計(jì)算浮點(diǎn)形式的商,然后再用定點(diǎn)類型來顯示這個(gè)商,。這是定點(diǎn)代碼在代碼中的表現(xiàn)與在仿真中的表現(xiàn)的最大差異處,。
4 結(jié)論
本文基于Embedded Coder 進(jìn)行了發(fā)動(dòng)機(jī)的變量存儲(chǔ)管理、查表模塊封裝和底層內(nèi)存管理模塊封裝,,從而定制了生成代碼中的變量定義方式和儲(chǔ)存方式,,并將其與底層庫中的查表插值函數(shù)接口相匹配,使得查表模塊可以進(jìn)行仿真計(jì)算,、離線數(shù)據(jù)標(biāo)定,,其生成發(fā)動(dòng)機(jī)控制代碼能夠支持在線標(biāo)定和離線燒寫。仿真和代碼實(shí)驗(yàn)結(jié)果表明,,所建查表模塊可以滿足開發(fā)需求,;定點(diǎn)數(shù)在仿真和代碼中的表示都會(huì)損失一定的精度;定點(diǎn)數(shù)在仿真和代碼中進(jìn)行加法,、減法,、乘法計(jì)算結(jié)果一致,除法計(jì)算會(huì)有差異,。
參考文獻(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ā)動(dòng)機(jī)研究所,天津300400)