使用MATLAB引擎在生成的代码中执行函数调用
处理对函数的调用时喷火
在MATLAB中®代码,代码生成器找到的定义喷火
并为它的身体生成代码。在某些情况下,您可能希望绕过代码生成,而是使用MATLAB引擎来执行调用。使用coder.extrinsic(“foo”)
声明调用喷火
不生成代码,而是使用MATLAB引擎执行。在这种情况下,喷火
被称为外部函数。只有在执行期间MATLAB引擎可用时,此功能才可用。这种情况的例子包括执行MEX函数、Simulink万博1manbetx®模拟,或代码生成时的函数调用(也称为编译时).
如果为调用的函数生成独立代码喷火
,包括coder.extrinsic(“foo”)
时,代码生成器尝试确定是否喷火
影响输出。如果喷火
不影响输出,代码生成器进行代码生成,但排除喷火
从生成的代码。否则,代码生成器将产生编译错误。
包括coder.extrinsic(“foo”)
指令内的某个MATLAB函数声明所有调用喷火
在MATLAB函数内部作为外部变量。或者,您可能希望将外部声明的范围缩小到只有一个调用喷火
.看到使用feval调用MATLAB函数(MATLAB编码器).
何时将函数声明为外部函数
以下是一些常见的情况,在这些情况下,你可能会考虑将MATLAB函数声明为外部函数:
该函数执行显示或记录操作。这些函数主要在仿真过程中有用,在嵌入式系统中不使用。
在MEX执行或Simulink模拟中,您希望使用不万博1manbetx支持代码生成的MATLAB函数。万博1manbetx此工作流程不适用于非模拟目标。
使用指示代码生成器常量折叠函数调用
coder.const
.在这种情况下,只有在代码生成期间MATLAB引擎可用于执行调用时才会调用函数。
使用coder.extrinsic
构造
声明一个函数喷火
作为外在的,在你的MATLAB代码中包含这个语句。
coder.extrinsic (“foo”)
当将函数声明为代码生成的外部函数时,请遵循以下规则:
在调用该函数之前,将其声明为外部函数。
不要在条件语句中使用外部声明。
将外部函数的返回值赋给已知类型。看到使用mxArrays(MATLAB编码器).
有关更多信息和示例,请参见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);
在这个例子中,老鼠
而且最小值
每次在主函数中调用它们时,它们都被视为外部的喷火
.有两种方法可以缩小main函数内部外部声明的范围:
在局部函数中声明MATLAB函数为外部函数,如下例所示:
函数Y = foo% # codegencoder.extrinsic (“老鼠”);[N D] =鼠(pi);Y = 0;y = mymin(N, D);函数Y = mymin(a,b) code .extrinsic(“最小值”);Y = min(a,b);
这里是函数
老鼠
每次在主函数内部调用它都是外在的吗喷火
,但是函数最小值
只有在局部函数内部调用时才是外部的吗mymin
.而不是使用
coder.extrinsic
构造,调用MATLAB函数使用函数宏指令
.下一节将介绍这种方法。
非静态方法的外部声明
假设您定义了一个类myClass
它有一个非静态方法喷火
,然后创建实例obj
这一类的。如果你想声明这个方法obj.foo
在你的MATLAB代码中,你打算进行代码生成,遵循这些规则:
将调用写入
喷火
作为函数调用。不要使用点符号来编写调用。声明
喷火
通过使用语法成为外在的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编码器).
调用MATLAB函数的使用函数宏指令
要将外部声明的范围缩小到一个函数调用,请使用函数函数宏指令
.函数宏指令
在代码生成期间自动解释为外部函数。所以,你可以用函数宏指令
调用要在MATLAB环境中执行的函数,而不是编译生成的代码。
想想这个例子:
函数Y = foo code .extrinsic(“老鼠”);[N D] =鼠(pi);Y = 0;Y = feval(“最小值”、N、D);
因为函数宏指令
外在的,陈述函数宏指令(“分钟”,N, D)
由MATLAB计算,而不是编译,这与声明函数有相同的结果最小值
对于这一个调用来说是外部的。相比之下,函数老鼠
整个函数都是外在的吗喷火
.
的代码生成器不支持使用万博1manbetx函数宏指令
调用位于私有文件夹中的本地函数或函数。
使用mxArrays
外部函数的运行时输出是mxArray
,也称为MATLAB数组。唯一有效的操作mxArrays
是:
存储一个
mxArray
在变量中。传递一个
mxArray
到一个外部函数。返回一个
mxArray
从函数返回到MATLAB。转换一个
mxArray
到运行时的已知类型。分配mxArray
到一个类型已经由先前赋值定义的变量。示例如下。
使用mxArray
在其他操作中由外部函数返回(例如,从MATLAB函数block到Sim万博1manbetxulink执行),您必须首先将其转换为已知类型。
如果函数的输入参数为mxArrays
,代码生成器自动将该函数视为外部函数。
将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。
codegen喷火
代码生成成功。
但是如果你把喷火
在一个MATLAB函数block在Simul万博1manbetxink模型中,然后更新或运行模型,你会得到这个错误:
在这个上下文中,函数输出'y'不能是mxArray。考虑使用已知类型预初始化输出变量。
发生此错误是因为返回mxArray
不支持返回到Si万博1manbetxmulink。万博1manbetx要修复此问题,请定义y
为所期望的值的类型和大小最小值
在本例中,返回一个标量double:
函数Y = foo% # codegencoder.extrinsic (“老鼠”);[N D] =鼠(pi);Y = 0;将y定义为double类型的标量y = min(N,D);
在这个例子中,外部函数的输出最小值
影响输出y
入口点函数的喷火
为它生成代码。如果您试图为。生成独立代码(例如,静态库)喷火
,代码生成器无法忽略外部函数调用并产生代码生成错误。
codegen配置:自由喷火
???外部函数'min'不能用于独立的代码生成。为了生成独立代码,必须消除它。它不能被消除,因为它的输出似乎会影响调用函数。通过不使用'min'或确保其输出未使用来修复此错误。Error in ==> foo Line: 4 Column: 5 Code generation failed: View Error Report Error using codegen
使用外部函数的限制
在代码生成期间不支持完整的MATLAB运行时环境。万博1manbetx因此,在外部调用MATLAB函数时应用以下限制:
检查调用方或读取或写入调用方工作区的MATLAB函数在代码生成期间不起作用。这些职能包括:
如果你的外部函数在运行时执行这些操作,生成代码中的函数可能会产生不可预测的结果:
更改文件夹
更改MATLAB路径
删除或添加MATLAB文件
更改警告状态
更改MATLAB首选项
Simulink万博1manbetx参数更改
的代码生成器不支持使用万博1manbetx
coder.extrinsic
调用位于私有文件夹中的函数。的代码生成器不支持使用万博1manbetx
coder.extrinsic
调用局部函数。您可以调用具有最多64个输入和64个输出的外部函数。