基于模型设计—自动代码生成之硬件驱动

  • 格式:pdf
  • 大小:625.98 KB
  • 文档页数:10

基于模型设计—自动代码生成之硬件驱动1声明:本文是《基于模型设计—自定义目标系统配置指南》的续集,主要和大家分享RTW工具箱做自动代码生成时,硬件驱动的编写方法;本文涉及两方面的技术难点CMEXS函数和TLC文件的编写,对这两方面不熟悉的童鞋可以先看看相关的Help文档。通过硬件驱动模块和上层控制模块的结合,可以实现嵌入式系统C代码的一键式生成,所生成的代码无需做任何修改就可以直接下载到单片机中。本教程开发环境如下:Matlab2010a+CodeWarriorV6.3+Mc9s08dz60欢迎汽车电子工程师加入QQ群:89462451,讨论Matlab在汽车行业的应用,分享自己的独门经验。中断、IO、ADC、TPM、CAN、CCP、MCG……下一个模块硬件驱动,你也可以~~~tntuyh@163.comGodman2011.8.20

附件列表:dz60——该文件夹为自定义目标系统文件系统TLC文件、主函数TLC文件、_file_processTLC文件、_callback_handler文件、_make_rtw_hook文件、模块TLC文件(及C-MexS函数)blocks——该文件夹为中断模块+数字输出模块的硬件驱动、interrupt_init.c—中断模块CMEXS函数interrupt_init.tlc—对应的TLC文件dz60_dio_out.c—数字输出模块CMEXS函数dz60_dio_out.tlc—对应的TLC文件demos——该文件夹为测试用demo文件interrupt_demo.mdl—测试模型,实现500ms和100ms任务

基于模型设计—自动代码生成之硬件驱动......................................................................................................................331、自定义目标创建.....................................................................................32、软件整体架构.........................................................................................33、硬件驱动编写.........................................................................................53.1主函数文件硬件驱动......................................................................53.2中断模块硬件驱动..........................................................................53.3数字输出模块硬件驱动...................................................................9基于模型设计—自动代码生成之硬件驱动

2基于模型设计基于模型设计——自动代码生成之硬件驱动1、自定义目标创建本文的硬件平台为Mc9s08dz60,Matlab没有相应目标系统和现成使用模块,所以需要自己创建自定义目标系统和编写相应的硬件驱动。关于自定义目标系统的创建可以参考《基于模型设计—自定义目标系统配置指南》。DZ60的自定义目标系统源代码请参考附件中dz60文件夹下的各文件,此处不再累述。通过setup.m文件可以自动向Matlab中添加该目标系统。

2、软件整体架构软件架构对嵌入式系统的重要性,就不再多说了。这里选择较为简单的中断驱动方式来实现整个嵌入式软件的调度。

图1软件整体架构如上图所示,所有的程序处理都是通过RTC中断来实现的,配置RTC模块每隔基于模型设计—自动代码生成之硬件驱动310ms产生一次中断,并对各个任务进行计时(如flag_100ms),当计时达到时调用相应的任务处理函数(如task_100ms),而主函数中只对整个工程进行初始化(如interrupt_demo_initialize),在for循环中无需其余操作。RTC中断处理函数部分通过中断模块及TLC文件来对生成的代码进行控制,后文将详述。在模型搭建过程中,只需要调用中断模块,通过修改FunctionCallSystem中的内容即可以实现各种任务的调度,如下图所示:基于模型设计—自动代码生成之硬件驱动

4图2软件架构之模块搭建PS:当然,在实际的产品会根据项目需要采用不同的软件架构来实现任务调度,其余架构及嵌入式操作系统的嵌入都可以在本文的基础上进行修改来满足项目需求。非常期望和各位探讨关于嵌入式系统软件架构方面的内容。

3、硬件驱动编写硬件驱动主要是编写CMEXS函数和其对应的TLC文件。3.1主函数文件硬件驱动主函数部分编写过程可以参考《基于模型设计—自定义目标系统配置指南》中2.5主函数TLC文件—htgt_srmain.tlc。

3.2中断模块硬件驱动中断模块只需要传递一个任务周期即可,该参数为edit类型的数据。3.2.1Mask对话框1、首先在Simulink——User-DefinedFunction中找到S-Function模块拖到一个新建的model文件中。2、单击右键,寻则EditMask,在Icon&Ports选项卡中输入该模块需要显示的内容,如disp('RTCInterrupt'),如下图:基于模型设计—自动代码生成之硬件驱动53、点击Parameter选项卡,安装如下方式填写参数信息,其中Promt为显示提示,Variable为参数名称在s函数中调用,Type为显示格式。

4、点击Documentation选项卡,填写相关提示信息,最终该模块显示结果如下。

3.2.2CMEX函数编写

在看这部分之前,强烈建议先看看Matlab关于CMEXS函数的编写的Help文档。1、文件声明部分#defineS_FUNCTION_NAMEinterrupt_init#defineS_FUNCTION_LEVEL2每个CMEXS函数都是按照上面的方式进行声明,这段代码的含义为,声明一个名为interrupt_init和LEVEL2S函数。

2、参数声明基于模型设计—自动代码生成之硬件驱动6参数声明部分,主要是创建一个枚举数组,用于后面的各函数调用,如上面那段代码创建一个以0开始的枚举数据,即INT_PERIOD=0,N_PARAMS=1;后面那行define用于从终端模块对话框中读取相应的参数。3、模型初始化函数

该部分代码针对中断模块含有的变量个数,输入模块个数、类型等参数进行初始化。4、mdlRTW函数

该函数用于把S函数的参数值,传递到model.rtw文件中,再通过tlc文件读取rtw文件中值,从而控制自动代码的生成。5.其余函数

设置参数个数设置参数为不可调设置采样时间为继承,输出模块个数为0,输出模块个数为1,输出模块维度为1及相关优化属性。

参数读取参数传递到RTW文件中基于模型设计—自动代码生成之硬件驱动

7对应一般的CMEXS函数只需要上述两个函数即可实现功能。对于中断模块,由于其需要调用FunctionCallSystem,所以要多一点设备。

3.2.3TLC文件编写

TLC文件用于控制代码的自定义生成,主要有如下函数:1、BlockTypeSetup函数该函数主要用于同一类模块的初始过程,如一个模型同时函数两个中断模块,则该函数内的代码只会执行一次。这里考虑多个中断模块的情况,需要设置一个全局变量来存储多个模块的任务周期。::Vct_Int_Period表示为全局变量。

2、Start函数该函数用于控制各模块的的初始化代码的生成,如中断模块需要对RTC模块的RTCSC和RTCMOD寄存器进行配置,而这部分代码应该在初始化代码中生成(即interrupt_demo_initialize函数)。当一个模型含有多个中断模块时,这个函数对多次在每个中断模块中都执行,这样就能读取到所有中断模块的定时周期,基于模型设计—自动代码生成之硬件驱动

83、Outputs函数该函数用于控制中断模块的任务调度代码的生成。在该函数中需要调用LibBlockExecuteFcnCall函数来对FunctionCallSystem模块中代码进行生成,还需要针对硬件进行相应的函数、变量声明等。如通过如下代码可以实现在model.h文件中声明函数

由于TLC文件的编写是个复杂的过程,没法用简单的几句话说明白,所有本文仅对TLC文件的结构进行分析,而不详细阐述每段代码的具体含义,感兴趣的童鞋可以自己先看看RTW工具箱中关于TLC部分的介绍,再结合附件中的代码摸索。

3.3数字输出模块硬件驱动数字输出模块的硬件驱动和中断模块的驱动非常相似,此处只做简要介绍。3.2.1Mask对话框数字输出模块需要再对话框中配置Port和number两个参数,用于控制各io通道的输出。而输入模块则为0、1、-1,其中0表示输出电平,1表示输出高电平,-1表示取反;mask对话框如下图所示,其创建过程与前文一致,不再累述。