Main Content

配置运行时环境选项

当您使用 Simulink® 软件创建和执行模型并使用代码生成器生成 C 或 C++ 代码时,请针对最多三种运行时环境考虑您的配置:

  • 在应用程序开发期间运行 MathWorks® 软件的 MATLAB® 开发计算机运行时环境。

  • 生产硬件运行时环境,在该环境中部署用于生产的应用程序。

  • 测试硬件运行时环境,在该环境中,您在部署之前测试正在开发的应用程序。

一个运行时环境可以提供多种功能,但各运行时环境在概念上仍然不同。通常,MATLAB 开发计算机是测试硬件。通常情况下,生产硬件与 MATLAB 开发或测试硬件不同,在功能上也不如后者强大。许多类型的生产硬件只能运行下载的可执行文件。

在下列情况下,会提供有关生产硬件板和配套使用的编译器的信息:

  • 使用 Simulink 软件来仿真稍后要生成代码的模型

  • 使用代码生成器生成用于在生产硬件上部署的代码

该软件使用硬件板和编译器信息来获得在仿真中和为生产硬件生成的代码中执行的整数和定点运算结果的位真一致性。代码生成器使用这些信息来创建以最高效率执行的代码。

生成用于在测试硬件上进行测试的代码时,请提供有关您使用的测试硬件板和编译器的信息。代码生成器使用此信息来创建代码,以提供以下结果之间的位真一致性:

  • 在仿真中执行的整数和定点运算

  • 在生产硬件上运行的生成代码

  • 在测试硬件上运行的生成代码

即使生产硬件和测试硬件不同,您也可以获得结果的位真一致性。在 C 标准没有完全定义行为的情况下,这两种硬件的编译器可以使用不同的默认值。

配置生产和测试硬件

您可以为特定硬件板及其设备类型指定模型仿真或代码生成。例如,您可以设置数据大小、字节顺序和编译器行为,如整数舍入。您可以配置:

通过选择配置参数 > 硬件实现来配置生产硬件。默认情况下,“硬件实现”窗格仅列出硬件板设备供应商设备类型参数字段。除非您已安装硬件支持包,否则硬件板会列出值由代码生成系统目标文件确定获取硬件支持包。安装硬件支持包后,该列表还包含对应的硬件板名称。如果您选择一个硬件板名称,则显示该硬件板的参数。要设置设备详细信息(如数据大小和字节顺序),请点击设备详细信息

配置参数 > 硬件实现 > 高级参数窗格中配置测试硬件。要启用配置测试硬件详细信息的参数,请禁用配置参数 > 硬件实现 > 高级参数 > 测试硬件与生产硬件相同参数。为测试硬件生成的代码在由测试硬件参数指定的环境中执行。代码的行为就好像它在为生产硬件指定的环境中执行一样。有关详细信息,请参阅测试硬件注意事项

在以下情况下,默认值和属性在硬件实现窗格中显示为初始值:

  • 您在代码生成窗格中指定系统目标文件

  • 系统目标文件指定默认微处理器及其硬件属性。

您不能更改只有一个可能值的参数。具有多个可能值的参数会提供有效值的列表。如果您在硬件实现窗格中手动指定硬件属性,请确认这些值与系统目标文件一致。否则,生成的代码可能无法编译或执行,或者可能会执行但产生不正确的结果。

硬件实现参数向 MATLAB 软件描述硬件和编译器属性。代码生成器使用这些信息为运行时环境生成尽可能高效运行的代码。生成的代码为仿真、生产代码和测试代码中的整数和定点运算的结果提供位真一致性。

有关特定参数的详细信息,请参阅“硬件实现”窗格。要查看硬件实现窗格功能的示例,请打开 TargetSettings 示例模型。

openExample("TargetSettings");

有关配置硬件实现的详细信息,请参阅:

指定硬件板

指定运行从您的模型生成的代码的硬件板。为配置参数 > 硬件实现 > 硬件板选择值。

“硬件实现”窗格标识在配置参数 > 代码生成上选择的系统目标文件。

要配置测试硬件,请使用配置参数 > 硬件实现 > 高级参数窗格。

要启用配置测试硬件详细信息的参数,请将 ProdEqTarget 设置为 off

如何指定硬件板

如果选择

菜单包含您要使用的硬件板的名称。

该硬件板的名称。

如果您选择一个硬件板名称,则显示该硬件板的参数。

菜单不包含要使用的硬件板的名称。

获取硬件支持包

该值将打开支持包安装程序。安装所需的支持包。安装支持包后,菜单包括相关硬件板的名称。

模型配置使用系统目标文件 ert.tlcrealtime.tlcautosar.tlc

没有为硬件实现指定硬件板。

模型配置不使用系统目标文件 ert.tlcrealtime.tlcautosar.tlc

由代码生成系统目标文件确定

代码生成器使用指定的系统目标文件来确定硬件实现。

指定设备供应商

要指定硬件设备的微处理器供应商,请使用设备供应商参数。您的选择将决定设备类型菜单中的可用微处理器。如果没有显示供应商名称,请选择自定义处理器。然后,使用设备类型参数指定微处理器。

指定设备类型

要从设备供应商选项中列出的受支持设备中指定微处理器名称,请使用设备类型参数。如果微处理器未出现在菜单中,请将设备供应商更改为自定义处理器。然后,为您的自定义设备指定设备详细信息。

如果您选择系统目标文件为其指定默认硬件属性的设备类型,则属性将显示为初始值。您不能更改只具有一个可能选项的参数的值。具有多个可能值的参数会提供一个菜单。为您的硬件选择值。

设置设备数据类型的位长度

位数参数描述微处理器的原生字长以及 charshortintlong 数据的位长度。要使代码生成成功,需要满足以下条件:

  • 位长度必须是:char <= short <= int <= long

  • 位长度必须是 8 的倍数,最大为 32。

  • long 数据的位长度不能小于 32。

rtwtypes.h 文件定义整数类型名称。您提供的值必须与在编译器 limits.h 头文件中定义的字长一致。代码生成器将其整数类型名称映射到对应的 Simulink 整数类型名称。

如果没有具有匹配字长的 ANSI® C 类型,但有更大的 ANSI C 类型,则代码生成器对 int8_Tuint8_Tint16_Tuint16_Tint32_Tuint32_T 使用更大的类型。当代码生成器使用更大的类型时,得到的记录值(例如 MAT 文件记录)可能具有与仿真的记录值不同的数据类型。

应用程序可以使用长度为从 1(无符号)或 2(有符号)位到 32 位的整数数据。如果整数长度与可用类型的长度匹配,则代码生成器将使用该类型。如果匹配类型不可用,则代码生成器使用可容纳数据的最小可用类型,从而生成不使用不必要的高阶位的代码。例如,在支持 8 位、16 位和 32 位整数的硬件上,对于指定为 24 位的信号,代码生成器将数据实现为 int32_Tuint32_T

使用模拟整数数据的代码的执行效率并非最高。在应用程序开发过程中,以下代码可用于模拟仅在生产硬件上可用的整数长度。模拟不影响执行结果。

在代码生成过程中,软件会检查模型数据类型与您为生产硬件指定的数据类型的兼容性。

  • 如果您为生产硬件整数指定的长度都不是 32 位,则软件会生成错误。

  • 如果模型使用的数据类型的长度小于可用的生产硬件整数长度,则软件会生成警告。

从代码生成器到 Simulink 的整数类型映射

代码生成器整数类型Simulink 整数类型
boolean_Tboolean
int8_Tint8
uint8_Tuint8
int16_Tint16
uint16_Tuint16
int32_Tint32
uint32_Tuint32

设置设备的字节顺序

字节顺序参数指定硬件是使用 Big Endian(最高有效位字节优先)还是 Little Endian(最低有效位字节优先)字节顺序。如果保留为未指定,则代码生成器会生成确定硬件端序的代码。此设置的效率最低。

设置有符号整数除法的商舍入行为

ANSI C 并不详尽定义当有符号整数除以另一个有符号整数时编译器使用的商舍入方法。因此,舍入行为依赖于实现。如果两个整数都是正数或都是负数,则商必须向下舍入。如果其中一个整数是正数而另一个是负数,则商既可以向上舍入也可以向下舍入。

有符号整数除法舍入方式参数向代码生成器告知编译器如何舍入有符号整数除法的结果。提供这些信息不会更改编译器的操作。它仅向代码生成器描述该行为,该代码生成器使用这些信息来优化为有符号整数除法生成的代码。参数值包括:

  • - 如果商介于两个整数之间,编译器将选择更接近零的整数作为结果。

  • 向下 - 如果商介于两个整数之间,编译器将选择更接近负无穷的整数作为结果。

  • 未定义 - 如果向下不能描述编译器行为或者该行为是未知的,请选择此值。

应避免选择未定义。当代码生成器不知道编译器的有符号整数除法舍入行为时,模型编译会生成额外的代码。

编译器商舍入行为根据这些值而变化。

您可以从编译器文档获得有符号整数除法舍入的编译器实现。如果文档不可用,您可以通过试验确定此行为。

“零”、“向下”和“未定义”的商舍入示例

ND理想 N/D向下未定义

33

4

8.25

8

8

8

-33

4

-8.25

-8

-9

-8-9

33

-4

-8.25

-8

-9

-8-9

-33

-4

8.25

8

8

89

设置有符号整数的算术右移行为

ANSI C 没有为编译器定义对负整数的右移行为。因此,舍入行为依赖于实现。采用算术移位方式右移有符号整数选项向代码生成器告知编译器如何对负整数实现右移。提供这些信息不会更改编译器的操作。它仅向代码生成器描述该行为,该代码生成器使用这些信息优化为算术右移生成的代码。

如果 C 编译器通过算数右移实现符号整数右移,请选择此选项。否则,请清除该选项。算术右移用最高有效位的值填充右移空出的位,最高有效位表示 2 的补码记数法中数字的符号。该选项默认为选中状态。如果您的编译器将右移作为算术移位处理,则此设置为首选。

  • 当您选择该选项时,无论 Simulink 模型何时对有符号整数执行算术移位,代码生成器都会生成高效代码。

  • 当您清除该选项时,代码生成器会生成完全可移植但效率较低的代码来实现向右算术移位。

您可以从编译器文档中获得用于算术右移的编译器实现。如果文档不可用,您可以通过试验确定此行为。

更新版本 14 的硬件配置

如果您的模型是在版本 14 之前创建的,并且您尚未更新模型,则配置当前执行硬件设备参数 (TargetUnknown) 的值默认为 'on'

要更新模型,请清除配置参数 > 硬件实现 > 高级参数 > 测试硬件 > 配置测试硬件复选框。或者在命令行窗口中键入:

cs = getActiveConfigSet('your_model_name');
set_param(cs,'TargetUnknown','off');

对模型的这一更新将:

  • 启用测试硬件与生产硬件相同 参数 (ProdEqTarget),将该参数设置为 'on'

  • 生产设备供应商和类型参数 (ProdHWDeviceType) 的值复制到测试设备供应商和类型参数 (TargetHWDeviceType)。

要完成更新,请执行下列操作:

  1. 清除配置参数 > 硬件实现 > 高级参数 > 测试硬件 > 测试硬件与生产硬件相同复选框。仅在您的生产硬件和测试硬件不同时才应用此步骤。

  2. 配置参数 > 硬件实现 > 高级参数中设置参数,以匹配您的生产和测试系统。

  3. 保存模型。

生产硬件注意事项

在配置生产硬件时,请考虑以下几点:

  • 生产硬件可以具有不同于 MATLAB 开发计算机的字长和其他硬件特性。您可以在不同于生产硬件或 MATLAB 开发计算机的硬件上对代码进行原型构建。在生成代码时,代码生成器会解决这些差异。

  • Simulink 产品会使用生产硬件配置中的一些信息。使用这些信息,无需生成代码即可执行仿真,从而得到与执行生成的代码相同的结果。例如,通过这些结果可以检测生产硬件上出现的错误情况,例如硬件溢出。

  • 代码生成器生成的代码提供与整数和定点运算的 Simulink 结果的位真一致性。模拟不可用数据长度的生成代码的运行效率低于非模拟情况。对于整数和定点结果,模拟不影响与 Simulink 的位真一致性。

  • 如果在应用程序开发期间更改运行时环境,则在生成或重新生成代码之前,请重新配置新运行时环境的硬件实现参数。如果执行代码所在的硬件并非生成该代码的硬件,则对于仿真、生产代码和测试代码中的整数和定点运算的结果,并不能始终实现位真一致性。

  • 要编译从模型生成的代码,请使用模型模块上的整数舍入模式参数来仿真您要使用的 C 编译器的舍入行为。此设置显示在可对有符号整数执行算术运算的模块(如 Product, Matrix Multiplyn-D Lookup Table 模块)的参数对话框中的信号属性窗格上。

  • 对于大多数模块来说,整数舍入模式的值完全定义舍入行为。对于支持定点数据和最简单舍入模式的模块,有符号整数除法舍入方式的值也会影响舍入。有关详细信息,请参阅精度 (Fixed-Point Designer)

  • 当模型包含 Model 模块时,请将它们引用的模型配置为使用相同的硬件设置。

测试硬件注意事项

默认情况下,测试硬件配置与生产硬件的配置相同。您可以使用生成的代码在与生产环境相同的环境中进行测试。

如果测试环境和生产环境不同,您可以通过以下设置,使生成的代码在测试硬件上运行时就像在生产硬件上运行一样:

  1. 要启用测试硬件参数,请清除配置参数 > 硬件实现 > 高级参数 > 测试硬件 > 测试硬件与生产硬件相同复选框。或者,在命令行窗口中键入:

    cs = getActiveConfigSet('your_model_name');
    set_param(cs,'ProdEqTarget','off');
  2. 通过测试硬件 (Target*) 参数指定设备类型的详细信息。

如果选择指定默认微处理器及其硬件属性的系统目标文件,则这些默认值和属性将显示为初始值。

只有一个可能值的参数不能更改。如果修改硬件属性,请检查其值是否与系统目标文件一致。否则,生成的代码可能无法编译或执行,或者可能会执行但产生不正确的结果。

影响普通模式仿真的生产硬件设置示例

更改某些生产硬件设置(例如 ProdLongLongModeProdIntDivRoundTo)会影响普通模式的仿真结果。以下示例仿真具有四个输入的加法器。在第一次仿真中,ProdLongLongMode 处于禁用状态。在第二次仿真中,ProdLongLongMode 处于启用状态。在仿真输出图中,您会发现时间步范围 125-175 之间的输出值之间存在一些小的差异。

  1. 创建加法器模型。

    model = 'hwSettingEffect';
    new_system(model) 
    open_system(model)
    
    pos = [140   140   200   340];
    add_block('simulink/Math Operations/Add', ...
              [model '/sum_int32'], ...
              'Inputs','++++', ...
              'SaturateOnIntegerOverflow', ...
              'on', ...
              'Position', ...
              pos)
    
    pos = [75   155   105   175];
    add_block('built-in/Inport',[model '/In1'],'Position',pos)
    set_param([model '/In1'], 'OutDataTypeStr', ...
              'int32','PortDimensions','1','SampleTime','1');
    add_line(model, 'In1/1','sum_int32/1')
    
    pos = [75   205   105   225];
    add_block('built-in/Inport',[model '/In2'],'Position',pos)
    set_param([model '/In2'], 'OutDataTypeStr', ...
               'int32','PortDimensions','1','SampleTime','1');
    add_line(model, 'In2/1','sum_int32/2')
    
    pos = [75   255   105   275];
    add_block('built-in/Inport',[model '/In3'],'Position',pos)
    set_param([model '/In3'], 'OutDataTypeStr', ...
              'int32','PortDimensions','1','SampleTime','1');
    add_line(model, 'In3/1','sum_int32/3')
    
    pos = [75   305   105   325];
    add_block('built-in/Inport',[model '/In4'],'Position',pos)
    set_param([model '/In4'], 'OutDataTypeStr', ...
               'int32','PortDimensions','1','SampleTime','1');
    add_line(model, 'In4/1','sum_int32/4')
    
    pos = [275   230   305   250];
    add_block('built-in/Outport',[model '/Out1'],'Position',pos)
    add_line(model, 'sum_int32/1','Out1/1')

  2. 指定输入数据、仿真时间和仿真输出格式。

    t = 0:200;
    peakValue = 1.5e9;
    in1 = peakValue * sin(t*2*pi/100);
    in2 = peakValue * cos(t*2*pi/70);
    in3 = -peakValue * sin(t*2*pi/40);
    in4 = -peakValue * cos(t*2*pi/30);
    set = Simulink.SimulationData.Dataset;
    set = set.addElement(1, timeseries(int32(in1),t,'Name','sig1'));
    set = set.addElement(2, timeseries(int32(in2),t,'Name','sig2'));
    set = set.addElement(3, timeseries(int32(in3),t,'Name','sig3'));
    set = set.addElement(4, timeseries(int32(in4),t,'Name','sig4'));
    
    set_param(model, 'LoadExternalInput', 'on');
    set_param(model, 'ExternalInput', 'set');
    
    set_param(model, 'StopTime', '50');
    
    set_param(model, 'ReturnWorkspaceOutputs', 'off');

  3. 禁用生产硬件设置并运行第一次仿真。

    set_param(model, 'ProdLongLongMode', 'off');
    [~, ~, y1] = sim(model, 200);

  4. 启用生产硬件设置并运行第二次仿真。

    set_param(model, 'ProdLongLongMode', 'on');
    [~, ~, y2] = sim(model, 200);

  5. 绘制仿真输出。

    plot([y1 y2]);
    figure(gcf);

该行为差异归因于 Sum 模块中的累加器数据类型。累加器数据类型模块参数设置为 继承:通过内部规则继承。对于此示例,如果启用 C long long 数据类型,则生成的累加器数据类型的宽度为 64 位。否则,它的宽度为 32 位。视 Sum 模块的输入值不同,在 64 位累加器未进行饱和处理时,32 位累加器可能会进行饱和处理。因此,普通模式行为可能取决于 ProdLongLongMode 设置。在这两种情况下,普通模式行为和生产硬件行为会按位匹配。

相关主题