当你使用Simulink时金宝app®软件来创建和执行模型,并使用代码生成器来生成C或c++代码,考虑您的配置最多为三个运行时环境:
MATLAB®运行MathWorks的开发计算机运行时环境®应用程序开发期间的软件。
将应用程序投入生产时,您将在其中部署应用程序的生产硬件运行时环境。
在部署前测试开发中的应用程序的测试硬件运行时环境。
一个运行时环境可以具有多种功能,但运行时环境在概念上仍然是不同的。通常,MATLAB是开发计算机的测试硬件。通常,生产硬件不同于MATLAB开发或测试硬件,而且功能不如MATLAB开发或测试硬件。许多类型的生产硬件只能运行一个下载的可执行文件。
提供有关生产硬件板和编译器的信息,当:
您使用Simul金宝appink软件来模拟一个模型,稍后为其生成代码
使用代码生成器生成用于部署的代码生产硬件
该软件使用电路板和编译器信息来获得在模拟和为生产硬件生成的代码中执行的整数和定点操作的结果的位-真一致性。代码生成器使用这些信息创建以最高效率执行的代码。
生成用于测试的代码时测验硬件,提供有关测试硬件板和所使用的编译器的信息。代码生成器使用这些信息创建代码,在以下结果之间提供位-真一致性:
在模拟中执行的整数和定点运算
生成的代码在生产硬件上运行
生成的代码在测试硬件上运行
即使生产和测试硬件不同,您也可以获得bit-true一致的结果。在C标准没有完全定义行为的地方,两种硬件的编译器可以使用不同的默认值。
您可以为特定的硬件板及其设备类型指定模型模拟或代码生成。例如,您可以设置数据大小、字节顺序和编译器行为(如整数舍入)。您可以配置:
生产硬件和与之一起使用的编译器。这些信息影响模拟和代码生成。看到影响正常模式仿真的生产硬件设置.
测试硬件和与之一起使用的编译器。此信息仅影响代码生成。
通过选择配置生产硬件配置参数>硬件实现.默认情况下,Hardware Implementation窗格会列出硬件板,设备供应商,设备类型仅限参数字段。除非你已经安装了硬件支持包,金宝app硬件板列表值没有一个
或确定由代码生成系统目标文件
,获取硬件支持包金宝app
.安装硬件支持包后,列表中还包含相应的硬件单板名称。金宝app如果选择了硬件板名称,则会显示该硬件板的参数。单击,设置设备的详细信息,如数据大小、字节排序等设备详细信息.
上配置测试硬件配置参数>硬件实现>先进的参数窗格。要启用用于配置测试硬件详细信息的参数,请禁用配置参数>硬件实现>先进的参数>测试硬件与生产硬件相同参数。为测试硬件生成的代码在测试硬件参数指定的环境中执行。代码的行为就像在为生产硬件指定的环境中执行一样。有关更多信息,请参见测试硬件注意事项.
中的默认值和属性显示为初始值硬件实现面板时:
您可以指定系统目标文件在代码生成窗格。
系统目标文件指定一个默认的微处理器及其硬件属性。
不能更改只有一个可能值的参数。具有多个可能值的参数提供有效值列表。中手动指定硬件属性硬件实现窗格中,验证这些值是否与系统目标文件一致。否则,生成的代码可能无法编译或执行,或者可以执行但产生不正确的结果。
硬件实现参数向MATLAB软件描述硬件和编译器的特性。代码生成器使用这些信息为运行时环境生成尽可能高效运行的代码。生成的代码为模拟、生产代码和测试代码中的整数和定点操作的结果提供了位真一致性。
具体参数请参见硬件实现面板(金宝app模型)。看一个例子硬件实现窗格功能,请参见
模型的例子。有关配置硬件实现的详细信息,请参见:rtwdemo_targetsettings
指定运行由模型生成的代码的硬件板。为配置参数>硬件实现>硬件板.
“硬件实现”窗格标识上选择的系统目标文件配置参数>代码生成.
要配置测试硬件,请使用配置参数>硬件实现>先进的参数窗格。
若要启用配置测试硬件详细信息的参数,请设置ProdEqTarget
来从
.
指定硬件板的方法
如果 | 选择 |
---|---|
菜单包括要使用的硬件板的名称。 |
该硬件板的名称。 如果选择了硬件板名称,则会显示该硬件板的参数。 |
菜单不包括要使用的硬件板的名称。 |
该值打开支持包安装程序。金宝app安装所需的支持包。金宝app安装支持包后,菜单中会显示相应的硬件单板名称金宝app。 |
模型配置使用系统目标文件 |
没有为硬件实现指定硬件板。 |
模型配置不使用系统目标文件 |
代码生成器使用指定的系统目标文件来确定硬件实现。 |
要指定硬件设备的微处理器的供应商,请使用设备供应商参数。类型中可用的微处理器设备类型菜单。如果没有出现供应商名称,请选择定制的处理器
.然后,使用设备类型参数指定微处理器。
添加设备供应商而且设备类型属性上显示的默认设置硬件实现窗格中,看到注册更多设备供应商和设备类型值.
从为您列出的受支持设备中指定微处理器名称金宝app设备供应商选择,使用设备类型参数。如果微处理器没有出现在菜单中,请更改设备供应商来定制的处理器
.然后,为自定义设备指定设备详细信息。
如果选择系统目标文件指定默认硬件属性的设备类型,则这些属性将显示为初始值。不能在只有一种选择的情况下更改参数的值。具有多个可能值的参数提供一个菜单。为您的硬件选择值。
添加设备供应商而且设备类型属性上显示的默认设置硬件实现窗格中,您可以使用代码生成器提供的硬件设备注册API。
要使用此API,您需要创建一个sl_customization.m
文件,在MATLAB路径上调用registerTargetInfo
函数并使用设备信息填充硬件设备注册表项。设备信息为每个后续的Simulink会话注册到Simulink软件。金宝app(要在不重新启动MATLAB的情况下注册设备信息,请发出MATLAB命令sl_refresh_customizations
.)
例如sl_customization.m
文件添加设备供应商MyDevVendor
以及设备类型MyDevType
到Simuli金宝appnk设备列表。
函数sl_customization(cm) cm. registertargetinfo (@loc_register_device);结束函数thisDev = loc_register_device thisDev = RTW.HWDeviceRegistry;thisDev。供应商= 'MyDevVendor'; thisDev.Type = 'MyDevType'; thisDev.Alias = {}; thisDev.Platform = {'Prod', 'Target'}; thisDev.setWordSizes([8 16 32 32 32]); thisDev.LargestAtomicInteger = 'Char'; thisDev.LargestAtomicFloat = 'None'; thisDev.Endianess = 'Unspecified'; thisDev.IntDivRoundTo = 'Undefined'; thisDev.ShiftRightIntArith = true; thisDev.setEnabled({'IntDivRoundTo'}); end
注册设备后,可以在界面中选择设备硬件实现窗格。
的数组来注册多个设备环球套票。HWDeviceRegistry
您的sl_customization.m
文件。例如:
函数sl_customization(cm) cm. registertargetinfo (@loc_register_device);结束函数thisDev = loc_register_device thisDev(1) = RTW.HWDeviceRegistry;thisDev(1)。供应商= 'MyDevVendor'; thisDev(1).Type = 'MyDevType1'; ... thisDev(4) = RTW.HWDeviceRegistry; thisDev(4).Vendor = 'MyDevVendor'; thisDev(4).Type = 'MyDevType4'; ... end
你可以指定环球套票。HWDeviceRegistry
中的属性registerTargetInfo
函数调用sl_customization.m
文件。
属性registerTargetInfo
函数调用
财产 | 描述 |
---|---|
供应商 |
字符向量,指定设备供应商为您的硬件设备提供价值。 |
类型 |
字符向量,指定设备类型为您的硬件设备提供价值。 |
别名 |
字符向量的单元格数组,指定可以解析到此设备的别名或遗留名称。按格式指定每个别名或遗留名称 嵌入式编码器®软件提供实用功能 |
平台 |
单元格数组的枚举字符向量值,指定此设备是否可以在生产硬件subpane ({“刺激”} ),测试硬件subpane ({'目标'} ),或两者兼备({“刺激”,“目标”} ). |
setWordSizes |
对象关联的整数大小的数组比特数参数字符,短,int,长,本地字大小,分别。 |
LargestAtomicInteger |
属性的枚举值的字符向量最大原子大小:整数参数:“字符” ,“短” ,“Int” ,或“长” . |
LargestAtomicFloat |
属性的枚举值的字符向量最大原子大小:浮点数参数:“浮” ,“双” ,或“没有” . |
Endianess |
属性的枚举值的字符向量字节次序参数:“不明” ,“小” 对于小恩迪安人,或者“大” 大端典。 |
IntDivRoundTo |
属性的枚举值的字符向量有符号整数除法舍入到参数:“零” ,“地板” ,或“定义” . |
ShiftRightIntArith |
布尔值,指定编译器是否将有符号整数右移实现为算术右移(真正的 )或否(假 ). |
setEnabled |
属性中指定可以修改的设备属性的单元格字符向量数组硬件实现窗格中选择此设备类型。 属性应用于 |
的比特数参数描述本地字大小的位长字符,短,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
代码生成器整数类型 | 金宝appSimulink整数类型 |
---|---|
boolean_T |
布尔 |
int8_T |
int8 |
uint8_T |
uint8 |
int16_T |
int16 |
uint16_T |
uint16 |
int32_T |
int32 |
uint32_T |
uint32 |
的字节次序参数指定硬件是否使用大端字节序
(最高有效字节优先)或小端字节
(最低有效字节优先)字节排序。如果放任不管未指明的
,代码生成器生成确定硬件字节序的代码。这种设置效率最低。
ANSI C没有完全定义编译器在用一个有符号整数除以另一个整数时使用的商舍入技术。因此,行为是依赖于实现的。如果两个整数都是正的,或者都是负的,商数必须四舍五入。如果其中一个整数为正,另一个为负,则商数可以向上或向下舍入。
的有符号整数除法舍入到参数指示代码生成器编译器如何舍入有符号整数除法的结果。提供这些信息不会改变编译器的操作。它只向代码生成器描述该行为,代码生成器使用该信息优化为有符号整数除法生成的代码。参数值为:
零
—如果商在两个整数之间,编译器将选择更接近于0的整数作为结果。
地板上
—如果商在两个整数之间,编译器选择更接近负无穷的整数。
未定义的
——如果零
或地板上
不要描述编译器行为,如果该行为未知,则选择此值。
避免选择未定义的
.当代码生成器不知道编译器的有符号整数除法舍入行为时,模型构建将生成额外的代码。
编译器商数舍入行为根据这些值而变化。
可以从编译器文档中获得有符号整数除法舍入的编译器实现。如果没有文档,您可以通过实验来确定这种行为。
商数舍入为零,地板,和未定义的例子
N | D | 理想的N / D | 零 | 地板上 | 未定义的 |
---|---|---|---|---|---|
|
4 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ANSI C没有为编译器定义负整数右移的行为。因此,行为是依赖于实现的。的对有符号整数右移作为算术移位选项指示代码生成器编译器如何在负整数上实现右移。提供这些信息不会改变编译器的操作。它只向代码生成器描述该行为,代码生成器使用该信息优化为算术右移生成的代码。
如果C编译器将有符号整数右移实现为算术右移,则选择该选项。否则,请清除该选项。算术右移用最有效位的值填充右移空出的位,该位表示二补表示法中数字的符号。该选项默认选中。如果编译器将右移作为算术移位处理,则首选此设置。
当您选择该选项时,只要Simulink模型对有符号整数执行算术移位,代码生成器就会生成高效的代码。金宝app
当清除该选项时,代码生成器将生成完全可移植但效率较低的代码来实现正确的算术移位。
可以从编译器文档中获得算术右移的编译器实现。如果没有文档,您可以通过实验来确定这种行为。
如果您的模型是在版本14之前创建的,并且您还没有更新模型,则配置当前执行硬件设备参数(TargetUnknown
)值为“上”
默认情况下。
要更新模型,请清除为的方框配置参数>硬件实现>先进的参数>测试硬件>配置测试硬件.或者在命令窗口中输入:
cs = getActiveConfigSet('your_model_name”);set_param (cs,“TargetUnknown”,“关闭”);
此更新到您的模型:
使测试硬件与生产硬件相同参数(ProdEqTarget
),将参数设置为“上”
.
复制生产设备厂商及类型参数(ProdHWDeviceType
)的值测试设备供应商和类型参数(TargetHWDeviceType
).
完成更新:
清理盒子配置参数>硬件实现>先进的参数>测试硬件>测试硬件与生产硬件相同.只有在生产硬件和测试硬件不同的情况下才应用此步骤。
中设置参数配置参数>硬件实现>先进的参数以配合您的生产和测试系统。
保存模型。
在配置生产硬件时,需要考虑以下几点:
生产硬件可以具有与MATLAB开发计算机不同的字大小和其他硬件特征。您可以在不同于生产硬件或MATLAB开发计算机的硬件上构建代码原型。在生成代码时,代码生成器会考虑这些差异。
Simu金宝applink产品使用生产硬件配置中的一些信息。该信息使无需生成代码的模拟能够得到与执行生成代码相同的结果。例如,结果可以检测生产硬件上出现的错误条件,例如硬件溢出。
代码生成器生成的代码为整数和定点操作提供与Simulink结果的位真一致性。金宝app生成的模拟不可用数据长度的代码比不模拟的运行效率低。仿真不影响与Simulink对整数和定点结果的位真一致性。金宝app
如果在应用程序开发期间更改了运行时环境,在生成或重新生成代码之前,请为新的运行时环境重新配置硬件实现参数。当代码在不是为其生成的硬件上执行时,模拟、生产代码和测试代码中的整数和定点操作的结果并不总是实现位真一致。
要编译从模型生成的代码,请使用整数舍入模式参数来模拟你想要的C编译器的舍入行为。属性上显示此设置信号的属性窗格中可以执行有符号整数算术的块的参数对话框,例如产品而且n-D查找表块。
对于大多数块,的值整数舍入模式完全定义舍入行为。对于支持定点数据和最简单舍入模式金宝app的块,的值有符号整数除法舍入到也影响四舍五入。详细信息请参见精度(定点设计师)。
当模型包含模型块,将它们引用的模型配置为使用相同的硬件设置。
默认情况下,测试硬件配置与生产硬件配置相同。您可以在与生产环境相同的环境中使用生成的代码进行测试。
如果测试环境和生产环境不同,您可以生成在测试硬件上运行的代码,就像在生产硬件上运行一样:
要启用测试硬件参数,请清除选中的复选框配置参数>硬件实现>先进的参数>测试硬件>测试硬件与生产硬件相同.或者,在命令窗口中输入:
cs = 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.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 = 金宝appSimulink.SimulationData.Dataset;Set = Set。addElement (1, timeseries (int32 (in), t,“名字”,“sig1”));Set = Set。addElement (2, timeseries (int32 (in2), t,“名字”,“sig2”));Set = Set。addElement (3, timeseries (int32 (in3), t,“名字”,“sig3”));Set = Set。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位宽。根据求和块的输入值,当64位累加器没有饱和时,32位累加器可以饱和。因此,正模态行为可以依赖于ProdLongLongMode
设置。在这两种情况下,正常模式行为和生产硬件行为按位匹配。