主要内容

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

当处理调用一个函数喷火MATLAB中®代码,代码生成器的定义喷火为它的身体并生成代码。在某些情况下,您可能想要绕过代码生成,而是使用MATLAB引擎执行调用。使用coder.extrinsic (“foo”)宣布调用喷火不生成代码,而是使用MATLAB引擎执行。在这种背景下,喷火被称为一个外部函数。此功能只有当可用MATLAB引擎在执行期间是可用的。这种情况的例子包括墨西哥人的执行功能,仿真软件金宝app®模拟或函数调用的代码生成(也称为编译时)。

如果你为一个函数,调用生成独立的代码喷火,包括coder.extrinsic (“foo”)代码生成器,试图确定喷火影响输出。如果喷火不影响输出,与代码生成代码生成器收入,但不包括喷火从生成的代码。否则,代码生成器产生编译错误。

包括coder.extrinsic (“foo”)指令在某些声明所有调用MATLAB函数喷火在MATLAB函数作为外在。或者,您可能希望外在声明的范围缩小到一个调用喷火。看到使用函数宏指令调用MATLAB函数(MATLAB编码器)

当声明一个函数作为外在

这些都是一些常见的情况下,你可以考虑将MATLAB函数声明为外部:

  • 函数执行显示或记录的行为。这种功能主要是有用的在嵌入式系统仿真和不习惯。

  • 在墨西哥人执行或仿真软件模拟,您想要使用一个不支持金宝app的MATLAB函数代码生成。金宝app此工作流不适用于non-simulation目标。

  • 你指示代码生成器常数折叠函数调用使用coder.const。在这种情况下,函数被调用MATLAB引擎时只在代码生成可供执行的调用。

使用coder.extrinsic构造

声明一个函数喷火外在,这句话包含在您的MATLAB代码。

coder.extrinsic (“foo”)

当声明函数作为代码生成的外在,遵守这些规则:

  • 你叫它之前声明函数作为外在。

  • 不使用外在条件语句中声明。

  • 一个外部函数的返回值分配给一个已知类型。看到使用mxArrays(MATLAB编码器)

额外的信息和示例,请参阅coder.extrinsic

代码生成器自动治疗很多常见MATLAB可视化功能,如情节,disp,外在。你不需要显式地声明他们是通过使用外部函数coder.extrinsic。例如,您可能想要的电话情节在MATLAB环境中可视化结果。如果你生成一个墨西哥人从一个函数,函数调用情节,然后运行生成的墨西哥人功能,代码生成器将调用情节MATLAB引擎功能。如果您生成一个库或者可执行文件,生成的代码不包含调用情节函数。

如果您生成墨西哥人或独立使用C / c++代码MATLAB编码器™代码生成报告,强调从MATLAB代码调用外部函数。通过检查报告,您可以确定哪些功能只支持在MATLAB环境中。金宝app

非本征函数声明的范围

coder.extrinsic构造函数的范围。例如,考虑下面的代码:

函数y = foo% # codegencoder.extrinsic (“老鼠”,“最小值”);[N D] =鼠(π);y = 0;y = min (N、D);

在这个例子中,老鼠最小值外在一样对待每次他们被称为主要功能喷火。有两种方法可以缩小范围的外在声明内的主要功能:

  • 申报的MATLAB函数外在在当地的一个函数,在这个例子中:

    函数y = foo% # codegencoder.extrinsic (“老鼠”);[N D] =鼠(π);y = 0;y = mymin (N、D);函数y = mymin (a, b) coder.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。道具+ 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 coder.extrinsic (“老鼠”);[N D] =鼠(π);y = 0;y =函数宏指令(“最小值”、N、D);

因为函数宏指令是外在,声明函数宏指令(“分钟”,N, D)评估通过MATLAB -不是编译和声明的函数相同的结果吗最小值外在的这个电话。相比之下,函数老鼠是外在整个函数喷火

代码生成器不支持使用金宝app函数宏指令调用本地函数或函数位于私人文件夹。

使用mxArrays

一个外部函数的输出是一个mxArray,也被称为一个MATLAB数组。唯一有效的操作mxArrays是:

  • 存储一个mxArray在一个变量中。

  • 传递一个mxArray一个函数。

  • 返回一个mxArray从一个回MATLAB函数。

  • 转换一个mxArray到一个已知类型在运行时。执行此操作,分配mxArray一个变量,其类型已经由之前的任务。请参见下面的例子。

使用一个mxArray由一个外部函数返回在其他操作(例如,从一个回来MATLAB函数块模型执行),您必金宝app须首先将其转换为一个已知的类型。

如果一个函数的输入参数mxArrays,代码生成器自动将函数视为外在。

将mxArrays转换为已知的类型

将一个mxArray到一个已知类型、分配mxArray定义一个变量,其类型。在运行时,mxArray转化为变量的类型分配给。然而,如果数据mxArray不一致的变量的类型,你会获得一个运行时错误。

例如,考虑这样的代码:

函数y = foo% # codegencoder.extrinsic (“老鼠”);[N D] =鼠(π);y = min (N、D);

在这里,顶级的功能喷火调用外部MATLAB函数老鼠,返回两个mxArrays代表分子N和分母D的有理分式近似π。你可以通过这些mxArrays另一个MATLAB函数——在这种情况下,最小值。因为输入传递给最小值mxArrays,代码生成器自动处理最小值作为一个非本征函数。作为一个结果,最小值返回一个mxArray

同时生成一个墨西哥人通过使用函数MATLAB编码器,您可以直接分配mxArray返回的最小值到输出y因为墨西哥人MATLAB函数返回它的输出。

但如果你把喷火在一个MATLAB函数块在仿真软件模型,然后金宝app更新或运行模型,得到这个错误:

函数输出y不能一个mxArray在这个上下文。考虑preinitializing输出变量与一个已知的类型。

这是因为返回一个错误mxArray不支持动态仿真模金宝app块。金宝app为了解决这个问题,定义y的类型和尺寸您期望的价值最小值返回——在这种情况下,一个标量双,如下:

函数y = foo% # codegencoder.extrinsic (“老鼠”);[N D] =鼠(π);y = 0;% y定义为一个标量类型的翻倍y = min (N、D);

使用非本征函数的限制

完整的MATLAB运行时环境不支持在代码生成。金宝app因此,调用MATLAB函数外在时以下限制:

  • MATLAB函数检查调用者,或读或写在代码生成调用者工作区不工作。这些功能包括:

  • 函数生成的代码会产生不可预测的结果如果你非本征函数在运行时执行以下操作:

    • 改变文件夹

    • 改变MATLAB路径

    • 删除或添加MATLAB文件

    • 变化预警状态

    • 改变MATLAB偏好

    • 改变模型参数金宝app

  • 代码生成器不支持使用金宝appcoder.extrinsic调用的函数都位于一个私人文件夹。

  • 代码生成器不支持使用金宝appcoder.extrinsic调用本地函数。

  • 你可以叫外在64 64输入和输出功能。

另请参阅

|