主要内容

如何MATLAB编码器分区生成的代码

分区生成的文件

默认情况下,在代码生成期间,MATLAB®编码器™对代码进行分区以匹配MATLAB文件结构。这种一对一的映射使您可以轻松地将在C/ c++中生成的文件与编译后的MATLAB代码关联起来。MATLAB编码器不能为生成的代码中内联的MATLAB函数产生相同的一对一对应(参见文件分区和内联).

或者,您可以选择将所有C/ c++函数生成到单个文件中。有关更多信息,请参见如何选择文件分区方式.此选项有助于将代码与现有嵌入式软件集成。

如何选择文件分区方式

使用MATLAB编码器应用程序

  1. 打开生成对话框中的生成代码页,单击生成箭头

  2. 点击更多的设置

  3. 代码的外观选项卡,设置生成文件分区方法为每个MATLAB文件生成一个文件将所有函数生成到一个文件中

在命令行

使用codegen配置对象FilePartitionMethod选择。例如,编译函数喷火没有输入,并为每个MATLAB函数生成一个C/ c++文件:

  1. 创建一个MEX配置对象并设置FilePartitionMethod选择:

    Mexcfg = code .config('mex');mexcfg。文件PartitionMethod = 'MapMFileToCFile';

  2. 使用配置选项,将配置对象传递给codegen

    codegen -config mexfg -O disable:inline foo %禁用内联,为每个MATLAB函数生成一个C/ c++文件

用一个C/ c++文件划分生成的文件MATLAB文件

默认情况下,对于没有内联的MATLAB函数,MATLAB编码器为每个MATLAB文件生成一个C/ c++文件。在这种情况下,MATLAB编码器分区生成的C/ c++代码,使其对应于您的MATLAB文件。

如何MATLAB编码器分区入口点MATLAB功能

对于每个入口点(顶层)MATLAB函数,MATLAB编码器生成一个与MATLAB文件同名的C/ c++源文件、头文件和目标文件。

例如,假设定义了一个简单的函数喷火调用函数身份.源文件foo.m包含以下代码:

函数Y = foo(u,v)% # codegenS =单(u);D = double(v);Y = double(单位(s)) +单位(d);

这是代码identity.m

函数Y =恒等式(u)% # codegenY = u;

MATLAB编码器生成一个C静态库foo.m

  1. 定义输入uv.有关更多信息,请参见使用App指定入口点函数输入的属性

  2. 打开生成对话框中的生成代码页,单击生成箭头

  3. 设置构建类型静态库

  4. 点击更多的设置

  5. 所有设置选项卡,在内联函数,设置内联阈值参数0

  6. 点击关闭

  7. 要生成库,单击生成

生成一个C静态库foo.m,在命令行输入:

codegen -config:lib -O disable:inline foo -args{0,0} %使用-args选项指定u和v都是% real,标量双精度

MATLAB编码器生成源文件、头文件和目标文件喷火身份在输出文件夹中。

如何MATLAB编码器分区本地功能

对于每个局部函数,MATLAB编码器在与调用函数相同的C/ c++文件中生成代码。例如,假设您定义了一个函数喷火调用一个局部函数身份

函数Y = foo(u,v)% # codegenS =单(u);D = double(v);Y = double(单位(s)) +单位(d);函数Y =恒等式(u) Y = u;

要生成c++库,在生成代码之前,选择c++编译器并将c++设置为目标语言。例如,在命令行中:

  1. 选择c++作为目标语言:

    CFG = code .config('lib') CFG . CFG。TargetLang =“c++”

  2. 生成c++库:

    codegen -config cfg foo -args{0,0} %使用-args选项指定u和v都是% real,标量双精度

    在主要函数中喷火MATLAB编码器控件的内联代码身份本地函数。

    请注意

    如果你指定c++MATLAB编码器包装了C代码. cpp文件,这样您就可以使用c++编译器和接口与外部c++应用程序。

    下面是生成的代码的摘录foo.cpp

    .../*函数定义*/ double foo(double u, double v){返回(double)(float)u + v;}……

如何MATLAB编码器分区重载函数

重载函数是具有多个实现以容纳不同输入类的函数。对于每个实现(非内联的),MATLAB编码器生成一个单独的C/ c++文件,具有唯一的数字后缀。

例如,假设定义了一个简单的函数multiply_defined

%#代码原函数y = multiply_defined(u) y = u+1;

的两个实现multiply_defined,一个用于处理类型的输入(在一个@single子文件夹)和另一个类型的输入(在一个@double子文件夹)。

要调用每个实现,请定义函数call_multiply_defined

%#代码原函数[y1,y2,y3] = call_multiply_defined y1 = multiply_defined(int32(2));Y2 = multiply_defined(2);Y3 = multiply_defined(single(2));

接下来,为重载函数生成C代码multiply_defined.例如,在MATLAB命令行中输入:

codegen -O disable:inline -config:lib call_multiply_defined

MATLAB编码器的每个实现生成C源文件、头文件和目标文件multiply_defined,如图所示。使用数字后缀创建唯一的文件名。

生成的文件和位置

生成的文件的类型和位置取决于您指定的目标。对于所有目标,如果在构建过程中出现错误或警告,或者如果您明确要求报告,MATLAB编码器生成报告。

每一次MATLAB编码器为相同的代码或项目生成相同类型的输出,它将从以前的构建中删除文件。如果要保存生成版本中的文件,请在开始另一个生成版本之前将它们复制到其他位置。

为MEX目标生成文件

默认情况下,MATLAB编码器为MEX功能生成以下文件(墨西哥人)目标。

文件类型 位置
平台特定的MEX文件 当前文件夹

MEX、C/ c++源文件、头文件和目标文件

codegen /墨西哥人/function_name

HTML报告

codegen /墨西哥人/function_name/ html

为C/ c++静态库目标生成文件

默认情况下,MATLAB编码器为C/ c++静态库目标生成以下文件。

文件类型 位置

C/ c++源文件、库文件、头文件和目标文件

codegen / lib /function_name

HTML报告

codegen / lib /function_name/ html

C/ c++动态库目标的生成文件

默认情况下,MATLAB编码器为C/ c++动态库目标生成以下文件。

文件类型 位置

C/ c++源文件、库文件、头文件和目标文件

codegen / dll /function_name

HTML报告

codegen / dll /function_name/ html

为C/ c++可执行目标生成文件

默认情况下,MATLAB编码器为C/ c++可执行目标生成以下文件。

文件类型 位置

C/ c++源文件、头文件和目标文件

codegen exe /function_name

HTML报告

codegen exe /function_name/ html

更改生成文件的名称和位置

使用MATLAB编码器应用程序

改变 行动
输出文件名
  1. 打开生成对话框中的生成代码页,单击生成箭头

  2. 输出文件名字段,输入文件名。

输出文件位置
  1. 打开生成对话框中的生成代码页,单击生成箭头

  2. 点击更多的设置

  3. 路径选项卡,设置建立文件夹指定的文件夹

  4. 构建文件夹名称字段,要么浏览到输出文件位置,要么输入完整路径。输出文件位置不能包含:

    • 空格(在某些操作系统配置中,空格可能导致代码生成失败)。

    • 选项卡

    • ?

    • 非7位ASCII字符,如日文字符。

在命令行。方法更改生成文件的名称和位置codegen选项- o- d

文件分区和内联

如何MATLAB编码器分区生成的C/ c++代码取决于您是否选择为每个MATLAB文件生成一个C/ c++文件,以及您是否内联MATLAB函数。

如果你 MATLAB编码器
将所有C/ c++函数生成到一个文件中,并禁用内联 生成一个没有内联函数的C/ c++文件。
将所有C/ c++函数生成到一个文件中并启用内联 生成一个C/ c++文件。大小在内联阈值范围内的内联函数。
为每个MATLAB文件生成一个C/ c++文件,并禁用内联 分区生成C/ c++代码,以匹配MATLAB文件结构。看到用一个C/ c++文件划分生成的文件,每个MATLAB文件
为每个MATLAB文件生成一个C/ c++文件,并启用内联

将内联函数放在与它们内联到的函数相同的C/ c++文件中。

即使你启用了内联,MATLAB编码器只内联那些大小在内联阈值之内的函数。对于非内联的MATLAB函数,MATLAB编码器分区生成的C/ c++代码,如前所述。

文件分区和内联之间的权衡

权衡文件分区与内联,代表了在可读性、效率和易于将MATLAB代码与现有嵌入式软件集成之间的权衡。

如果你生成 生成C/ c++代码 优势 缺点
所有C/ c++函数都放在一个文件中 不匹配MATLAB文件结构 更容易与现有的嵌入式软件集成 难以将C/ c++代码映射到原始MATLAB文件
每个MATLAB文件一个C/ c++文件,并启用内联 不完全匹配MATLAB文件结构 程序执行更快 难以将C/ c++代码映射到原始MATLAB文件
一个C/ c++文件为每个MATLAB文件和禁用内联 匹配MATLAB文件结构 易于映射C/ c++代码到原始MATLAB文件 程序运行效率降低

如何禁用内联影响文件分区

内联在默认情况下是启用的。因此,要为每个顶级MATLAB函数生成一个C/ c++文件,必须:

  • 选择为每个顶级MATLAB函数生成一个C/ c++文件。有关更多信息,请参见如何选择文件分区方式

  • 显式禁用内联,无论是全局或个别MATLAB函数。

如何禁用内联全局使用MATLAB编码器应用程序

  1. 打开生成对话框中的生成代码页,单击生成箭头

  2. 点击更多的设置

  3. 所有设置选项卡,在内联函数设置内联阈值0

如何在命令行禁用全局内联。若要禁用函数的内联,请使用- o禁用:内联选项codegen.例如,禁用内联并为函数生成MEX函数喷火没有输入:

codegen -O disable:inline foo

有关详细信息,请参见codegen

如何禁用内联个别函数。若要禁用单个MATLAB函数的内联,请添加该指令coder.inline('永远');在源MATLAB文件中单独的一行,在函数签名之后。

函数Y = foo(u,v)% # codegencoder.inline (“永远”);S =单(u);D = double(v);Y = double(单位(s)) +单位(d);

codegen不是内联入口点函数。

coder.inline指令只应用于它出现的函数。在本例中,函数禁用了内联喷火,但不是为了身份,在单独的MATLAB文件中定义的顶级函数,由喷火.禁用内联身份,将此指令添加到源文件的函数签名之后identity.m.有关更多信息,请参见coder.inline

有关禁用两个函数的内联的更有效方法,请参见如何在命令行全局禁用内联

将C/ c++代码与内联函数相关联

要将生成的C/ c++代码与原始内联函数关联起来,请在MATLAB代码中添加注释以标识函数。这些注释将出现在C/ c++代码中,并帮助您将生成的代码映射回原始的MATLAB函数。

修改内联阈值

若要更改内联行为,请调整内联阈值参数。

命令修改内联阈值MATLAB编码器应用程序

  1. 打开生成对话框中的生成代码页,单击生成箭头

  2. 点击更多的设置

  3. 所有设置选项卡,在内联函数的值内联阈值参数。

修改命令行内联阈值。的值InlineThreshold配置对象的参数。看到编码器。MexCodeConfig编码器。CodeConfig编码器。EmbeddedCodeConfig