MATLAB与C读书笔记_matlab与c读书笔记
MATLAB与C读书笔记由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“matlab与c读书笔记”。
基于C进行dSPACE仿真的技术路线
dSPACE关联于MATLAB的Simulink,由Simulink提供计算模块,dSPACE提供Realtime Interface(RTI)的形式模块化输入输出端口。MATLAB基于Simulink的Realtime Workshop编译生成目标机器可执行代码,并下载到dSPACE中执行。
C与MATLAB联系密切,MATLAB提供了多种利用C实现高效、快速运算编程的方法,并能实现针对不同平台的可执行代码生成和优化。不断升级完善的Realtime Workshop以及Realtime Workshop Embedded Coder保证了C代码可以稍作修改即直接载入处理器执行运算,并且得到了DO178B、IEC61508认证,在航空航天和国防领域有广泛应用。配合Simulink的Model Advisor检查模型代码,使模型易于改进。MATLAB提供的Model Reference可以将模块独立处理,采用增进式代码修改,适合于大型系统的模块化设计。
本文需要探讨的问题是如何利用大量已有的C文件进行dSPACE仿真。因此,将首先介绍MATLAB中与C有关的External Interfaces和S-Function,然后再根据这些介绍寻找较为简捷的实现方案。
1、External Interfaces
提供MATLAB与外部程序和设备进行输入输出通讯的接口。
1)Mat文件
MATLAB的数据文件即Mat文件,它可以实现数据在平台之间的转移或外部程序与MATLAB的数据传递。MATLAB提供了一些前缀为mat的函数,可以在C中直接调用。通过专用的API编译,Window环境下为matlabroot bin win32 mexopts *engmatopts.bat,编译在cmd窗口执行。
2)共享库(Shared Libraries)
Windows环境下共享库是动态链接文件,后缀为.dll,用C等编写,在MATLAB中调用。利用loadlibrary()和unloadlibrary分别完成动态链接文件的装载和卸载,装载完成后可以使用calllib()函数在MATLAB中调用动态库中函数。
3)Mex文件
Mex是MATALAB Eexcutable的缩写,类似于共享库,Mex文件可以在MATLAB命令行中直接调用。Mex主要应用于
A、直接使用已经编写的C程序,而不需重新编写m文件;
B、对运算性能要求较高的应用场合。
MATLAB有四种Mex文件:
1、源Mex文件,用C书写的代码;
2、二进制Mex文件,MATLAB中执行的动态链接进程;
3、Mex函数库,即能够在MATLAB中使用的API库;
4、Mex编译脚本,将源Mex文件转换成二进制Mex文件的MATLAB函数。
源Mex文件中,需要将原C文件中的main改写成需要使用的函数名,源Mex文件一般包括三个部分:gateway进程、计算进程和处理器宏。计算进程即编写的计算函数,其后,要按规定格式编写用于建立gateway进程的mxfunction,主要是变量传递和解释,需调用mex.h文件。编译采用mex functionname.c的命令形式,编译后的函数可以像众多MATLAB内建函数一样直接调用。
2、MATLAB S-Function
在MATLAB中可以用m文件、C、C++、Ada和Fortran等编写Simulink模块,其中C、C++、Ada和Fortran编写的S-Function以Mex文件的形式进行编译。
以m文件编写的S-Function有Level1和Level2之分,其中Level2可以调用更加丰富的S-Function的API资源,并且支持代码生成(手动书写,适合于dSPACE与RTI)。
以C Mex形式编写的S-Function具有最大的灵活性和功能性,支持面向应用对象编译(Target Language Compiler TLC)的代码生成,该代码自动生成,不需要手动添加编译文件,可以将算法写成C Mex的形式,也可以构建一个wrapper S-Function去调用C/C++/Fortran代码。MATLAB提供了编写C Mex S-Function的模板文件sfuntmpl_doc.c和用户界面S-Function Builder。
MATALB还提供一个Legacy Code Tool(继承代码工具?)用于创建能够调用C和C++的S-Function,同样支持TLC,但能够利用的API有限,适用于仅计算输出而不计算状态的Legacy Code。
需要注意的是,C Mex S-Function不支持总线输入输出,对模型参考也不完全支持;S-Function Builder则不支持总线输入输出、向量、多速率采样、输入输出数量变化等。除上述以代码区分S-Function类型外,S-Function也可以分为Noninlined和Wrapper and Fully Inlined两种。前者即C Mex S-Function,dSPACE提供的应用说明Implementation Guide主要是针对C Mex S-Function。后者是基于TLC代码生成,多个文件相互独立。
1)使用已有的C文件构建S-Function
对已经存在的C程序文件,在Simulink中有3种方法:
A、Wrapper S-Function。
手写C S-Function和TLC文件,要求对S-Function的深入了解。
在Wrapper函数同一般的S-Function一样,主要有mdlInitializeSizes()、mdlInitializeSampleTimes()、mdlOutputs()、mdlTerminate()等方法,其中在mdlOutputs()方法中调用已经编写好的C程序,该C程序按照标准C书写。
完成Wrapper函数的编写后,在MATLAB命令窗口运行mex命令编译即可。
此外还需要编写TLC文件才能生成RTW代码,TLC文件基于m编写,基本的函数有BlockTypeSetup和Outputs。Wrapper和TLC文件都可以参考MATLAB提供的模板进行编辑。
B、S-Function Builder。
通过GUI界面编辑,自动生成S-Function和TLC文件,不强调对S-Function的熟练掌握。需要创建声明已有C文件的库函数,并在Builder面板的Libraries中指定对应的C文件和需引用的库文件。此外需要调整初始化、输入和输出等一些参数。完成配置后,点击Build按钮即生成S-Function、Wrapper和TLC三个文件。
C、the Legacy Code Tool。
通过命令在MATLAB Workspace中定义S-Function,无需掌握S-Function的知识。其基本命令如下:
def = legacy_code('initialize');
def.SourceFiles = {'doubleIt.c'};//源C文件
def.HeaderFiles = {'doubleIt.h'};//库文件
def.SFunctionName = 'legacy_wrapsfcn';//S-Function名称 def.OutputFcnSpec = 'double y1 = doubleIt(double u1)';def.SampleTime = [-1,0];
legacy_code('sfcn_cmex_generate', def);
legacy_code('compile', def);
legacy_code('sfcn_tlc_generate', def);
通过the Legacy Code Tool与通过S-Function Builder生成的S-Function不同:Builder生成的结果中,已有的C文件被wrapper函数调用,而Legacy Code Tool则直接调用已有的C文件;通过Builder面板可以定义S-Function的输入输出变量名称,而Legacy Code Tool中仅取默认的y和u。
2)使用C编写S-Function
S-Function的基本结构是:
#define//函数名
#include//函数头
mdl*()//调用API方法
#ifdef…endif//尾部声明
S-Function的API方法均已mdl开头,如mdlInitializeSizes()。编写好的S-Function使用mex命令进行编译。
3、结论
综合上述介绍,比较简单的使用已有C文件进行dSPACE仿真的技术路线有以下3种:
1).C文件→Mex编译脚本mexfunction→二进制Mex文件(.mexw32)→Simulink S-Function模块。
2).C文件→the Legacy Code Tool→C S-Function和TLC文件→.mexw32文件→Simulink S-Function模块。
3).C文件→S-Function Builder→.mexw32文件→Simulink S-Function模块。
其中,the Legacy Code Tool允许Simulink直接调用C代码,比C S-Function易用。当然,C S-Function更加灵活,功能更加丰富。
对于只计算输出的函数,可以直接利用the Legacy Code Tool。而对于需要计算微分方程的函数,则不能简单的直接利用原有的C文件,需要考虑是单独编译微分方程数值计算方法,还是使用MATLAB自身的ODE方法。
需要注意的是,dSPACE不支持M/C++/Fortran/Ada编写的S-Function,因此已有的C文件必须用C编写。
C语言读书笔记——读《C程序设计》笔记一学期对《c语言程序与设计》的学习与应用使我对c语言产生了浓厚的兴趣。C语言程序与设计是一门实践性很强的课程,不可能只靠听课和看......
Vc++读后感闲来无事,跑来图书馆,突然被一本名叫《致程序员之家论坛的所有会员》的书把我的注意力吸引过去了,于是我用心的读起来了。下面这些是我做的一些笔记。应该掌握程序运......
总结一个星期前老师给了一个任务,要求用GUI做成一个simulink仿真界面,通过matlab与SQL的连接,然后把仿真结果存到sql里建的数据库里。从一开始什么都不懂,到现在可以用GUI做一个......
Matlab 与线性代数一、 Matlab 入门:1.启动、退出、运行: 2.窗口介绍: 3.基本符号: =:赋值符号[ ]:数组定义符号 , 区分列 函数参数分隔符 ; 区分行 取消运行显示 % 注释标记: 具......
MATLABMATLAB是矩阵实验室(Matrix Laboratory)之意。除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,文字处理,可视化建模仿真和实时控制等功能。MATLAB的基本数据单......
