当你使用Simulink时金宝app®软件来创建和执行模型,并使用代码生成器来生成C或c++代码,请考虑至多三个运行时环境的配置:
MATLAB®开发运行MathWorks的计算机运行时环境®应用程序开发期间的软件。
生产硬件运行时环境,当应用程序投入生产环境时,您将在其中部署应用程序。
在部署之前测试开发中的应用程序的测试硬件运行时环境。
一个运行时环境可以提供多种功能,但是运行时环境在概念上仍然是不同的。通常,MATLAB开发的计算机是测试硬件。通常,生产硬件不同于MATLAB开发或测试硬件,功能也不如它们强大。许多类型的产品硬件只能运行下载的可执行文件。
在以下情况下提供有关生产硬件板和编译器的信息:
您使用Simul金宝appink软件来模拟一个模型,稍后您将为其生成代码
您可以使用代码生成器生成用于部署的代码生产硬件
该软件使用板和编译器信息,以获得整数和定点操作的结果的位真一致,在模拟和代码生成的生产硬件。代码生成器使用这些信息创建执行效率最高的代码。
当您生成代码进行测试时测试硬件,提供有关测试硬件板和你使用的编译器的信息。代码生成器使用此信息创建代码,提供以下结果之间的位真一致:
在模拟中执行的整数和定点操作
生成的代码在生产硬件上运行
生成的代码在测试硬件上运行
即使生产和测试硬件不同,您也可以实现结果的位真一致。在C标准没有完全定义行为的地方,两种硬件的编译器可以使用不同的默认值。
您可以为特定的硬件板及其设备类型指定模型仿真或代码生成。例如,您可以设置数据大小、字节顺序和编译器行为,例如整数舍入。您可以配置:
产品硬件和与之一起使用的编译器。这个信息会影响模拟和代码生成。看到影响正常模式模拟的生产硬件设置.
您使用的测试硬件和编译器。此信息仅影响代码生成。
通过选择来配置生产硬件配置参数>硬件实现.默认情况下,硬件实现窗格列出硬件板,设备供应商,设备类型只有参数字段。除非你已经安装了硬件支持包,金宝app硬件板列表值没有一个
或由代码生成系统目标文件确定
,获取硬件支持包金宝app
.硬件支撑包安装完成后,列表中还包含相应的硬件单板名称。金宝app如果选择硬件单板名称,则显示该单板的参数。单击,可以设置设备的详细信息,如数据大小和字节排序等设备详细信息.
在上配置测试硬件配置参数>硬件实现>先进的参数窗格。要启用配置测试硬件细节的参数,请禁用配置参数>硬件实现>先进的参数>测试硬件与生产硬件相同参数。为测试硬件生成的代码在测试硬件参数指定的环境中执行。代码的行为就像在为生产硬件指定的环境中执行一样。有关更多信息,请参见测试硬件方面的考虑.
属性中的默认值和属性显示为初始值硬件实现面板时:
你指定一个系统目标文件在代码生成窗格。
系统目标文件指定一个默认微处理器及其硬件属性。
不能更改只有一个可能值的参数。具有多个可能值的参数提供有效值列表。中手动指定硬件属性硬件实现窗格中,验证这些值是否与系统目标文件一致。否则,生成的代码可能无法编译或执行,或者执行后产生不正确的结果。
硬件实现参数用MATLAB软件描述硬件和编译器的特性。代码生成器使用这些信息为尽可能高效运行的运行时环境生成代码。生成的代码为模拟、生产代码和测试代码中的整数和定点操作的结果提供了位真一致。
具体参数请参见硬件实现面板.看…的例子硬件实现窗格功能,请参阅
模型的例子。配置硬件实现的详细信息请参见:rtwdemo_targetsettings
指定运行从模型生成的代码的硬件板。选择一个值配置参数>硬件实现>硬件板.
“硬件实现”窗格标识所选的系统目标文件配置参数>代码生成.
要配置测试硬件,请使用配置参数>硬件实现>先进的参数窗格。
要启用配置测试硬件细节的参数,请设置ProdEqTarget
来从
.
指定硬件板的方法
如果 | 选择 |
---|---|
菜单包括您想要使用的硬件单板的名称。 |
那个硬件板的名字。 如果选择硬件单板名称,则显示该单板的参数。 |
菜单不包括您想要使用的硬件单板的名称。 |
该值将打开支持包安装程序。金宝app安装所需的支持包。金宝app安装支持包后,菜单中会显示相应的硬件单板名称金宝app。 |
模型配置使用系统目标文件 |
没有为硬件实现指定硬件板。 |
模型配置不使用系统目标文件 |
代码生成器使用指定的系统目标文件来确定硬件实现。 |
要指定硬件设备的微处理器的供应商,请使用设备供应商参数。您的选择决定了可用的微处理器设备类型菜单。如果供应商名称没有出现,请选择定制的处理器
.然后,使用设备类型参数指定微处理器。
从列出的支持设备中指定微处理器名称金宝app设备供应商选择,使用设备类型参数。如果微处理器没有出现在菜单中,请更改设备供应商来定制的处理器
.然后,为您的自定义设备指定设备细节。
如果选择系统目标文件指定默认硬件属性的设备类型,则属性显示为初始值。不能仅使用一个可能的选择来更改参数的值。具有多个可能值的参数提供一个菜单。为您的硬件选择值。
的的比特数参数描述本族词大小的位长度字符,短,int,长数据。为了成功生成代码:
位长必须是这样的字符<=短<=int<=长.
位长必须是8的倍数,最大长度为32。
的位长长数据不能小于32。
的rtwtypes.h
文件定义整型类型名称。您提供的值必须与编译器中定义的单词大小一致h
头文件。代码生成器将其整数类型名称映射到相应的Simulink整数类型名称。金宝app
如果没有ANSI®C有匹配的字大小的类型,但更大ANSI C类型可用时,代码生成器将使用较大的类型int8_T
,uint8_T
,int16_T
,uint16_T
,int32_T
,uint32_T
.当代码生成器使用较大的类型时,生成的日志值(例如mat文件日志)可能具有与模拟日志值不同的数据类型。
应用程序可以使用长度从1位(无符号)或2位(有符号)到32位的整数数据。如果整型长度与可用类型的长度匹配,则代码生成器将使用该类型。如果匹配的类型不可用,则代码生成器使用可以保存数据的最小可用类型,从而生成不使用不必要的高阶位的代码。例如,在支持8位、16位和32位整数的硬件上,对于指定为24金宝app位的信号,代码生成器将数据实现为int32_T
或uint32_T
.
使用模拟整型数据的代码不是最有效的。此代码在应用程序开发期间非常有用,可用于模拟仅在生产硬件上可用的整数长度。仿真不会影响执行结果。
在代码生成期间,软件检查模型数据类型与您为生产硬件指定的数据类型的兼容性。
如果您为生产硬件整数指定的所有长度都不是32位,则软件产生错误。
如果模型使用的数据类型长度小于可用的生产硬件整数长度,则软件生成警告。
从代码生成器到Simulink的整数类型映射金宝app
代码生成器整数类型 | 金宝app仿真软件整数类型 |
---|---|
boolean_T |
布尔 |
int8_T |
int8 |
uint8_T |
uint8 |
int16_T |
int16 |
uint16_T |
uint16 |
int32_T |
int32 |
uint32_T |
uint32 |
的字节次序参数指定硬件是否使用大端字节序
(最有效字节优先)或小端字节
(最低有效字节优先)字节排序。如果离开了未指明的
,代码生成器生成决定硬件字节数的代码。这种设置效率最低。
ANSI C没有完全定义编译器在一个有符号整数除以另一个有符号整数时使用的商舍入技术。因此,行为是依赖于实现的。如果两个整数都是正的,或都是负的,商必须舍入。如果其中一个整数是正的,另一个是负的,商可以上下舍入。
的有符号整数除法舍入参数指示代码生成器编译器如何舍入有符号整数除法的结果。提供此信息不会改变编译器的操作。它只向代码生成器描述该行为,代码生成器使用该信息优化为带符号整数除法生成的代码。参数值如下:
零
—如果商在两个整数之间,编译器选择更接近零的整数作为结果。
地板上
-如果商在两个整数之间,编译器选择更接近负无穷的整数。
未定义的
——如果零
或地板上
不要描述编译器的行为,如果该行为是未知的,请选择此值。
避免选择未定义的
.当代码生成器不知道编译器的带符号整数除舍入行为时,模型构建会生成额外的代码。
编译器商舍入行为根据这些值而变化。
您可以从编译器文档中获得有符号整数除法舍入的编译器实现。如果文档不可用,您可以通过实验确定此行为。
例子商舍入为零,地板,和未定义
N | D | 理想的N / D | 零 | 地板上 | 未定义的 |
---|---|---|---|---|---|
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ANSI C没有定义编译器对负整数右移的行为。因此,行为是依赖于实现的。的对有符号整数右移称为算术移位选项指示代码生成器编译器如何在负整数上实现右移。提供此信息不会改变编译器的操作。它只向代码生成器描述该行为,代码生成器使用该信息来优化为算术右移生成的代码。
如果C编译器实现一个有符号整数右移作为算术右移,选择该选项。否则,清除该选项。算术右移用最高有效位的值来填充由右移空出的位,最高有效位表示二补符号中数字的符号。该选项默认被选中。如果编译器将右移位作为算术移位处理,则首选此设置。
当您选择该选项时,只要Simulink模型对有符号整数执行算术移位,代码生成器就会生成有效的代码。金宝app
当清除该选项时,代码生成器将生成完全可移植但效率较低的代码,以实现正确的算术移位。
您可以从编译器文档中获得算术右移的编译器实现。如果文档不可用,您可以通过实验确定此行为。
如果您的模型是在第14版之前创建的,并且您没有更新模型,则配置当前执行硬件设备参数(TargetUnknown
)的值是“上”
默认情况下。
要更新您的模型,请清除为配置参数>硬件实现>先进的参数>测试硬件>配置测试硬件.或在命令窗口中输入:
c = getActiveConfigSet ('your_model_name”);set_param (cs,“TargetUnknown”,“关闭”);
对模型的更新:
使测试硬件与生产硬件相同参数(ProdEqTarget
,将参数设置为“上”
.
复制生产设备供应商和类型参数(ProdHWDeviceType
)价值测试设备供应商和类型参数(TargetHWDeviceType
).
完成更新:
清理箱子配置参数>硬件实现>先进的参数>测试硬件>测试硬件与生产硬件相同.仅当生产和测试硬件不同时,才应用此步骤。
设置配置参数>硬件实现>先进的参数以匹配您的生产和测试系统。
保存模型。
当您配置生产硬件时,请考虑以下几点:
生产硬件可以具有与MATLAB开发计算机不同的字大小和其他硬件特征。您可以在不同于生产硬件或MATLAB开发计算机的硬件上创建原型代码。在生成代码时,代码生成器会考虑到这些差异。
Simu金宝applink产品使用生产硬件配置中的一些信息。这些信息使不生成代码的模拟能够给出与执行生成代码相同的结果。例如,结果可以检测生产硬件上出现的错误条件,例如硬件溢出。
代码生成器生成的代码为整数和定点操作的Simulink结果提供了位真一致。金宝app模拟不可用数据长度生成的代码运行效率低于不进行模拟的代码。仿真不影响与Simulink的整数和定点结果的位真一致性。金宝app
如果您在应用程序开发期间更改了运行时环境,那么在生成或重新生成代码之前,请为新的运行时环境重新配置硬件实现参数。当代码在没有为其生成的硬件上执行时,在模拟、生产代码和测试代码中,整数和定点操作的结果并不总是达到位真一致。
要编译从模型生成的代码,请使用整数舍入模式参数来模拟您想要的C编译器的舍入行为。该设置显示在信号的属性窗格中的参数对话框中的块可以执行有符号整数运算,例如产品和一天的查找表块。
对于大多数块,值整数舍入模式完全定义舍入行为。对于支持定点数据和最简单的舍入模金宝app式的块,值有符号整数除法舍入也会影响舍入。有关详细信息,请参见精度(定点设计师).
当模型包含模型块,配置它们引用的使用相同硬件设置的模型。
默认情况下,测试硬件配置与生产硬件的配置相同。您可以在与生产环境相同的环境中使用生成的代码进行测试。
如果测试环境和生产环境不同,您可以生成在测试硬件上运行的代码,就像在生产硬件上运行一样:
要启用测试硬件参数,请清除对应的框配置参数>硬件实现>先进的参数>测试硬件>测试硬件与生产硬件相同.或者,在命令窗口类型中:
c = getActiveConfigSet ('your_model_name”);set_param (cs,“ProdEqTarget”,“关闭”);
通过测试硬件指定设备类型细节(目标*
)参数。
如果选择指定默认微处理器及其硬件属性的系统目标文件,这些默认值和属性将显示为初始值。
只有一个可能值的参数不能被更改。如果需要修改硬件属性,请检查硬件属性值是否与系统目标文件一致。否则,生成的代码可能无法编译或执行,或者执行后产生不正确的结果。
例如,更改一些生产硬件设置,ProdLongLongMode
和ProdIntDivRoundTo
,会影响正模态仿真结果。下面的例子模拟一个有四个输入的加法器。在第一个模拟中,ProdLongLongMode
是禁用的。在第二个模拟中,ProdLongLongMode
启用。在仿真输出图中,您可以观察到时间步长范围125-175内的输出值之间的微小差异。
模型=“hwSettingEffect”;new_system(模型)open_system(模型)%建立加法器Pos = [140 140 200 340];add_block (“金宝app数学仿真软件/操作/添加”,...(模型' / sum_int32 '],...“输入”,“+ + + +”,...“SaturateOnIntegerOverflow”,...“上”,...“位置”,...Pos) Pos = [75 155 105 175];add_block (“内置/尺寸。”(模型' / in '],“位置”pos) set_param([模型' / in '],“OutDataTypeStr”,...“int32”,“PortDimensions”,' 1 ',“SampleTime”,' 1 ');add_line(模型,“In1/1”,“sum_int32/1”) pos = [75 205 105 225];add_block (“内置/尺寸。”(模型“/ In2”],“位置”pos) set_param([模型“/ In2”],“OutDataTypeStr”,...“int32”,“PortDimensions”,' 1 ',“SampleTime”,' 1 ');add_line(模型,“In2/1”,“sum_int32/2”) pos = [75 255 105 275];add_block (“内置/尺寸。”(模型' / In3 '],“位置”pos) set_param([模型' / In3 '],“OutDataTypeStr”,...“int32”,“PortDimensions”,' 1 ',“SampleTime”,' 1 ');add_line(模型,“In3/1”,“sum_int32/3”) pos = [75 305 105 325];add_block (“内置/尺寸。”(模型' / In4 '],“位置”pos) set_param([模型' / In4 '],“OutDataTypeStr”,...“int32”,“PortDimensions”,' 1 ',“SampleTime”,' 1 ');add_line(模型,“In4/1”,“sum_int32/4”) pos = [275 230 305 250];add_block (“内置/输出港”(模型/着干活的],“位置”、pos) add_line(模型,“sum_int32/1”,“Out1/1”)%指定输入数据t = 0:200;peakValue = 1.5 e9;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);设置= Si金宝appmulink.SimulationData.Dataset;=集合。addElement (1, timeseries (int32 (in), t,“名字”,“sig1”));=集合。addElement (2, timeseries (int32 (in2), t,“名字”,“sig2”));=集合。addElement (3, timeseries (int32 (in3), t,“名字”,“sig3”));=集合。addElement (4, timeseries (int32 (in4), t,“名字”,“sig4”));set_param(模型,“LoadExternalInput”,“上”);set_param(模型,“ExternalInput”,“设置”);set_param(模型,“StopTime”,“50”);%禁用生产硬件设置并运行第一次模拟set_param(模型,“ProdLongLongMode”,“关闭”);[~, ~, y1] = sim(model, 200);%启用生产硬件设置并运行第二次模拟set_param(模型,“ProdLongLongMode”,“上”);[~, ~, y2] = sim(model, 200);情节((y1 y2));图(gcf);
属性中的累加器数据类型造成了行为上的差异总和块。的蓄电池数据类型设置块参数为继承:通过内部规则继承
.对于本例,如果使用C很久很久
启用“数据类型”。否则,它是32位宽。根据sum块的输入值,32位累加器可以在64位累加器没有饱和时饱和。因此,正常模式的行为可以依赖于ProdLongLongMode
设置。在这两种情况下,普通模式行为和生产硬件行为按位匹配。