利用MATLAB/RTW的嵌入式代码自动生成与整合

2018-04-13 10:03张承瑞
小型微型计算机系统 2018年4期
关键词:代码组件驱动

陈 攀,张承瑞,罗 映

1(山东大学 机械工程国家级实验教学示范中心,济南 250061) 2(山东建筑大学 机电工程学院,济南 250101) E-mail:sduchenpan@163.com

1 引 言

随着软件工具的发展,自动代码生成技术在工业控制[1]、汽车电子[2]、航天和导弹制导[3]等领域得到广泛的应用.自动代码生成相比于手工编程,能够减少偶然的bug,减少重复劳动的时间,提高嵌入式系统的可靠性[4].在MATLAB/Simulink下,8051、飞思卡尔DSP563XX、英飞凌C166和ARM系列等芯片都有对应的toolbox支持,在创建MATLAB/Simulink模型后,通过RTW工具,可直接生成控制代码.而外围器件选型或布置等设计变化可能导致用户不能直接通过工具生成代码.为了满足不同项目的嵌入式控制器的设计需求,需要根据MATLAB/Simulink和RTW的工作原理,结合实际需求设计代码生成工具,进而使代码的生成符合预期,同时提高代码质量.本文从RTW的工作原理出发,以飞思卡尔S12X系列单片机为例,利用COM技术连接MATLAB/Simulink与CodeWarrior IDE,整合驱动层与应用层,最后实现自动代码生成,并且代码无需手动修改,能够直接下载到目标板上.

2 MATLAB/RTW与代码生成

RTW(Real-Time Workshop)是基于Simulink的代码自动生成环境.Simulink软件生成一个包含框图执行语义的高级表示文件——model.rtw文件.model.rtw文件是一个ASCII格式数据库,其中的内容描述了Simulink模型中的各个块的包括属性名称和属性值等.目标语言编译器(TLC)读取model.rtw文件并将其转换为内部表示,并根据其他模块TLC文件等修改最初的model.rtw文件.在RTW下能直接从Simulink的模型中产生优化的、可移植的和个性的代码,并根据目标配置自动生成多种环境下的程序[5].RTW环境下的代码生成过程有如下四个部分:

1)RTW读取模型文件model.mdl,生成模型的描述文件model.rtw,该文件以ASCII码存储;

2)TLC读取model.rtw,并根据的系统TLC与模块TLC文件,生成指定目标的代码,如ANSI C/C++代码;

3) RTW代码生成器根据给定的模型,将makefile模板生成具体的makefile文件(model.mk),该文件可修改用于生成可执行文件的C/C++编译器及编译选项;

4)连接model.mk与运行时的接口支持文件,将代码编译成可执行的文件[6].

图1 RTW工作过程Fig.1 RTW working process

3 COM与ActiveX简介

MATLAB通过ActiveX自动化管理其他ActiveX组件或者被其他ActiveX组件所控制.ActiveX是Microsoft公司推出的基于组件对象模型(Component Object Model,COM)的一种技术,他使各种软件组件可以在网络环境中相互作用,而不管这种组件是使用什么语言编写的.当MATLAB受到其他ActiveX组件控制时,充当了自动化服务器,ActiveX组件则是自动化客户机[7].而实际上ActiveX是商标名称,COM才是技术名称.

COM是微软公司提出的以组件为发布对象的软件开发技术.组件对象模型(COM)是Windows对象的二进制标准.为Windows提供了统一地、面向对象的、可扩充的通讯协议.这意味着描述一个对象的可执行代码(.dll或.exe文件的代码)可以被其他对象执行[7].得益于COM具有与语言、平台无关的特征,MATLAB的m函数可以基于COM标准与CodeWarrior IDE通讯,然后控制程序生成的过程.

在MATLAB下编写m函数使用COM技术,可通过MATLAB的ActiveX支持调用必要的方法来调用CodeWarrior IDE.通过COM技术,可以实现调用CodeWarrior(例如,启动一个新的CodeWarrior会话);打开CodeWarrior MCP项目文件;删除旧的目标文件;构建项目以创建二进制文件;下载并执行目标板上的二进制文件.

4 软件架构与实现

嵌入式软件架构的设计,可以按如图2分为三层:微控制器层、设备接口层、逻辑应用层.微控制器层负责硬件的初始化和头文件定义等内容;设备接口层,封装驱动接口,供逻辑应用层调用.这两层都在CodeWarrior IDE编写,根据需要用C语言编写IO驱动和通信驱动,封装接口并测试,作为工程模板;最后的逻辑应用层在MATLAB/Simulink下编写.逻辑应用层通过相关的UI模块处理设备驱动层的接口,同时负责逻辑与应用的搭建.

图2 软件框架设计Fig.2 Design of software framework

4.1 驱动模块的建立

在MATLAB/Simulink中,驱动UI模块与设备驱动一一对应.驱动UI模块的功能是在RTW程序创建过程中将驱动程序内嵌到模型源代码中.驱动UI驱动的建立有两种思路:一种是用TLC语言处理寄存器配置等底层硬件驱动,后生成C代码;另一种是通过MATLAB配置相关的参数,后调用相关的驱动函数,生成阶段只负责整合.采用第二种思路编写驱动,可以在IDE编写底层驱动库[8],便于对已有的产品代码进行重构,更能适应新的需求[9],而TLC文件处理相关的接口即可.对于TLC语言不熟悉的硬件工程师而言,采用第二种方式能减少编写TLC文件的工作量,提高效率.

驱动模块的建立需要先创建代表硬件的S函数,通过在与S函数对应的UI模块上定义参数,例如外设寄存器地址、采样时间等,将这些参数传递到RTW文件中去.实际的驱动接口相关的函数写在S函数同名的TLC文件中.驱动模块的建立可以分为两个部分,第一步,模型阶段,处理模型相关的模块noninlined C MEX S-Function,此时创建的S函数模块只能用于仿真而不能用于生成代码;第二步,RTW阶段,编写TLC文件,用来定制RTW,为系统模型生成实时C代码.最后通过MEX指令生成Inlined S-function(内联S函数).

对于I/O驱动模块的设计,具体的过程包含如下四个阶段:

1.UI模块界面设计,根据模块参数及输入输出来设计模块的配置参数,对于AI模块可以设计电压、电阻、电流模式参数,分辨率参数、通道参数等配置选项,UI界面的参数会传递到接下来编写的S-Function中;

2.编写模块S-Function,通过修改Simulink Library提供的S-Fuction Example中提供的合适的S-Function模板,使得在RTW的程序创建过程中能将自定义的模块程序嵌入到模型源代码中,注意,此时创建的S函数模块只能用于仿真而不能用于生成代码;

3.编写TLC文件,需设计模块TLC文件用于定制模块程序,TLC文件通过获取模块中的参数值来定制驱动程序并将其嵌入到自动生成的模型源代码中,一般TLC文件负责制定的I/O宏定义、变量定义、code库等内容和硬件初始化等,按照本文的软件结构,TLC文件以接口处理为主.

4.模块整合,调用命令mex生成内联S函数,最后将目标硬件驱动程序封装成静态库:调用sblock函数,封装并加入Simulink库,供系统逻辑应用调用.

4.2 系统设计

系统设计不仅仅负责main主函数生成,还为COM技术的使用和整个自动代码过程服务.目标系统通过系统文件(TLC)和hook文件把mdl转换成c/h文件,而其余文件辅助这个过程.系统级设计包含系统目标文件、hook文件和脚本文件[10],过程如图1所示.

1) 系统目标文件用于设置代码生成的参数及目标硬件相关的专用数据.可以设置一些最基本的内容,配置代码生成格式、类型、语言等内容,一般用于对目标系统的各种参数进行默认配置;

2) hook 文件用于对代码生成的各个阶段对自定义操作的处理.hook文件的设计用于在代码生成过程中hook文件的执行分为表1六个阶段,贯穿了整个RTW的程序创建过程.根据实际需要可设计与修改各阶段的内容.

表1 RTW 创建过程
Table 1 RTW creation process

阶段创建过程entry自定义目标进行预配置,参数配置检验before_tlc调用目标语言编译器TLC自动生成模型源代码after_tlc自动生成创建目录的信息文件,并将其放在创建的文件夹中before_make生成程序创建过程必须的库文件after_make更新创建信息对象exit调用COM组件来处理代码整合

3)脚本文件用于创建访问实例,通过COM组件在MATLAB中实现对编译器的操作.首先用MATLAB注册函数actxserver(′CodeWarrior.CodeWarriorApp′)创建CodeWarrior的COM对象,返回句柄,然后再通过COM接口来执行将基于模型的.c和.h文件添加到CodeWarrior的工程中,接着进行编译,最后根据设置执行程序下载等命令.

5 验 证

项目开发一款飞思卡尔S12X系列MC9S12XEP100为主控芯片的控制器,具备AD采集、数字DA、电流测量、时间测量、PWM输出、高低边功率输出、CAN、LIN、RS232和RS485,10种通用I/O功能.以AD采集模块为例,说明硬件模块在MATLAB/Simulink下程序整合的过程.对无操作系统的嵌入式系统主要有两种实现方式:循环轮转和前后台系统,程序是基于时间的循环轮转系统.AD5V代表最大量程5V.按照图2的分层思路,AD5V在底层进行封装,并留出初始化接口函数和获取电压接口函数:

ret_t ecmad5VddiInit (uint16_t Channel,int mode);

int32_t ecmAI5ddiGetVol(uint16_t Channel);

以初始化为例,在TLC文件中将如图3的AD模块中的配置参数(Supply项为标记不与形参对应)传递给接口函数

%assign Channel=CAST("Number",SFcnParamSettings.Channel)

%assign Mode=CAST("Number",SFcnParamSettings.Mode)

%assign Supply=CAST("Number",SFcnParamSettings.Supply)

/* S-Function "INIT_ad5V" initialization Block:% */

ecmad5VddiInit(%,%);

图3 AD 模块Fig.3 AD module

配置面板中选择创建的系统TLC文件作为System target file,代码生成的默认选项与系统TLC设置对应.通过系统TLC设置,可提供代码生成后编译、下载或无操作的选项.

图4 MATLAB/Simulink测试模型Fig.4 Test model in MATLAB/Simulink

搭建如图5所示MATLAB/Simulink测试模型,通过PIT定时模块设置定时任务[11],I/O模块采集信号并进行逻辑运算并输出.硬件驱动模块在底层IDE工具中完成,在MATLAB/Simulink模型初始化时,获取工程模板文件路径;系统编写通过修改对应部分的系统TLC文件和M文件完成,利用COM技术,实现对CodeWarrior的生成控制.

图5 自动代码生成的工程文件Fig.5 Project of automatic code generation

运行“build model”,新生成的工程会新增如图5“Sources”文件夹下的多个文件,其中s12x100_main,程序的main文件;model.h/c包含模型数据模型算法逻辑,是程序入口与核心,其他文件与宏定义结构体等有关.“model”代表模型的实际命名,工程目录中为“Interrrupt_led”.另外,若需要进一步优化代码,提高模块重用性,提升代码简洁性等,需要在配置参数界面内设置.

6 结 论

MATLAB作为现在重要的工具软件,深入探究其RTW工作的原理,结合COM技术,成功实现代码的生成代码与底层的整合.合适的软件结构设计,合理的工作分工,能够提升开发的效率,并减少了TLC代码的工作量,更加符合一般硬件工程师开发习惯.对于自动代码生成的研究,对于快速原型开发和V流程设计有较好的借鉴意义.

[1] Guo Xiao-qiang,Zhao Gang,Huang Kun.Auto-generation of TI C2000 DSP code on MATLAB/simulink bench[J].Science Technology & Engineering,2011,11(13):2941-2944.

[2] Hong Xiao-jun,Zhu Lei.Vehicle controller rapid prototype based on the automatic code generation technology on MATLAB/RTWEC [J].Mecha Tronics,2014,20(8):47-52.

[3] Yang Xiang,An Jin-wen,Cui Wen-ge.The research on application of embedded auto code generation[J].Journal of Projectiles Rockets Missiles & Guidance,2008,28(3):250-253.

[4] Guo Wen-sheng,Wang Yong,Yang Xia,et al.Codecomb:automated test case generation and defect detecting for embedded software based on symbolic execution[J].Journal of Chinese Computer Systems,2017,38(6):1250-1255.

[5] Yang Di.The environment and application of system real time simulation and development[M].Beijing:Tsinghua University Press,2002:32-37.

[6] Liu Jie,Weng Gong-yu,Zhou Yu-bo.The design of the model-MCU[M].Beijing:Beihang University Press Based on,2011:152-218.

[7] Zhang De-feng.MATLAB and external programming interface programming [M].Beijing:Machinery Industry Press,2009:192-209.

[8] Ren Jia-li,Cao Hai-yan.Research of code auto-generation and integration for the embedded software[J].Journal of Taiyuan University of Technology,2013,44(4):518-521.

[9] Zhang Wei,Wu Yi-jian,Shen Li-wei,et al.Software product line evolution driven by source code changes[J].Journal of Chinese Computer Systems,2017,38(5):919-924.

[10] Feng Hui-zong,Zhu Peng,Jiang Jian-chun,et al.Research on driver code quick generation technology based on real-time workshop[J].Computer Application and Software,2016,33(3):226-228.

[11] Gong Wei-wei,Wang Rui,Li Xiao-juan.Modeling and validation of cognitive robot control behavior using uppaal [J].Journal of Chinese Computer Systems,2016,37(6):1279-1283.

附中文参考文献:

[1] 郭小强,赵 刚,黄 昆.基于MATLAB/Simulink平台下TI C2000 DSP代码的自动生成[J].科学技术与工程,2011,11(13):2941-2944.

[2] 洪晓君,朱 磊.基于MATLAB/RTWEC自动代码生成技术整车控制器快速原型开发[J].机电一体化,2014,20(8):47-52.

[3] 杨向忠,安锦文,崔文革.嵌入式自动代码生成技术应用研究[J].弹箭与制导学报,2008,28(3):250-253.

[4] 郭文生,汪 勇,杨 霞,等.Codecomb:基于符号执行的嵌入式软件测试案例自动生成与缺陷检测[J].小型微型计算机系统,2017,38(6):1250-1255.

[5] 杨 涤.系统实时仿真开发环境与应用[M].北京:清华大学出版社,2002:32-37.

[6] 刘 杰,翁公羽,周宇博.基于模型的设计—MCU篇[M].北京:北京航空航天大学出版社,2011:152-218.

[7] 张德丰.MATLAB与外部程序接口编程[M].北京:机械工业出版社,2009:192-209.

[8] 任佳丽,曹海燕.嵌入式软件自动代码生成和代码整合方法研究[J].太原理工大学学报,2013,44(4):518-521.

[9] 张 薇,吴毅坚,沈立炜,等.代码变更驱动的软件产品线演化方法[J].小型微型计算机系统,2017,38(5):919-924.

[10] 冯辉宗,朱 澎,蒋建春,等.基于RTW的驱动代码快速生成技术研究[J].计算机应用与软件,2016,33(3):226-228.

[11] 巩卫卫,王 瑞,李晓娟.基于UPPAAL的认知机器人控制行为建模与验证[J].小型微型计算机系统,2016,37(6):1279-1283.

猜你喜欢
代码组件驱动
数据驱动世界。你得懂它 精读
无人机智能巡检在光伏电站组件诊断中的应用
基于模糊PI控制的驱动防滑仿真系统分析
Kistler全新的Kitimer2.0系统组件:使安全气囊和安全带测试更加可靠和高效
屈宏斌:未来五年,双轮驱动,砥砺前行
一种嵌入式软件组件更新方法的研究与实现
通用(OA)办公自动化系统的组件运用
深入实施创新驱动发展战略
神秘的代码
一周机构净增(减)仓股前20名