文献标识码:A
DOI:10.16157/j.issn.0258-7998.174385
中文引用格式:阴晋冠,苏铁熊,冯云鹏,等. 基于Embedded Coder的ECU数据管理系统开发[J].电子技术应用,2018,44(5):52-55.
英文引用格式:Yin Jinguan,Su Tiexiong,Feng 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软件开发愈加重要[1-2]。对于发动机ECU系统来说,查表模块要满足离线数据烧写和在线标定两方面的需求:离线烧写时将查表模块数据全部定义到固定的Flash区域中,在烧写时,烧写工具将该Flash区域的数据全部烧写为新的值;进行在线标定时,内存管理模块将Flash中的查表模块数据拷贝到RAM中,标定RAM中的查表模块数据,并且让发动机ECU软件读取RAM中的查表模块数据。因此,需要在查表插值函数中,先通过内存管理模块得到查表模块的实际地址,再进行查表插值计算,返回查表结果。而Simulink自带的Lookup Table模块,在生成代码时会自动生成查表插值函数,但是该函数无法调用底层的内存管理模块,只能使用Flash中的查表模块数据进行计算,无法满足在线标定的需求。因此针对原有的底层模块,自定义开发与之匹配的Simulink查表模块是十分有必要的。另外,借鉴传统手写代码中有益的经验,在MATLAB/Simulink环境下开发数据字典对模型中的变量及数据类型进行管理可以减少模型定点化工作,提升开发速度。
1 变量存储管理
Simulink提供了名为Simulink的包(Package),用于描述变量的名称、维数、物理值、取值范围、单位、描述以及数据类型的名称[3]。Simulink包在生成代码时不支持变量的Flash段定义,而是将模型中的变量当做普通变量来处理。另一方面,不同类型的标定变量的存储结构与查表差值函数的接口定义、数据读取方法直接相关。尤其对于曲线和曲面变量,Simulink生成代码时会将模型中的每个变量独立定义,这就导致属于同一CUR/MAP的轴参数等出现分散定义的情况,地址不一定连续,顺序也很可能是混乱的,这对于查表插值函数的影响相对较小,调整函数接口即可顺利读取到变量的轴数据地址,但是这将给a2l文件的生成带来极大麻烦,因为很难通过软件来识别分析每个轴变量分别属于哪个CUR/MAP,也就无法生成正确的描述信息来描述标定变量。所以要设计专门的包将标定变量定义到指定的Flash段中,从而尽可能减小对已有查表插值函数的改动,并且便于手工修改变量,最大限度兼容已有的手写代码的变量结构定义方式。
1.1 数据类型实现
MATLAB中可以表示浮点数和定点数变量,浮点数变量有两种表示方法:一种是矩阵类型的变量,使用双精度浮点数,可在m语言和Simulink中使用;另一种是Parameter数据类,可在Simulink中使用。定点数变量也有两种表示方法:一种是Parameter数据类;另一种是fi对象,适用于m语言。所以本文使用Parameter数据类来表示数据类型[4-5]。另外,根据从前手写代码的经验和规则,使用斜率和偏移来定义定点数,使用单精度浮点数来表示浮点数,并将以前使用的数据类型都导入到MATLAB中。
1.2 变量及其存储实现
在Embedded Coder自动生成代码时,要尽可能按照不同查表模块结构定义方式生成变量。基于Embedded Coder的包自定义适合单片机的包,使得Simulink模型中的变量的各项属性满足在代码生成时的各种要求。建立包的过程如图1所示。
首先创建一个自定义的包,在该包上定义所需的数据类:定义Parameter数据类用于表达标定变量,定义Signal数据类用于表达监控变量。各数据类的属性会默认继承Simulink包中相应数据类的属性。发动机电控系统的查表模块必须定义在指定的Flash段空间内,所以需要定义数据类的自定义储存类CSC(Custom Storage Class)来定制变量的储存属性,例如数据类型(结构体或非结构体)、内存块Memory Section(定义变量声明和定义所在的储存区域)、链接属性(是否声明为外部变量)等属性。
2 创建查表模块
查表模块用于在模型中使用定点或浮点数据查表进行建模仿真,在创建查表模块时可以分为两个步骤:查表模块的封装和相应的底层内存管理模块封装。
2.1 查表模块封装
查表模块要在Simulink中进行使用,在Simulink环境中可以封装S函数来实现自定义功能。使用C语言编写查表模块的S函数。查表模块S函数模块的开发流程如图2所示,主要分为编写S函数文件和S函数模块封装两部分。下面以曲线(Curve)模块为例来详细描述如何创建查表模块。
曲线插值查表模块含有1个输入、1个输出和7个参数,7个参数分别为:(1)CUR的x轴变量;(2)CUR的y轴变量;(3)CUR的x轴数据类型;(4)CUR的y轴数据类型;(5)CUR的x轴数据类型编号;(6)CUR的y轴数据类型编号;(7)CUR名称。
首先,根据曲线插值查表模块的特性编写S函数的C源代码,其中须包含Simulink规定的必须有的宏定义和头文件,针对查表模块还应当包含定点数相关的头文件等;实现参数的获取和设置的各种回调方法,具体包括:
(1)初始化回调:设置S函数的参数信息、状态信息、输入输出端口信息、采样时间信息、工作向量信息、仿真选项,具体流程如图3所示。
(2)参数检查回调,用来检查x轴数据类型名称、维数、单调性是否有效,检查y轴数据类型名称是否有效、维数是否与x轴一致,具体流程如图4所示。
(3)采样时间回调:设置采样时间信息,具体流程如图5所示。
(4)运行时参数回调:用来建立运行时参数(Run-Time Parameter),即将CUR的轴变量注册成为运行时参数以获取其储存值,具体流程如图6所示。
(5)输出回调:用来获取输入、CUR数据,设置输出,流程如图7所示。
(6)RTW回调:用户来将参数传递给RTW文件,具体流程如图8所示。
然后,将C源代码编译为mex文件。在Simulink中自建模块库,使用S-Function模块完成参数封装,并与mex文件链接,完成查表模块的封装。
2.2 底层内存管理模块封装
继续以曲线插值查表模块为例,为使该模块生成的代码能够与底层库中的查表插值函数和内存管理函数相结合,定义以下接口方式使得曲线插值查表模块生成如下格式的代码来调用查表插值函数:
输出=曲线查表插值函数(x轴Flash地址,x轴点数,x输入)
在底层库的查表插值函数中,首先调用内存管理模块的接口函数,根据CUR的Flash地址查得其RAM地址,再读取RAM地址中的CUR,进行查表插值。在代码生成时,CUR模块要生成两部分代码:一是要生成头文件中的查表插值函数的声明语句,只需生成一遍;二是对于每个CUR模块生成一次查表插值函数调用语句。底层内存管理模块封装具体流程如图9所示。
3 仿真与代码实验
在发动机控制系统中使用的数据类型基本上是定点数数据类型。本节以无符号、16位、斜率为2-5、偏移为0的定点类型为例,研究运用定点数所建立的查表模块在仿真和生成代码中的表现。实验通过两个定点数进行加法、减法、乘法、除法的不溢出和溢出计算来比较定点运算在仿真和代码中的表现。仿真设计如图10所示。
实验中,定点数a_fixed等于1,通过Lookp_1D_CUR查表模块得出输出为7.11,由于该定点类型的精度为0.031 25,因此查表得出的输出为7.125。另一个定点数b_fixed等于11.7,同样也丢失了一些精度,但在工程应用中还可以接受。从图10中可以看出,对于不溢出的加法、减法、乘法、不除0除法运算,计算结果受两个输入的影响也损失了一定精度。除0在理论上是不存在的,仿真实验中计算结果为2 047.968 75,即储存值达到最大值为65 535。d_fixed+e_fixed实验了溢出加法计算,a_fixed查表后的结果减去b_fixed实验了溢出减法计算,d_fixed与f_fixed相乘实验了溢出乘法计算,其结果如图10所示,与理论计算结果一致。
将该实验模型生成代码后查看其代码的表现,结果显示在进行加法、减法、乘法计算时,单片机中的计算结果与前述仿真结果一致。在进行除法计算时,单片机中的计算结果为:如果被除数小于除数,则结果为0,否则结果为商的整数部分。这与仿真结果明显不同。这是因为Simulink的除法模块在进行除法计算时,是先将除数与被除数当做浮点数来计算浮点形式的商,然后再用定点类型来显示这个商。这是定点代码在代码中的表现与在仿真中的表现的最大差异处。
4 结论
本文基于Embedded Coder 进行了发动机的变量存储管理、查表模块封装和底层内存管理模块封装,从而定制了生成代码中的变量定义方式和储存方式,并将其与底层库中的查表插值函数接口相匹配,使得查表模块可以进行仿真计算、离线数据标定,其生成发动机控制代码能够支持在线标定和离线烧写。仿真和代码实验结果表明,所建查表模块可以满足开发需求;定点数在仿真和代码中的表示都会损失一定的精度;定点数在仿真和代码中进行加法、减法、乘法计算结果一致,除法计算会有差异。
参考文献
[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.中北大学 机电工程学院,山西 太原030051;
2.北京特种车辆研究所,北京100072;3.中国北方发动机研究所,天津300400)