嵌入式软件自动代码生成和代码整合方法研究
2013-09-13任佳丽曹海燕
任佳丽,曹海燕
(1.山西交通职业技术学院 信息工程系,太原030031;2.太原理工大学 物理与光电工程学院,太原030024)
随着嵌入式系统日益广泛的应用,越来越短的产品周期与不断增加的客户需求,使得手工编程的嵌入式软件设计很难胜任新的开发需求。手工编写的代码容易产生bug,查找和解决这些问题不仅要花费大量的人力和时间,有时甚至会导致软件的重新开发。对于安全性要求较高的产品,出现bug甚至会关系到人身安全。因此,近年来汽车电子行业的一些龙头企业已经用代码自动生成的方法逐步取代传统开发模式下的手工编程,收到了良好的效果[1]。但是目前的工具仅对少数型号的微控制器提供完整支持,如TIC2000微控制器[2],而实际应用中由于客观需要微控制器的品种繁多,不同型号微控制器在功能、性能、封装等方面很少兼容,给众多用户使用自动代码生成的开发方法带来了不便。本文通过汽车天窗控制器的设计,探索了用自动代码生成和手工代码整合进行嵌入式软件开发的方法,适用于各种型号微控制器嵌入式控制软件的开发。
1 汽车天窗控制器的电路结构及原理
天窗控制器主要有微控制器、按键、电机驱动、霍尔传感器等电路组成,电路框图如图1所示。瑞萨电子的μPD78F0881单片机作为主控芯片,通过运行嵌入式控制软件,检测按键和霍尔传感器的信号,控制电机转动,完成天窗水平开、水平关、斜升、斜降等动作;按键按下的时长控制电机电动或自动运行;霍尔传感器用于检测天窗运行过程中是否遇到障碍物,是否需要停止天窗运行或使其反向运行,以实现防夹功能;LED灯指示天窗的位置状态和运行状态。
图1 天窗控制器电路框图
2 建立控制器模型
系统仿真模型包括控制器模型和被控对象模型。控制器模型是电子控制单元ECU中所有控制算法的抽象[3],它的输入、输出与ECU的输入、输出一一对应,这样才能保证从模型生成的控制算法在ECU中正常运行,以便于在完成仿真调试后用硬件实物快速替换控制模型,从而加快开发进程。
2.1 仿真模型框架
在Simulink环境下建立的天窗控制器仿真模型框架分为信号输入、逻辑控制和信号输出三部分,如图2所示,其中核心是仿真微控制器的逻辑控制部分,输入、输出部分用于逻辑控制模型的调试。根据仿真需要创建多组和实际电路相对应的输入信号,并且满足时序要求,图3所示的就是将点火信号ignition、点动运行信号SO_TD Switch、自动运行信号SO_TU Switch、水平滑动脉冲计数信号Slide-PulseCount、斜向滑动脉冲计数信号TiltPulseC-ount、遇阻信号Obstacle和定时器信号timerCfg按照一定的时间和逻辑关系进行组合的一组输入信号,仿真时就将选中的一组输入信号输入到逻辑控制模型中。通过Display、Scope等模块可以仿真观察输出,其中Scope模块即示波器模块,是将逻辑控制模型输出的控制信号及其时序以二维图形显示出来,其中横坐标表示时间轴,纵坐标表示信号。打开Scope输出窗口,模型仿真运行时就可以看到如图4所示信号波形。图中信号为1时表示灯被点亮,为0时表示灯熄灭。
图2 天窗控制器仿真模型框架
图3 一组输入信号的逻辑时序图
图4 通过Scope模块观察输出信号波形图
2.2 建立逻辑控制模型
图5 汽车电动天窗电机转动状态图
逻辑控制模型是仿真嵌入式系统中的微控制器。建立逻辑控制的状态图,各种复杂的逻辑控制关系都能够通过状态图完整地表示出来。如汽车天窗控制系统中对电机转动控制的逻辑状态图如图5所示,所实现的逻辑控制是根据按下按键的持续时间判断应该进入的执行状态。按键按下时间小于1 s进入点动状态(车窗移动一下就会停止);按键按下时间在1~2.3s之间进入自动平移状态(在无障碍物的情况下,天窗会自动平移至全部打开);按键按下的时间超过2.3s进入手动平移模式(按键按下时车窗开始移动,释放按键时车窗停止移动)。
Stateflow采用时间调度机制,这样就可以为时间驱动系统生成准确高效的代码[4]。在状态转移时使用时间运算符before,after,实现对转移后状态的激活指定调度逻辑。在模型中使用时间运算符,降低了手工编程时相对容易出错的定时器和计数器任务调度编排的难度。在Simulink环境下仿真运行时,正在运行的状态或发生转移时的转移箭头会高亮显示,非常便于动态观察模型运行。
3 代码自动生成及代码整合
3.1 代码自动生成
代码自动生成是将Simulink环境下建立的模型通过RTWEC转换成C程序代码,生成的代码结构紧凑,运行效率高[3]。首先模型经过Simulink的编译器生成rtw中间文件;rtw文件经过TLC编译器生成C语言代码,最后通过C编译器得到最终的可执行程序。rtw文件包含了模型中的有用信息,包括模型中的参数、变量、模块名称等。TLC编译器编译过程中将控制代码用Simulink模型中的变量和参数代替,与原有的文本一起生成C代码。但是对于RTWEC没有提供完全支持的单片机而言,就无法对单片机底层(如I/O端口等)有关的一些模型进行代码生成,如天窗控制模型中的信号输入、输出部分。可用RTWEC只对控制逻辑最为复杂的控制器模型进行代码自动生成,而手工编写输入、输出模型的底层驱动代码,最后整合这两部分代码。
控制器模型仿真调试完成后还需要在Simulink环境中进行有关参数设置。最主要的设置有:
1)设置模型中输入、输出的变量名和属性,在编写底层驱动代码时这些变量要和微控制器的输入输出硬件相对应。
2)在Configuration Parameters选项下选择求解器为离散型(discrete),目标系统文件选ert.tlc文件,其它参数一般情况下可用默认选项。自动生成的源代码文件存放在默认路径Sunroof_ert_rtw下,其中Sunroof.c文件中包含了Sunroof_initialize子函数(初始化函数)和Sunroof_step子函数(实现模型在一个步长时间内所有的控制算法),Sunroof.h、Sunroof-private.h、Sunroof-types.h、rtwtypes.h等文件是对参数、变量、数据结构的定义和声明。
3.2 代码整合
由于自动代码生成软件只完整支持少数型号的微控制器,而在实际应用中由于性能、成本等的不同要求,使得微控制器的品种繁多,不同型号微控制器在功能、性能、封装等方面很少兼容。针对这一问题,手工编写程序框架和硬件系统的初始化代码,然后和自动生成的代码进行有机整合后的程序,就是适用于所设计硬件的嵌入式控制软件。使用控制模型实现自动代码生成时,手工编程者只需要考虑模型的接口,在模型中加入对应的模块即可。整合完成就可以编译代码并下载到目标板。
整合后的嵌入式代码的框架为一个循环程序,不断循环执行自动生成的逻辑控制代码。整合过程中要保证定时器的时钟周期与模型仿真时的固定步长一致,模型中的输入、输出变量名与所用单片机的端口要对应。在整合后的源代码文件Controlmain.c中,斜体代码表示和自动生成代码有关的内容。Control-main.c 和 Sunroof.c、Sunroof.h、Sunroof-private.h、Sunroof-types.h、rtwtypes.h一起编译后就生成了可执行的天窗控制器的嵌入式控制软件。
Control-main.c的部分源代码如下:
…
#include"Sunroof.h" /*自动生成的头文件*/
#include"Sunroof-private.h" /*自动生成的头文件*/
#include"rtwtypes.h" /*自动生成的头文件*/
#include"Sunroof-types.h" /*自动生成的头文件*/
…(此处省略中断初始化程序、脉宽定时器中断程序以及端口初始化程序)
/*定时器中断程序,需放入自动生成的代码*/
--interrupt void MD-INTTMH0(void)
{
Sunroof-U.SO-TD-Switch=~P8.5;/*WU1*/
Sunroof-U.SC-TU-Switch=~P8.3;/*WU2*/
Sunroof-U.SlidePulseCount=503;
Sunroof-U.TiltPulseCount=94;
Sunroof-step();/*自动生成的Sunroof.c文件中的函数*/
P3.2=Sunroof-Y.MotorPort32;
P6.1=Sunroof-Y.MotorPort61;
P1.2=~Sunroof-Y.LightYellow;
P1.1=~Sunroof-Y.LightGreen;
P1.0=~Sunroof-Y.LightRed;
}
…
void SystemInit()
{
DI(); //关中断
PortInit();
TMH0-Init();
init-INTP6();
init-INTP7();
init-INTP4();
EI();∥开中断
}
void main(void)
{
SystemInit();
Sunroof-initialize();/*自动生成的 Sunroof.c文件中的函数*/
while(1);
}
4 结束语
在汽车天窗控制器的设计中采用基于模型的开发方法收到了良好的效果。通过对模型充分调试后,自动生成逻辑控制部分的代码,然后手工编写底层硬件初始化和驱动程序,将两部分代码合理整合,完成后的天窗控制软件运行正确可靠,提高了开发的效率和正确性。特别是针对使用RTWEC不提供支持的微控制器芯片,通过这种代码自动生成和整合的方法,为广泛采用基于模型的嵌入式软件开发进行了有意义的尝试。
[1] Jimming Yang,Jason Bauman,Al Beydoun.Implementation of Auto-Code Generation in Legacy Code for Body Control Software Applications[C]∥SAE World Congress,2008.
[2] 陈金干,魏学哲.基于DSP的自动代码生成及其在电池管理系统中的应用[J].电子技术应用,2008:43-46.
[3] 陈永春.从Matlab/Simulink模型到代码实现[M].北京.清华大学出版社,2002.
[4] 杭勇,刘学瑜.利用代码自动生成技术实现柴油机电控系统控制算法的开发[J].内燃机工程,2005,26(2):9-12.
[5] Jinsong Zhang,Qiqiang Li,Qingqiang Guo.A Simulation Method of Controlled Hybrid Petri Nets Based on Matlab Simulink/Stateflow[C]∥Proceedings of the IEEE International Conference on Automation and Logistics,2007(18-21):2432-3426.