文獻(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語(yǔ)言和Simulink中使用,;另一種是Parameter數(shù)據(jù)類,,可在Simulink中使用。定點(diǎn)數(shù)變量也有兩種表示方法:一種是Parameter數(shù)據(jù)類,;另一種是fi對(duì)象,,適用于m語(yǔ)言。所以本文使用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語(yǔ)言編寫查表模塊的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中自建模塊庫(kù),使用S-Function模塊完成參數(shù)封裝,,并與mex文件鏈接,,完成查表模塊的封裝。
2.2 底層內(nèi)存管理模塊封裝
繼續(xù)以曲線插值查表模塊為例,,為使該模塊生成的代碼能夠與底層庫(kù)中的查表插值函數(shù)和內(nèi)存管理函數(shù)相結(jié)合,,定義以下接口方式使得曲線插值查表模塊生成如下格式的代碼來調(diào)用查表插值函數(shù):
輸出=曲線查表插值函數(shù)(x軸Flash地址,x軸點(diǎn)數(shù),,x輸入)
在底層庫(kù)的查表插值函數(shù)中,,首先調(diào)用內(nèi)存管理模塊的接口函數(shù),根據(jù)CUR的Flash地址查得其RAM地址,,再讀取RAM地址中的CUR,,進(jìn)行查表插值。在代碼生成時(shí),CUR模塊要生成兩部分代碼:一是要生成頭文件中的查表插值函數(shù)的聲明語(yǔ)句,,只需生成一遍,;二是對(duì)于每個(gè)CUR模塊生成一次查表插值函數(shù)調(diào)用語(yǔ)句。底層內(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ǔ)存方式,并將其與底層庫(kù)中的查表插值函數(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.中國(guó)北方發(fā)動(dòng)機(jī)研究所,,天津300400)