主要内容

使用MATLAB引擎在生成的代码中执行函数调用

处理对函数的调用时喷火在MATLAB中®代码,代码生成器找到的定义喷火并为它的身体生成代码。在某些情况下,您可能希望绕过代码生成,而是使用MATLAB引擎来执行调用。使用coder.extrinsic(“foo”)声明调用喷火不生成代码,而是使用MATLAB引擎执行。在这种情况下,喷火被称为外部函数。只有在执行期间MATLAB引擎可用时,此功能才可用。这种情况的例子包括执行MEX函数、Simulink万博1manbetx®模拟,或代码生成时的函数调用(也称为编译时).

如果为调用的函数生成独立代码喷火,包括coder.extrinsic(“foo”)时,代码生成器尝试确定是否喷火影响输出。如果喷火不影响输出,代码生成器进行代码生成,但排除喷火从生成的代码。否则,代码生成器将产生编译错误。

包括coder.extrinsic(“foo”)指令内的某个MATLAB函数声明所有调用喷火在MATLAB函数内部作为外部变量。或者,您可能希望将外部声明的范围缩小到只有一个调用喷火.看到使用feval调用MATLAB函数(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

此图像显示了函数mystats的报告。光标指向外部函数,绘图,报告显示函数属性。外部函数是紫色的。

外部函数声明的范围

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参数更改

  • 的代码生成器不支持使用万博1manbetxcoder.extrinsic调用位于私有文件夹中的函数。

  • 的代码生成器不支持使用万博1manbetxcoder.extrinsic调用局部函数。

  • 您可以调用具有最多64个输入和64个输出的外部函数。

另请参阅

|