当处理对函数的调用时喷火
在你的MATLAB中®代码,代码生成器找到的定义喷火
并为它的身体生成代码。在某些情况下,您可能想要绕过代码生成,而使用MATLAB引擎来执行调用。使用coder.extrinsic(“foo”)
声明调用喷火
不生成代码,而是使用MATLAB引擎执行。在这种情况下,喷火
被称为外部函数。只有当MATLAB引擎在执行过程中可用时,此功能才可用。这种情况的例子包括MEX函数的执行,Simulink万博1manbetx®模拟,或在代码生成时的函数调用(也称为编译时).
如果为调用的函数生成独立代码喷火
,包括coder.extrinsic(“foo”)
时,代码生成器试图确定是否喷火
影响输出。如果喷火
不影响输出,代码生成器继续与代码生成,但排除喷火
从生成的代码。否则,代码生成器将产生编译错误。
包括coder.extrinsic(“foo”)
指令声明了所有的调用喷火
MATLAB函数是外在的。或者,您可能希望将外部声明的范围缩小到只有一个调用喷火
.看到使用feval调用MATLAB函数.
以下是一些常见的情况,你可以考虑将MATLAB函数声明为外部的:
该函数执行显示或记录操作。这些函数主要在模拟过程中有用,在嵌入式系统中不使用。
在MEX执行或Simulink模拟中,您希望使用代万博1manbetx码生成不支持的MATLAB函数。万博1manbetx此工作流程不适用于非模拟目标。
命令代码生成器对函数调用进行常量折叠coder.const
.在这种情况下,只有在代码生成过程中,当MATLAB引擎可用于执行调用时,才会调用函数。
coder.extrinsic
构造要声明一个函数喷火
作为外在的,在你的MATLAB代码中包含这个语句。
coder.extrinsic (“foo”)
当将函数声明为代码生成的外部函数时,遵循以下规则:
在调用函数之前,将其声明为外部函数。
不要在条件语句中使用外部声明。
将外部函数的返回值赋给已知类型。看到使用mxArrays.
有关更多信息和示例,请参见coder.extrinsic
.
代码生成器自动处理许多常见的MATLAB可视化函数,例如情节
,disp
,数字
,作为外在的。您不必通过使用显式地将它们声明为外部函数coder.extrinsic
.例如,你可能想打电话情节
在MATLAB环境中可视化你的结果。如果从调用的函数生成MEX函数情节
,然后运行生成的MEX函数,代码生成器将调用分派到情节
函数到MATLAB引擎。如果生成库或可执行文件,则生成的代码不包含对情节
函数。
如果您通过使用生成MEX或独立的C/ c++代码MATLAB编码器™,代码生成报告突出显示了从MATLAB代码对外部函数的调用。通过检查报告,您可以确定哪些函数只在MATLAB环境中被支持。万博1manbetx
的coder.extrinsic
构造具有功能范围。例如,考虑以下代码:
函数Y = foo% # codegencoder.extrinsic (“老鼠”,“最小值”);[N D] =大鼠(pi);Y = 0;y = min(N, D);
在这个例子中,老鼠
而且最小值
每次在主函数中调用它们时,它们都被视为外部的喷火
.有两种方法可以缩小主函数内部外部声明的范围:
在局部函数中声明MATLAB函数为外部函数,如下例所示:
函数Y = foo% # codegencoder.extrinsic (“老鼠”);[N D] =大鼠(pi);Y = 0;y = mymin(N, D);函数Y = mymin(a,b) code . external (“最小值”);Y = min(a,b);
这里的函数老鼠
每次在主函数内部调用它都是外部的吗喷火
,但是函数最小值
只有在局部函数内部调用时才是外部的吗mymin
.
而不是使用coder.extrinsic
构造,调用MATLAB函数使用函数宏指令
.下一节将介绍这种方法。
假设您定义了一个类myClass
它有一个非静态方法喷火
,然后创建一个实例obj
这类的。如果你想声明这个方法obj.foo
在你的MATLAB代码中作为外部的,你想要代码生成,遵循这些规则:
写call to喷火
作为函数调用。不要使用点表示法来编写调用。
声明喷火
通过使用语法成为外在的coder.extrinsic(“foo”)
.
例如,定义myClass
为:
classdefmyClass属性道具= 1结束方法函数Y = foo(obj,x) Y = obj。Prop + x;结束结束结束
下面是一个MATLAB函数的例子喷火
外在。
函数y = myFunction(x)% # codegencoder.extrinsic (“foo”);obj = myClass;Y = foo(obj,x);结束
非静态方法也被称为普通方法。看到定义类方法和函数.
使用coder.extrinsic
构造:
调用仿真过程中不产生输出的MATLAB函数,而不会生成不必要的代码。
使您的代码自文档化,并且更容易调试。您可以扫描源代码coder.extrinsic
语句来隔离对MATLAB函数的调用,这些函数可能会创建和传播mxArrays
.看到使用mxArrays.
函数宏指令
若要将外部声明的范围缩小到一个函数调用,请使用函数函数宏指令
.函数宏指令
在代码生成期间自动解释为外部函数。因此,您可以使用函数宏指令
方便地调用您想要在MATLAB环境中执行的函数,而不是编译生成的代码。
考虑下面的例子:
函数Y = foo code . external (“老鼠”);[N D] =大鼠(pi);Y = 0;Y = feval(“最小值”、N、D);
因为函数宏指令
是外在的陈述吗函数宏指令(“分钟”,N, D)
由MATLAB计算-未编译-有相同的结果,宣布函数最小值
只有这一个呼叫的外部。相比之下,函数老鼠
整个函数都是外在的吗喷火
.
的代码生成器不支持使用万博1manbetx函数宏指令
调用位于私有文件夹中的本地函数或函数。
外部函数的输出是mxArray
,也称为MATLAB数组。唯一有效的操作mxArrays
是:
存储一个mxArray
在变量中。
传递一个mxArray
到一个函数。
返回一个mxArray
从一个函数回到MATLAB。
转换一个mxArray
到运行时的已知类型。要执行此操作,请将mxArray
到其类型已由先前的赋值定义的变量。参见下面的例子。
要使用mxArray
由外部函数在其他操作中返回(例如,从MATLAB函数block到Sim万博1manbetxulink执行),你必须首先将它转换为一个已知的类型。
如果函数的输入参数是mxArrays
,代码生成器自动将该函数视为外部函数。
转换为mxArray
对已知类型分配mxArray
到已定义类型的变量。在运行时,mxArray
转换为被赋值给它的变量的类型。然而,如果数据在mxArray
与变量的类型不一致,则会得到运行时错误。
例如,考虑以下代码:
函数Y = foo% # codegencoder.extrinsic (“老鼠”);[N D] =大鼠(pi);y = min(N,D);
这里是顶层函数喷火
调用外部的MATLAB函数老鼠
,返回2mxArrays
表示分子N
和分母D
有理分数的近似π
.你可以通过这些mxArrays
到另一个MATLAB函数-在这种情况下,最小值
.因为输入传递给最小值
是mxArrays
,代码生成器自动处理最小值
作为一个外在函数。因此,最小值
返回一个mxArray
.
在生成MEX函数时使用MATLAB编码器,你可以直接赋值mxArray
返回的最小值
到输出y
因为MEX函数将其输出返回给MATLAB。
但是如果你把喷火
在一个MATLAB函数块,然后更新或运行模型万博1manbetx,你会得到这个错误:
在此上下文中,函数输出'y'不能是mxArray。考虑使用已知类型预初始化输出变量。
发生此错误是因为返回一个mxArray
不支持回Simu万博1manbetxlink。万博1manbetx要解决这个问题,请定义y
为您所期望的值的类型和大小最小值
在本例中,返回一个标量double,如下所示:
函数Y = foo% # codegencoder.extrinsic (“老鼠”);[N D] =大鼠(pi);Y = 0;将y定义为double类型的标量y = min(N,D);
在代码生成过程中不支持完整的MATLAB运行时环境。万博1manbetx因此,在外部调用MATLAB函数时,有以下限制:
检查调用者或对调用者工作区进行读写的MATLAB函数在代码生成期间无法工作。这些职能包括:
如果你的外部函数在运行时执行以下操作,生成代码中的函数可能会产生不可预知的结果:
改变文件夹
更改MATLAB路径
删除或添加MATLAB文件
更改警告状态
更改MATLAB首选项
更改Simul万博1manbetxink参数
的代码生成器不支持使用万博1manbetxcoder.extrinsic
调用位于私有文件夹中的函数。
的代码生成器不支持使用万博1manbetxcoder.extrinsic
调用局部函数。
您可以调用具有最多64个输入和64个输出的外部函数。