APP下载

基于Simulink的MC9S12XEP100底层自动代码生成设计

2023-05-30张陆达严天一桂永建赵剑桥赵培通张方明

关键词:代码生成底层代码

张陆达 严天一 桂永建 赵剑桥 赵培通 张方明

摘要:针对传统汽车电子控制单元设计开发过程中存在的手工编程效率低、可靠性差和开发周期长等问题,本文提出一种基于Simulink自动代码生成技术的设计方法。在Matlab/Simulink环境下,对NXP公司16位单片机MC9S12XEP100编写包含系统目标文件在内的控制文件,实现嵌入式C代码生成。同时,编写C MEX S函数及模块目标语言编译器(target language compiler,TLC)文件,并进行封装,实现该款芯片各底层驱动模块代码内嵌,添加至Simulink模块库,在Simulink中对底层模块进行模型搭建,并生成嵌入式代码进行硬件在环测试。测试结果表明,本文所设计的底层自动代码生成技术,实现了底层代码的自动配置,同时与应用层代码结合,实现CAN车速报文接收和定时发送,所解析的车速信号与Simulink模拟车速信号对比一致,验证了本文所设计的底层驱动模块的高效性和可行性。该研究能够有效解决项目研发过程中底层代码配置复杂的问题。

关键词:MC9S12XEP100; Simulink; 自动代码生成; 底层驱动模块

中图分类号:U463.6 文献标识码:A

文章编号:1006-9798(2023)02-0082-08; DOI:10.13306/j.1006-9798.2023.02.012

基金项目:山东省自然科学基金面上项目(ZR2016EEM49); 国家自然科学基金资助项目(51475248)

作者简介:张陆达(1998-),男,硕士研究生,主要研究方向为汽车底盘电子控制技术。

通信作者:张方明(1985-),男,博士,主要研究方向为车辆动力学及其控制技术、汽车零部件设计及优化。Email:f_m_zhang@163.com

随着汽车电子行业的飞速发展,对电子控制单元的硬件与软件系统要求不断提高,代码数量和复杂程度也在不断提升。由于传统的电子控制系统开发流程存在更新速度慢、人工编程易出错等明显问题,已逐步被先进的V模型开发流程所取代。在Matlab/Simulink环境下进行的V模型开发流程中,自动代码生成技术是其中最重要环节,可显著缩短开发周期,并提高最终代码质量和产品的可靠性[1]。仲飞等人[2]基于Simulink自动代码生成工具箱,实现机械手控制算法及I/O硬件模块的自动生成。针对汽车电子控制单元控制器局域網络(controller area network,CAN)通讯存在的报文数据多、手动编程效率低等问题,汪伟等人[3]采用S-Function设计,编写并配置面向Infineon TC21x芯片的CAN收发模块,并使用Simulink实现了自动代码生成,验证了所编写CAN底层模块库的可用性;万彪[4]利用Matlab语言编写控制板底层驱动接口函数并进行封装,同时采用Simulink自动代码生成工具,快速生成各个模块的驱动代码,该代码生成技术具有较强的适用性;严天一等人[5-6]利用实时工作空间(real-time workshop,RTW)自动代码生成技术,将电控空气悬架系统控制策略的Stateflow模型转换为应用层程序,并与底层程序结合,验证了控制策略及所生成应用层代码的可行性;CHOE J M等人[7]基于模型设计方法、自动代码生成技术及Matlab/Simulink,对输出电压及输入电流控制系统进行建模仿真,有效缩短了开发周期;N.V.KHANH等人[8]基于Matlab/Simulink,编写目标微控制器的S-Function函数及对应的TLC文件生成库模块,该库模块生成的代码能在STM32F407芯片上准确运行;J.ARM等人[9]针对ARM Cortex-R系列处理器,在Matlab/Simulink环境中设计了基于模型自动部署的工具链组件,实现目标硬件的嵌入式代码生成,并利用开发套件进行处理器在环仿真,验证了该工具链组件的可行性;L.BONICEL等人[10]基于Simulink代码生成技术,提出了一种多触发机制的嵌入式代码生成方法,该方法可有效提升生成代码质量和生成效率。针对嵌入式系统开发需求,Matlab软件只提供了部分主控芯片的通用模块库,用于生成特定目标硬件的底层代码,而对于未提供模块库的其他芯片型号或实际开发需求,则需要用户根据项目需求自行编写系统目标文件和底层驱动模块[11]。因此,本文以NXP公司16位芯片MC9S12XEP100为目标硬件,通过编写系统目标文件配置代码生成过程,并在代码生成结束后,调用CodeWarrior开发环境对代码进行编译,编写相关底层驱动模块的C MEX S函数及TLC文件并进行封装,创建该主控芯片部分底层驱动库,并以部分底层模块为例进行自动代码生成实验,进行硬件在环验证。该研究为实现基于模型的开发流程奠定了理论基础。

1 基于Matlab/Simulink的自动代码生成技术分析

1.1 Simulink自动代码生成工具箱

MathWorks公司提供的Matlab/Simulink自动代码生成技术支持多种语言,如C、C++等,由Matlab软件中不同的工具箱予以支持。针对生成目标为嵌入式C代码的模型,Simulink在编译时主要运用Matlab Coder、Simulink Coder和Embedded Coder工具箱[12]。

Matlab Coder工具箱可为Matalb代码生成可读高效的C或C++代码或是将自定义的代码集成到Matlab中。通过Matlab Coder,还可以将Matlab代码编译为Matlab可执行文件,以验证所生成的C代码,并提高算法的执行速度。Simulink Coder工具箱又称Real-Time Workshop,即实时工作空间,其可从Simulink模型、Stateflow模型和Matlab函数中生成C和C++代码。所生成的源代码可用于实时和非实时应用,包括仿真加速、快速原型和硬件在环测试[13]。Embedded Coder工具箱能够生成支持MISRA-C、AUTOSAR和ASAP2软件标准的代码,并提供可追溯性报告、代码文档记录和自动化软件验证功能,可进行软件在环(software-in-the-loop,SIL)仿真和处理器在环仿真(processor-in-the-loop,PIL)测试。在Simulink环境中,主要应用目标是嵌入式单片机时,由Matlab Coder和Simulink Coder完成各自模块的代码生成任务,Embedded Coder负责拓展,并优化二者生成代码的文件结构、函数形式和从数据储存等功能,从而生成结构紧凑的嵌入式C代码[14]。

1.2 目标语言编译器

目标语言编译器是Simulink Coder工具箱重要组成部分,同时也参与自动代码生成过程的关键步骤,目标语言编译器参与Simulink代码生成,嵌入式代码生成过程如图1所示。

Simulink模型首先由Simulink Coder工具箱编译,Simulink Coder读取模型文件并编译,产生中间描述文件Model.rtw,在RTW文件中记录模型内模块、输入、输出和其他模块参数,供目标语言编译器调用;目标语言编译器在读取模型RTW文件信息后,根据用户选择的系统目标文件和模块目标文件生成源代码[15]。如果需要生成特定目标的应用程序,Simulink Coder代码生成器需要一个makefile模板文件,该文件可以为代码生成过程指定适当的C或C++编译器和编译器选项。makefile模板文件经过代码生成器转化为目标makefile文件Model.mk[16]。

目标语言编译器主要用到系统目标文件和模块目标文件2类TLC文件。系统目标文件主要用于指定生成代码的总体结构。模块目标文件则用于实现Simulink中不同模块的功能,其中包括用户自定义的S Function模块。在Simulink环境下,用户可以进入模型参数配置中的代码生成选项,选择不同系统目标TLC文件,改变代码接口、构建过程和目标硬件参数等,用于生成特定目标硬件或操作系统上执行的代码[17]。例如,选择grt.tlc文件作为系统目标文件,将生成适用于快速原型或SIL测试的代码;而ert.tlc文件则针对嵌入式系统进行优化,可以生成更高效的C或C++代码。针对MC9S12XEP100主控芯片,为了实现嵌入式代码以及底层驱动代码生成过程,首先需要在嵌入式实时目标(embedded real-time target,ERT)文件的基础上编写包括系统目标TLC文件在内的控制文件,用于底层头文件的包含及主函数架构的生成,并在代码生成后调用CodeWarrior环境进行编译。针对芯片的各底层驱动模块,需要编写C MEX S函数,并在Simulink中利用S Function模块进行封装,同时编写对应的模块目标TLC文件。在代码生成过程中,TLC文件从RTW文件中获取对应模块参数,生成对应底层模块相关代码及指定代码段生成位置[18]。

2 系统目标文件及底层驱动模块实现

2.1 系统控制文件的配置

针对MC9S12XEP100芯片,其控制嵌入式C代码生成需要的文件,主要包含系统目标文件、顶层控制文件、模板联编文件和钩子文件等一系列TLC文件或M函数,其中部分文件需要针对目标硬件进行修改,自定义控制文件[19]如表1所示。

系统目标文件(MC9S12XEP100.tlc)内部结构如图2所示。系统目标文件主要对编译过程中的重要变量进行定义,插入用于生成代码的TLC文件作为主要入口点,同时配置浏览器界面 System Target File Browser 中需要显示的信息,代码生成器在System Target File Browser启动时,自动扫描工作路径下具有格式化标头注释的TLC文件作為系统目标文件。

在Simulink环境下,调用Embedded Coder工具箱生成嵌入式代码时,首先要求手动配置模型求解器为非连续定步长类型,其次需要选择具体的目标硬件,便于代码生成器优化生成变量的数据类型。回调函数文件(MC9S12XEP100_callback_handler.m)通过Matlab内部函数“slConfigUISetVal()”进行编写,系统目标文件内rtwgensettings结构体进行调用,对于选取的MC9S12XEP100.tlc,作为系统目标文件Smiulink模型进行自动配置:选取嵌入式代码目标为飞思卡尔的HCS12(S)系列单片机,求解器类型为非连续定步长0.01s,选择Matlab自带的ert_code_template.cgt文件作为代码生成模板(code generation template,CGT),MC9S12XEP100_file_process.tlc作为自定义文件处理(custom file processing,CFP)模板,在MC9S12XEP100_file_process.tlc又调用MC9S12XEP100_main.tlc配置自定义主函数格式,并把将要生成的自定义代码整合到缓冲区中。CFP模板还调用代码模板应用程序编程接口(application program interface,API)将缓冲区代码发送到生成的源文件和头文件指定部分[20]。

在编译过程中,可以在代码生成和联编过程中的指定点执行的钩子方法中写入自定义代码,将特定的操作添加到编译过程中,钩子文件框架如图3所示。

MC9S12XEP100_make_rtw_hook.m钩子文件通过在“exit”钩子点写入指令,实现嵌入式代码放入MC9S12XEP100工程文件夹内,随后调用CodeWarrior开发环境,一键实现自动代码生成及CodeWarrior开发环境编译过程。

2.2 底层模块的编写及封装

通过配置MC9S12XEP100目标系统文件等控制文件,Simulink模型就可以生成基于目标硬件的嵌入式代码,但是涉及到目标芯片的一些具体功能,如CAN通讯、PIT定时器和PWM等功能时,还需要通过编写S函数,并按模块进行封装,实现其对应功能。为生成各模块底层代码,尤其是涉及寄存器配置时,S函数需要内联与各模块同名的TLC文件。S函数的编写方式分为LEVEL1 M S函数、LEVEL2 M S函数和C MEX S函数3类,C MEX S函数通过C语言及C MEX宏函数进行编写,在仿真过程中无需反复调用Matlab执行器,而是在仿真前将源程序文件编译成mexw32/mexw64类型的可执行文件,能够减少代码生成过程中内存占用,有效提高了仿真效率[21]。

在配置MC9S12XEP100各模块时,主要利用C MEX S函数进行编写并封装。C MEX S函数及其同名TLC文件的基本架构如图4所示。在初始化过程中,使用C MEX宏函数对模块参数个数、输入/输出端口个数、维数和馈入方式等进行配置,并设置采样时间。

仿真循环过程中,在mdlOutputs函数中计算每个采样时间的输出,由于底层驱动模块的作用是生成底层代码,并不涉及应用层的算法计算仿真,只在某些模块,如CAN接收中断模块中可能会用到子系统触发,所以一般为空函数。同理,mdlTerminate一般也为空函数。mdlRTW函数只在代码生成过程中才被调用,通过创建不可调参数为各模块C MEX S函数内联的TLC文件提供参数信息。在各模块目标TLC文件内部,不同函数中添加底层代码,指定其生成位置,结合自定义参数信息,实现对指定模块的底层代码生成。

在完成各模块C MEX S函数编写后,Matlab提前编译函数,得到mexw64类型的可执行文件。在Simulink环境下,通过S-Function模块对底层各模块进行封装。以CAN接收模块为例,CAN接收模块如图5所示。

图5中,模块浏览器界面可输入指定接收CAN报文ID和需要使用的CAN通道。在代码生成过程中,这些参数信息会储存在RTW文件中,再由目标语言编译器选择其同名的TLC文件,将从浏览器界面输入的CAN_ID和Channel参数,填入指定位置生成底层代码,最后嵌入模型主函数的指定位置。

3 实验验证

3.1 Simulink模型搭建

搭建Simulink待测模型,在Model Configuration Parameters中,选择MC9S12XEP100.tlc作为系统目标文件,目标系统文件选取界面如图6所示。Simulink根据选择的系统目标文件,调用对应控制文件配置模型求解器及代码生成器等参数。

本文以芯片CAN收发模块、PIT定时中断模块和SCI串口通讯模块为例,搭建Simulink模型,待测模型如图7所示。由于目标板选用晶振频率为16 MHz,因此通过配置锁相环模块,将总线频率设置为32 MHz,然后配置CAN初始化模块,选择对应的CAN通道、波特率及中断使能状态,以接收SAE J1939协议中带有车速的报文为测试目标,选择CAN接收模块需要的CAN报文ID及CAN通道,在CAN接收子系统中,添加车速计算公式,并添加SCI发送模块,实现接收及解析报文,并通过串口发送车速。同时,配置PIT中断定时器,每隔0.5 s触发一次中断,在中断模块子系统中添加CAN发送模块,实现固定时间发送报文。

3.2 生成代码测试

编译后,Simulink模型自动生成嵌入式C代码,钩子文件将生成的源文件和头文件置入指定空工程文件中,并调用CodeWarrior进行编译或调试。在CodeWarrior环境下,利用下载器将代码下载进单片机。同时,在Simulink中搭建报文发送模型,Simulink通过Kvaser Leaf Light v2 CAN总线分析仪,将模拟车速报文发送至单片机。CANKing报文检测界面如图8所示。

由J1939协议可知,含有车速信息的CAN报文ID,用16进制表示为18FEF100,车速信息占报文的第2和第3字節,分辨率为每位1/256 km/h。

由图8的CANKing检测界面可知,Simulink向单片机实时发送模拟车速报文,同时在Debug观测界面中,单片机每隔0.5 s发送一条报文。在串口接收观测界面,采集单片机发送车速数值,模拟车速信号及串口发送车速信号如图9所示。由图9可以看出,串口发送车速信号与Simulink模拟的车速信号一致,实现了芯片底层代码的配置和自动生成。

4 结束语

本文介绍了一种针对MC9S12XEP100的底层自动代码生成技术,通过在Matlab/Simulink环境下编写对应的系统目标文件和芯片底层功能模块库,实现了芯片底层代码的配置和自动生成。实验结果表明,所生成的底层代码能够很好地与应用层代码结合,在单片机上实现CAN报文的接收和定时发送等功能。相比于以往的自动代码生成技术,本文设计的方法能够在Matlab/Simulink同时实现目标芯片底层和应用层的代码生成,无需再进行代码手动整合或单独配置底层寄存器,这为今后实现基于模型的开发流程打下了基础。本文仍存在一些局限性,并没有对各底层模块添加更丰富的自定义选项,后续可根据具体项目及实际需求进行修改。

参考文献:

[1] 张富成. 基于Simulink/RTW的快速原型控制器的设计与实现[D]. 成都:电子科技大学,2020.

[2] 仲飞,钟伟,黄磊. 基于Simulink/RTW的机器人遥操作系统的设计与实现[J]. 机械与电子,2021,39(7):70-74,80.

[3] 汪伟,莫官旭,申健,等. 基于Simulink自动代码生成技术的CAN底层模块库设计[J]. 控制与信息技术,2020(3):93-96.

[4] 万彪. 一种Simulink模块封装的自动代码生成技术研究[J]. 机床与液压,2019,47(10):166-169.

[5] 严天一,李聪聪,CHO X H,等. 基于模型的电控空气悬架系统控制策略与实车试验[J]. 农业机械学报,2017,48(5):385-389.

[6] 严天一,刘欣强,张鲁邹,等. 基于代码生成的电控空气悬架系统电子控制单元[J]. 农业机械学报,2014,45(9):14-19.

[7] CHOE J M M,ARNEDO L,LEE Y,et al. Model-based design and dsp code generation using simulink?for power electronics applications[C]∥2019 10th International Conference on Power Electronics and ECCE Asia (ICPE 2019-ECCE Asia). South Korea:ICPE(ISPE),2019:923-926.

[8] KHANH N V,DUY N H A,HAI P T L,et al. Development of matlab/simulink library for unsupported microcontrollers,case study:STM32F407[M]. Singapore:Intelligent Communication,Control and Devices. Springer,2021.

[9] ARM J,BRADAC Z,FIEDLER P,et al. Characterizing the simulink-based code generation toolchain for safety-critical applications in an ARM cortex-R target[J]. IFAC-Papers on Line,2019,52(27):271-276.

[10] BONICEL L,BOHRER R,LEPRETTRE B,et al. Multi-triggered embedded software code generation for electrical metering and protection applications[C]∥30th International Workshop on Rapid System Prototyping (RSP'19). New York,United States:Association for Computing Machinery,2019:1-7.

[11] 何濤. 电动汽车整车控制器软件设计及关键技术研究[D]. 北京:清华大学,2010.

[12] 阙同亮. 基于模型设计的电动汽车整车控制器开发与技术研究[D]. 武汉:武汉理工大学,2018.

[13] 付文杰. 基于自动代码生成的低速柴油机电控系统软件设计[D]. 哈尔滨:哈尔滨工程大学,2019.

[14] 冯吉涛. 汽车电控系统代码自动生成技术的功能实现[J]. 微型电脑应用,2019,35(4):123-125.

[15] 陈经纬,李霞,孙庆乐. 基于Simulink的整车控制器软件系统开发[J]. 车辆与动力技术,2021(2):33-38.

[16] 边伟,陈勇,杨柳. 基于自动代码生成技术的汽车电子控制系统设计[J]. 现代电子技术,2016,39(24):132-136.

[17] 陈攀,张承瑞,罗映. 利用MATLAB/RTW的嵌入式代码自动生成与整合[J]. 小型微型计算机系统,2018,39(4):738-741.

[18] 李欢欢. 基于MC9S12XEP100自动代码生成技术研究[D]. 北京:北京理工大学,2018.

[19] 戴计生,陈俊波,李程,等. 基于Simulink的嵌入式控制软件开发环境的设计[J]. 大功率变流技术,2014(5):7-11,32.

[20] 常广晖,陈诚,吴越,等. 一种支持Cortex-M3的Simulink自定义目标系统设计[J]. 计算机测量与控制,2021,29(8):190-195.

[21] 李胜磊. 基于Simulink Real-Time的增程器控制器硬件在环测试平台的研究与开发[D]. 杭州:杭州电子科技大学,2020.

Abstract:Aiming at the problems of low efficiency,poor reliability and long development cycle of manual programming in the design and development of traditional automobile electronic control units,this paper proposes a design method based on Simulink automatic code generation technology. For NXP's 16-bit MCU MC9S12XEP100,control files including system target files were written to achieve embedded C code generation on Matlab/Simulink. At the same time,C MEX S functions and target language compiler (TLC) files of modules were written and packaged to embed the code of each underlying driver module of this chip,which were added to the Simulink module library. The designed underlying modules were modeled on Matlab/Simulink and embedded code was generated for hardware-in-the-loop test. The test results show that the automatic code generation technology for underlying driver designed in this paper realizes the automatic configuration of the underlying code,and combines with the application layer code to realize the CAN message of vehicle speed receiving and timing sending. The analyzed speed signal is consistent with the Simulink analog speed signal,which verifies the efficiency and feasibility of the underlying driver module designed in this paper. This research can effectively solve the problem of complex underlying code configuration in the project development process.

Key words:MC9S12XEP100; Simulink; automatic code generation; underlying driver

猜你喜欢

代码生成底层代码
航天企业提升采购能力的底层逻辑
Lustre语言可信代码生成器研究进展
创世代码
创世代码
创世代码
创世代码
代码生成技术在软件开发中的应用
基于XML的代码自动生成工具
回到现实底层与悲悯情怀
中国底层电影研究探略