人人范文网 范文大全

MATLAB与C读书笔记

发布时间:2020-03-03 01:46:02 来源:范文大全 收藏本文 下载本文 手机版

基于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语言读书笔记

matlab与sql总结

Matlab 与线性代数教案

matlab

MATLAB

Matlab学习心得系列——001. 先从C语言谈起

高质量编写c c++ 读书笔记

Matlab与Simulink仿真学习心得

信号与系统 MATLAB实验报告

MATLAB与C读书笔记
《MATLAB与C读书笔记.doc》
将本文的Word文档下载到电脑,方便编辑。
推荐度:
点击下载文档
点击下载本文文档