非本征函数
代码生成器尝试为函数生成代码,即使它们不支持C代码生成。万博1manbetx该软件检测对许多常见可视化函数的调用,例如情节
,disp
,数字
.软件将这些函数视为外部函数,但您不必将它们声明为外部使用coder.extrinsic
.在模拟过程中,代码生成器为这些函数生成代码,但不生成它们的内部代码。在独立代码生成期间,代码生成器尝试确定可视化函数是否影响调用它的函数的输出。如果输出没有改变,代码生成器将继续进行代码生成,但将可视化函数从生成的代码中排除。否则,就会发生编译错误。
例如,您可能想要调用情节
在MATLAB中可视化你的结果®环境。如果从调用的函数生成MEX函数情节
然后运行生成的MEX函数,代码生成器将调用分派到情节
函数到MATLAB。类的调用,则生成的代码不包含对库或可执行文件的调用情节
函数。代码生成报告强调了从MATLAB代码到外部函数的调用,因此很容易确定哪些函数仅在MATLAB环境中受支持。万博1manbetx
对于普通可视万博1manbetx化函数以外的不受支持的函数,必须将这些函数声明为外部函数(参见代码生成中函数调用的解析).外部函数不编译,而是在仿真期间在MATLAB中执行(参见模拟过程中外部函数的解析).
有两种方法将函数声明为外部函数:
使用
coder.extrinsic
构造主函数或局部函数(参见将MATLAB函数声明为外部函数).使用间接调用该函数
函数宏指令
(见使用feval调用MATLAB函数).
声明MATLAB函数作为外在函数
要将MATLAB函数声明为外部函数,请添加coder.extrinsic
在主函数或局部函数的顶部构造:
coder.extrinsic ('function_name_1”,……, 'function_name_n”);
声明外部函数
下面的代码声明MATLAB补丁
局部函数中的外部函数create_plot
.你不必申报轴
作为外在的原因轴
是一种常见的可视化函数,代码生成器自动将其视为外部函数。
function c = pythagoras(a,b,color) %#codegen %计算直角三角形的斜边%并显示该三角形。C =√(a^2 + b^2);Create_plot (a, b, color);将补丁声明为外部补丁coder.extrinsic(“补丁”);X = [0;a;a];Y = [0;0;b];Patch (x, y, color);轴(“平等”);
代码生成器不会生成用于的代码补丁
而且轴
,而是将它们分派到MATLAB中执行。
要测试该函数,请执行以下步骤:
转换
毕达哥拉斯
通过在MATLAB提示符下执行此命令,将其转换为MEX函数:Codegen -report Pythagoras -args{1,1,[。3 .3 .3]}
单击代码生成报告的链接,然后在报告中查看的MATLAB代码
create_plot
.该报告强调
补丁
而且轴
函数,以表明它们仅在MATLAB环境中受支持。万博1manbetx执行该命令运行MEX功能:
Pythagoras_mex (3,4, [1.0 0.0 0.0]);
MATLAB将直角三角形的图形显示为红色补丁对象:
何时使用编码器。外在构造
使用coder.extrinsic
构造:
调用仿真过程中不产生输出的MATLAB函数,而不会生成不必要的代码(参见模拟过程中外部函数的解析).
使您的代码自文档化,更容易调试。您可以扫描源代码
coder.extrinsic
语句来隔离对MATLAB函数的调用,这些函数可能会创建和传播mxArrays
(见使用mxArrays).节省打字。与一个
coder.extrinsic
语句,只要调用和语句在相同的作用域中(参见外部函数声明的范围).在整个调用函数范围内声明MATLAB函数为外部函数(参见外部函数声明的范围).为了缩小范围,使用
函数宏指令
(见使用feval调用MATLAB函数).
外部函数声明规则
在代码生成中声明外部函数时,请遵守以下规则:
在调用函数之前,将其声明为外部函数。
不要在条件语句中使用外部声明。
外部函数声明的范围
的coder.extrinsic
构造具有函数作用域。例如,考虑以下代码:
函数y = foo %#codegen code .extrinsic('rat','min');[N D] =鼠(pi);Y = 0;y = min(N, D);
在这个例子中,老鼠
而且最小值
每次在主函数中调用它们时,它们都被视为外部的喷火
.有两种方法可以缩小main函数内部外部声明的范围:
在局部函数中声明MATLAB函数为外部函数,如下例所示:
函数y = foo %#codegen code .extrinsic('rat');[N D] =鼠(pi);Y = 0;y = mymin(N, D);函数y = mymin(a,b) code .extrinsic('min');Y = min(a,b);
这里是函数
老鼠
每次在主函数内部调用它都是外在的吗喷火
,但是函数最小值
只有在局部函数内部调用时才是外部的吗mymin
.调用MATLAB函数使用
函数宏指令
,详见使用feval调用MATLAB函数.
调用MATLAB使用feval函数
这个函数函数宏指令
在代码生成期间自动解释为外部函数。因此,您可以使用函数宏指令
方便地调用要在MATLAB环境中执行的函数,而不是编译为生成的代码。
考虑下面的例子:
函数y = foo code .extrinsic('rat');[N D] =鼠(pi);Y = 0;y = feval('min', N, D);
因为函数宏指令
外在的,陈述feval('min', N, D)
由MATLAB计算-不是编译-与声明函数有相同的结果最小值
对于这一个调用来说是外部的。相比之下,函数老鼠
整个函数都是外在的吗喷火
.
模拟过程中外部函数的解析
代码生成器解析对外部函数的调用——不支持代码生成的函数——如下所示:万博1manbetx
在模拟过程中,代码生成器为外部函数的调用生成代码,但不为函数生成内部代码。因此,只能在安装MATLAB软件的平台上运行仿真。
在代码生成期间,代码生成器尝试确定外部函数是否影响调用它的函数的输出——例如返回mxArrays
到输出变量(参见使用mxArrays).如果输出没有改变,代码生成将继续进行,但外部函数将从生成的代码中排除。否则,代码生成器将发出编译器错误。
使用mxArrays
一个外部函数的输出是mxArray
——也叫MATLAB数组。唯一有效的操作mxArrays
是:
存储
mxArrays
在变量通过
mxArrays
并从函数中返回它们转换
mxArrays
到运行时的已知类型
使用mxArrays
由其他操作中的外部函数返回,必须首先将它们转换为已知类型,如中所述将mxArrays转换为已知类型.
将mxArrays转换为已知类型
转换mxArray
赋值给已知类型mxArray
到已定义类型的变量。在运行时,mxArray
转换为赋值给它的变量的类型。但是,如果数据在mxArray
与变量的类型不一致,则会得到一个运行时错误。
例如,考虑以下代码:
函数y = foo %#codegen code .extrinsic('rat');[N D] =鼠(pi);y = min(N, D);
这里是顶层函数喷火
调用外部MATLAB函数老鼠
,返回2mxArrays
表示分子N
和分母D
的有理分式近似π
.虽然你可以通过这些mxArrays
到另一个MATLAB函数-在这种情况下,最小值
属性不能赋值mxArray
返回的最小值
到输出y
.
如果你运行这个函数喷火
Simulink中的函数块万博1manbetx®模型,代码在模拟过程中产生如下错误:
函数输出'y'不能是MATLAB类型。
要解决这个问题,请定义y
为所期望的值的类型和大小最小值
在本例中,返回一个标量double,如下所示:
函数y = foo %#codegen code .extrinsic('rat');[N D] =鼠(pi);Y = 0;定义y为类型为double的标量y = min(N,D);
代码生成外部函数的限制
在代码生成期间不支持完整的MATLAB运行时环境。万博1manbetx因此,在外部调用MATLAB函数时应用以下限制:
函数实参限制
您最多可以调用64个输入和64个输出的函数。