文献标识码:A
文章编号: 0258-7998(2012)07-0033-04
随着汽车电子的飞速发展和代码自动生成技术的出现,汽车电子控制系统实现了从建模、仿真到代码自动生成的一体化开发, 极大提高了生成代码的效率、通用性及可移植性[1]。但是,汽车控制系统中驱动代码却依赖于特定的硬件与运行环境,主要还是以手工编写代码为主[2]。这种手工编写代码的方法存在大量的重复劳动,且代码无法规范统一,可重用性不强、可读性差。
所以,设计一款可以兼容多款处理器的驱动代码工具,生成统一性、规范性和开发性代码成为行业发展的趋势。当前在汽车行业应用最广的是德国dSPACE公司的Targetlink代码生成工具和Mathworks公司的RTW代码生成工具[3]。本文采用Matlab/Simulnik/RTW工具设计并实现了基于代码生成技术的驱动工具箱,实现了汽车电控系统中驱动代码生成的可靠性、安全性、高效性及可移植性。
1 AutoSAR规范驱动接口
汽车开放式系统架构标准AutoSAR(AuTomotive Open System ARchitecture),主要可分为三层:应用层、运行时环境和基础软件。其中基础软件又包括系统服务、ECU抽象层和uC抽象层,所有驱动程序都包含在uC抽象层和ECU抽象层中。
本文依据AutoSAR规范中ECU抽象层和uC抽象层中硬件接口标准编写驱动程序,组成驱动资源库[4]。驱动程序按照硬件功能特点可分为四类:通用I/O硬件驱动、通信硬件驱动、存储硬件驱动和微控制器驱动。其内容与结构如图1所示。
AutoSAR规范定义了汽车电控单元硬件驱动程序的接口规范,把驱动函数进行了标准化和模块化,为驱动工具箱开发应用奠定了良好的基础。
2 驱动代码生成工具箱的设计与实现
2.1 设计方法
在Simulink/RTW平台上设计基于AutoSAR规范的驱动代码生成工具箱是通过建立S函数模块配置参数并设计封装入库[5]来实现的。驱动工具箱的设计流程如图2所示,具体内容如下:
(1)分析AutoSAR规范中驱动函数接口标准的内容,确定驱动应用代码的内容。
(2)分析汽车电控系统中驱动代码的需求,确定驱动应用代码的格式。
(3)根据规范和需求确定驱动工具箱的设计方案,设计驱动工具箱为驱动配置功能模块和驱动API功能模块两大类。
(4)编写S函数,实现驱动配置功能模块和驱动API功能模块的参数变量。
(5)在Simulink平台上建立S函数模块并添加各功能模块的参数变量。
(6)设计和封装S函数模块内容及格式,实现驱动功能模块的功能和创建驱动工具箱并添加到Simulink库中。
(7)依据驱动工具箱的功能编写代码生成模板,实现驱动应用代码自动生成。
2.2 实现
下面以驱动ADC模块的实现为例详细介绍驱动工具箱模块的实现方法。
依据驱动工具箱的设计方案可知,驱动ADC功能模块分为配置模块和API模块。ADC配置模块实现不同处理器初始化配置;API模块(即ADC驱动函数模块)实现驱动函数接口的配置及函数的调用。ADC功能模块实现的主要步骤及内容如表1所示。
ADC驱动模块库中配置模块通过初始化相关参数的配置,实现不同处理器下驱动ADC使用时其相关的头文件包含、配置文件生成、初始化结构体参数配置及ADC的API开关定义。ADC驱动API模块由API函数接口变量的配置实现驱动函数与控制算法的无缝连接,并配置函数体参数实现API函数的正确调用。
各驱动模块设计封装好后添加到Simulink库中就完成了驱动工具箱的设计。图3是驱动代码生成工具箱各功能模块的结构图。
3 驱动工具箱代码生成模板的设计与实现
代码生成模板基于模块TLC设计,其主要功能是驱动函数初始化代码的实现和API函数调用代码的实现[5]。
3.1 设计
基于RTW的代码生成工具设计驱动工具箱代码生成模板,主要包含系统目标TLC和驱动模块TLC。系统目标TLC在Matlab7.1版系统目标osekworks.tlc基础上修改,修改TLC组件的包含及相关文件名即可[6]。驱动工具箱代码生成模板结构图如图4所示。
驱动配置模块TLC实现驱动初始化部分代码的生成,驱动API模块实现驱动函数调用代码的生成。下面结合这两类功能模块TLC介绍驱动工具箱代码生成模板的设计。
(1)驱动配置模块TLC的设计
驱动配置模块TLC结合配置模块参数生成关联芯片选择的驱动初始化相关代码,其主要内容可以分为三大部分,具体内容如下:
①头文件包含代码。TLC文件中由条件判断语句判断文件包含命令,再由TLC中文件内插入代码语句实现头文件包含代码。
②配置文件与API开关代码。TLC中首先判断芯片选择内容,再由配置文件生成语句实现对应的配置文件生成,最后在生成的配置文件中添加对应选择芯片的驱动API开关代码内容。
③用户自定义函数与驱动初始化函数代码。用户自定义函数包含驱动初始化函数、实现用户自定义驱动初始化函数功能。用户自定义函数代码包含main函数中的函数调用、头文件中函数的声明、源文件中函数体的定义等内容。驱动初始化结构体参数和初始化函数内嵌到自定义函数定义里。
(2)驱动API模块TLC的设计
按照API模块代码生成模板功能,驱动API模块TLC要实现的是API函数的调用代码和函数返回值传递。API函数调用代码包含函数及参数配置,在TLC中由获取模块参数值实现。函数返回值的传递由全局变量实现,在配置文件中对全局变量进行定义声明。
3.2 实现
每个驱动模块代码生成模板实现方法都一致。下面以ADC为例分析驱动配置模块TLC和驱动API模块TLC介绍代码生成模板的具体实现。
(1)ADC驱动配置模块TLC的实现
ADC驱动模块TLC内容分三部分,各部分通过条件选择和配置文件实现与芯片选择关联。
①头文件包含部分实现主要代码如下:
%assign
c/hFile=LibCreateSourceFile("Source/Header","Custom,
"%
%
//头文件或者源文件生成代码实现
%openfile buffer
#include“adc_app.h”
%closefile buffer
②配置文件与API开关部分:在生成的配置文件中添加相关API开关,实现代码如下:
%openfile buffer
%if SFcnParamSettings.Adc_GetVersionInfo_API==
"on"
#define ADC_GET_VERSION_INFO_API STD_ON
…….//各驱动API开关添加
%closefile buffer
③配置文件与驱动初始化配置:在生成的配置文件中添加驱动初始化代码,实现代码如下:
%openfile buffer
void %
{const Adc_ConfigType
%
ADC驱动初始化结构体参数代码};
Adc_Init(&%
%closefilebuffer
(2)ADC驱动API模块TLC的实现
驱动API模块TLC中主要是函数参数配置与返回值传递,具体实现代码如下:
%openfile buffer
Extern%
%closefile buffer
在生成源文件中插入以下代码实现全局变量定义:
%openfile buffer
%
%closefile buffer
4 驱动代码生成工具箱的应用
驱动工具箱应用于BCM车窗控制系统中,实现车窗控制系统中驱动代码的自动生成。
车窗控制系统中需要驱动的有两部分:车窗控制函数的输入信号由ADC采样获取;车窗控制函数输出信号由DIO或者PORT实现对目标ECU管脚的输出,完成对车窗的驱动。
使用Real-Time Workshop将Simulink模型转化为代码时,编译器通过系统目标TLC并调用模块对应的TLC文件,最终生成满足目标ECU的C语言代码。下面是RTW中驱动应用于车窗控制模型代码自动生成的三个步骤:
第一步:修改Matlab中系统目标TLC文件osekworks.tlc。
第二步:配置模型参数配置对话框中的标签页对其中几个标签页进行设置。
(1)Solver:设置Solver类型为离散(discrete)固定步长(Fixed-step);
(2)Real-Time Workshop:在该标签页中填写系统目标osekworks.tlc,调用对应的模块TLC文件来生成代码。
第三步:代码自动生成。 点击Real-Time Workshop中的GenerateCode可以直接生成代码。
从代码生成报告中可看出,驱动应用部分代码主要体现在包含驱动初始化代码的配置文件和调用驱动API函数的车窗控制算法代码文件中。下面是两部分的驱动应用代码生成的结果。
(1)Adc_App.c文件中ADC驱动初始化部分:
#include "Adc_App.h"
uint16 DataBufferPtr_FR[1]= { 0 };
void Adc_APP_Init_FR()
{const Adc_ConfigType Adc_Config= {
ADC_CHANNEL_3,
……};//结构体参数配置
Adc_Init(&Adc_Config);
(2)车窗控制scan_MR_window_SW中ADC驱动应用:
unsigned char scan_MR_window_SW(old_AD)
{unsigned int AD_value,status;
Adc_APP_Init_MR();
Adc_SetupResultBuffer(ADC_GROUP_2,DataBuffer Ptr_MR); 本文采用Matlab/Simulink/RTW工具,结合AutoSAR驱动规范,提出了一种基于代码生成技术的汽车电子底层驱动工具箱的设计方法。该方法能屏蔽芯片硬件特性的差异性,满足不同硬件处理器要求。通过BCM车窗控制模型对驱动的应用,实现了代码的自动生成。快速替换控制模型中的被控对象,极大地方便了汽车电子嵌入式控制系统底层驱动代码的应用,提高了汽车电子控制系统的开发效率。
参考文献
[1] 齐振恒,孙中杰,李涛.RTW嵌入式代码自动生成机制与代码结构分析[J].计算机测量与控制,2010,18(3):639-642.
[2] 鄢化彪.构建RTW下的嵌入式系统开发环境.单片机与嵌入式系统应用[J].2007(1):72-73.
[3] Real-Time workshop for use with Simulink[M].The Mathworks Inc.1999:5-26.
[4] 王安军,蒋建春,陈培然.符合AUTOSAR 规范的底层驱动软件开发[J].计算机工程,2011(9):62-64、67.
[5] 陈永春.从Matlab/Simulink模型到代码实现[M].北京:清华大学出版社,2002:180-200.
[6] Hu Jinhui,Hu Dabin,Xiao Jianbo.Study of real-time simulation system based on RTW and Its application in warship simulator[C].Conference on Electronic Measurement & Instruments,2009:966-970.