关于使用Stateflow调用外部C代码的教程介绍

描述

无论是Simulink仿真,还是对模型做代码生成,已有C代码的调用都是我们经常会遇到的情形:

如何调用现有的外部C代码?

很多人首先想到的是S-Function。的确,S-Function提供了一种途径,可以让我们把C函数封装成Simulink模块在Simulink环境下运行。另外还有一种方式,叫做Legacy Code Tool,说白了也是S-Function,只是MATLAB提供了这样的接口便于用于实现S-Function封装。这两种做法都不是我要介绍的。

我想跟大家说的是更方便的方法:

使用Stateflow调用外部C代码。

假设有两个文件,myfile.c和myfile.h。其中myfile.c中定义了一个全局函数和全局变量,如下:

#include "myfile.h"

double x;

double myfun(double a, double b)

{

return a +b;

}

myfile.h文件是对全局函数myfun()和全局变量x的声明。

假如我已经为Chart定义了两个输入input1和input2,一个输出output,那么Stateflow里你就可以像下面这样使用这个函数和变量:

变量

除此,你不仅可以使用flowchart去调用外部C代码,你也可以在状态机里调用外部代码,如下图:

变量

当然,如果要做到上述直接调用C代码,需要做如下几点设置:

把Stateflow的动作语言(Action Language)设置为C;

打开如下界面进行如图示的配置

变量

以上是针对新版本MATLAB的界面。

对于老版本的MATLAB,在Simulation Target下面,还有一层Custom Code,作用和新版本是一样的。

这里我们有三个地方可以设置,Insert custom C code in generated,这下面的几个栏,都是把右侧编辑框里的文本信息插入到Stateflow生成的Source file、Header file以及Initialize function和Terminate function里面。

说到这里很多人可能会迷糊了,Stateflow要生成代码?没错,Stateflow的运行不同于Simulink模块,Simulink模块可以事先定义好各种行为或者动作,而Stateflow chart里面的设计可能千差万别,没法事先定义chart的行为,所以在运行Stateflow chart的时候,首先需要把这个chart转成S-Function格式的C代码,然后编译成动态链接库文件(MATLAB里面扩展名是mexw32或者mexw64,32或者64取决于MATLAB的位数),而这个插入代码就发生在从chart转成C代码的过程中。比如,按照上图的设置,在生成的C代码的头文件中会有一行代码 #include “myfile.h”。

另外,Additional build information里面,需要指定路径,在Include directories里面给出要编译的C文件的路径,如果C文件和模型在同一路径下,也可以不指定;在Source files里面,给出要编译的C文件myfile.c。这部分内容,是告诉编译器和链接器需要编译的C文件在什么路径下以及需要编译哪些自动生成的文件之外的C文件。

说到底,对于现有C代码的调用,无论是自己编写S-Function,还是使用Legacy Code Tool创建S-Function模块,或者使用Stateflow,最终的实现方式都是S-Function(动态链接库)相比之下,使用Stateflow会更便利、更直观一些。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分