基于模型设计—自动代码生成之硬件驱动
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
声明:本文是《基于模型设计—自定义目标系统配置指南》的续集,主要和大家分享RTW工具箱做自动代码生成时,硬件驱动的编写方法;本文涉及两方面的技术难点CMEX S函数和TLC文件的编写,对这两方面不熟悉的童鞋可以先看看相关的Help 文档。
通过硬件驱动模块和上层控制模块的结合,可以实现嵌入式系统C代码的一键式生成,所生成的代码无需做任何修改就可以直接下载到单片机中。
本教程开发环境如下:Matlab2010a+CodeWarrior V6.3+Mc9s08dz60
欢迎汽车电子工程师加入QQ群:89462451,讨论Matlab在汽车行业的应用,分享自己的独门经验。
中断、IO、ADC、TPM、CAN、CCP、MCG……下一个模块硬件驱动,你也可以~~~
tntuyh@ Godman2011.8.20
附件列表:
dz60——该文件夹为自定义目标系统文件
系统TLC文件、主函数TLC文件、_file_processTLC文件、_callback_handler
文件、_make_rtw_hook文件、模块TLC文件(及C-Mex S函数) blocks——该文件夹为中断模块+数字输出模块的硬件驱动、
interrupt_init.c—中断模块C MEX S函数
interrupt_init.tlc—对应的TLC文件
dz60_dio_out.c—数字输出模块C MEX S函数
dz60_dio_out.tlc—对应的TLC文件
demos——该文件夹为测试用demo文件
interrupt_demo.mdl—测试模型,实现500ms和100ms任务
(33)
基于模型设计—自动代码生成之硬件驱动...........................................................
1、自定义目标创建 (3)
2、软件整体架构 (3)
3、硬件驱动编写 (5)
3.1主函数文件硬件驱动 (5)
3.2中断模块硬件驱动 (5)
3.3数字输出模块硬件驱动 (9)
基于模型设计——自动代码生成之硬件驱动
基于模型设计
1、自定义目标创建
本文的硬件平台为Mc9s08dz60,Matlab没有相应目标系统和现成使用模块,所以需要自己创建自定义目标系统和编写相应的硬件驱动。关于自定义目标系统的创建可以参考《基于模型设计—自定义目标系统配置指南》。DZ60的自定义目标系统源代码请参考附件中dz60文件夹下的各文件,此处不再累述。
通过setup.m文件可以自动向Matlab中添加该目标系统。
2、软件整体架构
软件架构对嵌入式系统的重要性,就不再多说了。这里选择较为简单的中断驱动方式来实现整个嵌入式软件的调度。
图1软件整体架构
如上图所示,所有的程序处理都是通过RTC中断来实现的,配置RTC模块每隔
10ms产生一次中断,并对各个任务进行计时(如flag_100ms),当计时达到时调用相应的任务处理函数(如task_100ms),而主函数中只对整个工程进行初始化(如interrupt_demo _initialize),在for循环中无需其余操作。RTC中断处理函数部分通过中断模块及TLC 文件来对生成的代码进行控制,后文将详述。
在模型搭建过程中,只需要调用中断模块,通过修改Function Call System中的内容即可以实现各种任务的调度,如下图所示:
图2软件架构之模块搭建
PS:当然,在实际的产品会根据项目需要采用不同的软件架构来实现任务调度,其余架构及嵌入式操作系统的嵌入都可以在本文的基础上进行修改来满足项目需求。非常期望和各位探讨关于嵌入式系统软件架构方面的内容。
3、硬件驱动编写
硬件驱动主要是编写C MEX S函数和其对应的TLC文件。
3.1主函数文件硬件驱动
主函数部分编写过程可以参考《基于模型设计—自定义目标系统配置指南》中2.5主函数TLC文件—htgt_srmain.tlc。
3.2中断模块硬件驱动
中断模块只需要传递一个任务周期即可,该参数为edit类型的数据。
3.2.1Mask对话框
1、首先在Simulink——User-Defined Function中找到S-Function模块拖到一个新建的model文件中。
2、单击右键,寻则Edit Mask,在Icon&Ports选项卡中输入该模块需要显示的内容,如disp('RTC Interrupt'),如下图:
3、点击Parameter选项卡,安装如下方式填写参数信息,其中Promt为显示提示,Variable为参数名称在s函数中调用,Type为显示格式。
4、点击Documentation选项卡,填写相关提示信息,最终该模块显示结果如下。
3.2.2C MEX函数编写
在看这部分之前,强烈建议先看看Matlab关于C MEX S函数的编写的Help文档。
1、文件声明部分
#define S_FUNCTION_NAME interrupt_init
#define S_FUNCTION_LEVEL2
每个C MEX S函数都是按照上面的方式进行声明,这段代码的含义为,声明一个名为interrupt_init和LEVEL2S函数。
2、参数声明
参数声明部分,主要是创建一个枚举数组,用于后面的各函数调用,如上面那段代码创建一个以0开始的枚举数据,即INT_PERIOD=0,N_PARAMS=1;后面那行define 用于从终端模块对话框中读取相应的参数。
3、模型初始化函数
该部分代码针对中断模块含有的变量个数,输入模块个数、类型等参数进行初始化。
4、mdlRTW
函数
该函数用于把S 函数的参数值,传递到model.rtw 文件中,再通过tlc 文件读取rtw 文件中值,从而控制自动代码的生成。
5.其余函数设置参数个数
设置参数为不可调