主要内容

注册新硬件设备

硬件实现窗格中,您可以指定描述 MATLAB® 软件的目标硬件和编译器属性的参数,以便:

  • 在模型仿真期间观测目标硬件。

  • 为生产或测试硬件生成优化的代码。

  • 在目标硬件上直接测试或部署生成的代码。

硬件实现窗格支持多个目标硬件。要扩展所支持的硬件范围,请使用 target.Processortarget.LanguageImplementation 类注册新硬件设备。

为新设备指定硬件实现

此示例说明如何注册新硬件设备。

为新硬件设备创建一个 target.Processor 对象。

myProc = target.create("Processor",Name="MyProcessor", ...
                        Manufacturer="MyManufacturer");

为语言实现详细信息创建一个 target.LanguageImplementation 对象。

myLanguageImplementation = target.create("LanguageImplementation", ...
                                          Name="MyProcessorImplementation");

指定语言实现详细信息。

myLanguageImplementation.Endianess = target.Endianess.Little;

myLanguageImplementation.AtomicIntegerSize = 64;
myLanguageImplementation.AtomicFloatSize = 64;
myLanguageImplementation.WordSize = 64;

myLanguageImplementation.DataTypes.Char.Size = 8;
myLanguageImplementation.DataTypes.Short.Size = 16;
myLanguageImplementation.DataTypes.Int.Size = 32;
myLanguageImplementation.DataTypes.Long.Size = 64;
myLanguageImplementation.DataTypes.LongLong.IsSupported = true;
myLanguageImplementation.DataTypes.LongLong.Size = 64;
myLanguageImplementation.DataTypes.Float.Size = 32;
myLanguageImplementation.DataTypes.Double.Size = 64;

myLanguageImplementation.DataTypes.Pointer.Size = 32;

myLanguageImplementation.DataTypes.SizeT.Size = 64;
myLanguageImplementation.DataTypes.PtrDiffT.Size = 64;

将语言实现与硬件设备相关联。

myProc.LanguageImplementations = myLanguageImplementation;

target.Processor 对象添加到内部数据库中。

objectsAdded = target.add(myProc);
target.add summary:

    Objects added to internal database for current MATLAB session:
        target.LanguageImplementation    "MyProcessorImplementation"
        target.Processor                 "MyManufacturer-MyProcessor"
  • 如果您使用的是 MATLAB® Coder™:在硬件选项卡上,您会看到新设备。或者,您现在可以使用 coder.hardware 函数为此设备创建一个 coder.Hardware 对象。

  • 如果您使用的是 Simulink® Coder™:在硬件实现窗格中,您现在可以将设备供应商设备类型分别设置为 MyManufacturerMyProcessor

要从内部数据库中删除对象,请输入:

target.remove(objectsAdded)
target.remove summary:

    Objects removed from internal database:
        target.LanguageImplementation    "MyProcessorImplementation"
        target.Processor                 "MyManufacturer-MyProcessor"

指定在各 MATLAB 会话之间持久保留的硬件实现

默认情况下,当您将目标对象添加到内部数据库时,目标数据仅可用于当前 MATLAB® 会话。此示例说明如何指定在各 MATLAB 会话之间持久保留的目标数据。

为新硬件设备创建 target.Processor 对象,并将流程的语言实现指定为 ARM Compatible-ARM Cortex 的现有实现。

myProc = target.create("Processor",Name="MyProcessor", ...
                        Manufacturer="MyManufacturer");

existingImplementation = target.get("LanguageImplementation", ...
                                "ARM Compatible-ARM Cortex"); 

myProc.LanguageImplementations = existingImplementation;

将创建的 target.Processor 对象添加到内部数据库中,并将 UserInstall 指定为 true 以允许目标数据在各 MATLAB 会话之间持久保留。

objectsAdded = target.add(myProc,UserInstall=true);
target.add summary:

    Objects added to internal database, which will persist across MATLAB sessions:
        target.Processor                 "MyManufacturer-MyProcessor"
    1 object not added because they already exist.

如果您随后修改 MATLAB 工作区中的对象,然后要更新内部数据库中的对象,则可以使用 target.update 函数。

要从内部数据库中删除对象,请输入:

target.remove(objectsAdded)
target.remove summary:

    Objects removed from internal database:
        target.Processor    "MyManufacturer-MyProcessor"

要从内部数据库中删除多个持久性对象,请使用 target.clear 函数。

通过修改现有实现来创建硬件实现

如果某个现有硬件实现包含新硬件实现中所需的大部分值,则可以通过创建和修改该现有实现的副本来快速创建新实现。

为新硬件设备创建一个 target.Processor 对象。

myProc = target.create("Processor",Name="MyProcessor", ...
                        Manufacturer="MyManufacturer");

创建一个用于复制现有语言实现的 target.LanguageImplementation 对象。

myCopiedImplementation = target.create("LanguageImplementation", ...
                                      Name="MyCopiedImplementation", ...
                                      Copy="Atmel-AVR");

指定所需的语言实现详细信息。例如,字节顺序。

myCopiedImplementation.Endianess = target.Endianess.Big;

将语言实现与硬件设备相关联。

myProc.LanguageImplementations = myCopiedImplementation;

target.Processor 对象添加到内部数据库中。

objectsAdded = target.add(myProc);
target.add summary:

    Objects added to internal database for current MATLAB session:
        target.LanguageImplementation    "MyCopiedImplementation"
        target.Processor                 "MyManufacturer-MyProcessor"

要从内部数据库中删除对象,请输入:

target.remove(objectsAdded)
target.remove summary:

    Objects removed from internal database:
        target.LanguageImplementation    "MyCopiedImplementation"
        target.Processor                 "MyManufacturer-MyProcessor"

通过重用现有实现来创建硬件实现

如果您的硬件设备需要与现有实现相同的硬件实现,您可以重用现有实现。

为新硬件设备创建一个 target.Processor 对象。

myProc = target.create( "Processor",Name="MyProcessor", ...
                        Manufacturer="MyManufacturer");

通过使用设备供应商的标识符和类型检索现有实现。

existingImplementation = target.get("LanguageImplementation", ...
                                  "ARM Compatible-ARM Cortex");

将语言实现与硬件设备相关联。

myProc.LanguageImplementations = existingImplementation;

target.Processor 对象添加到内部数据库中。

objectsAdded = target.add(myProc);
target.add summary:

    Objects added to internal database for current MATLAB session:
        target.Processor                 "MyManufacturer-MyProcessor"
    1 object not added because they already exist.

要从内部数据库中删除对象,请输入:

target.remove(objectsAdded);
target.remove summary:

    Objects removed from internal database:
        target.Processor    "MyManufacturer-MyProcessor"

验证硬件设备数据

要验证目标对象的数据完整性,请使用 target.Object 基类的 IsValid 属性或 validate 方法。

假设有如下示例,您要在其中创建一个 target.Processor 对象,并将某个现有语言实现与该对象相关联。

myProcessor = target.create("Processor");
myProcessor.LanguageImplementations = target.get("LanguageImplementation", ...
                                              "ARM Compatible-ARM Cortex");

要查看新创建的对象是否无效,请输入 myProcessor.IsValid

myProcessor.IsValid
ans = logical
   0

如果您尝试用方法 myProcessor.validate() 验证对象,会出现错误。

myProcessor.validate()
Error using target.internal.Processor/validate
Target data validation failed.
 * Undefined property "Name" in "Processor" object.
 * Undefined identifier in "Processor" object.

验证失败,因为未指定以下 target.Processor 属性:

  • Name - 处理器名称

  • Id - 对象标识符

您可以指定处理器名称,该名称还指定对象标识符。

myProcessor.Name = "MyProcessor";

再次检查 myProcessor 的有效性,查看对象的有效性是否成立。

myProcessor.IsValid
ans = logical
   1

myProcessor.validate()

注意:当您使用 target.add 函数注册目标对象时,软件也会检查该对象的有效性。

导出硬件设备数据

您可以在计算机和用户之间共享以前创建的硬件设备数据。

对于此示例,指定硬件设备并将其添加到内部数据库中。

myProc = target.create("Processor",Name="MyProcessor", ...
                        Manufacturer="MyManufacturer");

existingImplementation = target.get("LanguageImplementation", ...
                        "ARM Compatible-ARM Cortex");

myProc.LanguageImplementations = existingImplementation;
objectsAdded = target.add(myProc);
target.add summary:

    Objects added to internal database for current MATLAB session:
        target.Processor                 "MyManufacturer-MyProcessor"
    1 object not added because they already exist.

要创建共享硬件设备数据的函数,请输入:

target.export(myProc,"FileName", ...
  "exportMyProcFunction",Overwrite=true)

target.export 函数在当前工作文件夹中创建 exportMyProcFunction.m。使用 type 命令查看该函数。

type("exportMyProcFunction.m")
function registeredObjects = exportMyProcFunction(varargin)
% This function was generated using target data export.

    % Create target.Processor "MyManufacturer-MyProcessor"
    processor = target.create("Processor");
    processor.LanguageImplementations(1) = target.get("LanguageImplementation", "ARM Compatible-ARM Cortex");
    processor.Manufacturer = "MyManufacturer";
    processor.Name = "MyProcessor";

    % Add the target objects to MATLAB memory
    registeredObjects = target.add(processor, varargin{:});
end

现在,您可以使用生成的函数跨计算机和用户共享数据库中的硬件设备数据了。例如,在另一台计算机上输入以下命令:

objectsAdded = exportMyProcFunction;

生成的函数会重新创建 target.Processor 对象 MyManufacturer-MyProcessor,并将其添加到内部数据库中。

要从内部数据库中删除对象,请输入:

target.remove(objectsAdded)
target.remove summary:

    Objects removed from internal database:
        target.Processor    "MyManufacturer-MyProcessor"

为目标对象创建替代标识符

要为目标对象创建替代标识符,请使用 target.Alias 类。

例如,如果 target.Processor 对象有较长的类标识符,您可以创建一个 target.Alias 对象,该对象可为 target.Processor 对象提供一个短标识符。

检索 target.Processor 对象。

proccesorObj = target.get("Processor", ...
  "Analog Devices-ADSP-CM40x (ARM Cortex-M)");

使用 target.create 函数创建 target.Alias 对象。

aliasProcessorObj = target.create("Alias");

使用 target.Alias 对象属性指定替代标识符和原始目标对象。

aliasProcessorObj.Name = "myShortName";
aliasProcessorObj.For = proccesorObj;

target.Alias 对象添加到内部数据库中。

objectsAdded = target.add(aliasProcessorObj);
target.add summary:

    Objects added to internal database for current MATLAB session:
        target.Alias        "myShortName"
    1 object not added because they already exist.

要检索原始 target.Processor 对象,请输入:

target.get("Processor","myShortName");

要从内部数据库中删除对象,请输入:

target.remove(objectsAdded)
target.remove summary:

    Objects removed from internal database:
        target.Alias    "myShortName"

升级硬件设备的数据定义

要升级通过 rtwTargetInfo.m 文件或 sl_customization.m 文件指定的现有硬件设备定义(仅适用于 Simulink® Coder™ 和 Embedded Coder®),请使用 target.upgrade 函数。

rtwTargetInfo.m 文件

假设您在 rtwTargetInfo.m 文件中有硬件设备定义:

function rtwTargetInfo(tr)
    % Add registration function handle to the Target Registry
    tr.registerTargetInfo(@loc_register_hardware);
end
  
function hw = loc_register_hardware
    hw = RTW.HWDeviceRegistry;
    hw.Vendor = 'MyManufacturer';
    hw.Type = 'MyDevice';
    hw.Alias = {};
    hw.Platform = {'Prod', 'Target'};
    hw.setWordSizes([8 16 32 64 64 64 64 64 64 64 64]);
    hw.Endianess = 'Little';
    hw.IntDivRoundTo = 'Zero';
    hw.ShiftRightIntArith = true;
    hw.LargestAtomicInteger = 'Long';
    hw.LargestAtomicFloat = 'Double';
end

要升级该文件中包含的数据定义,请输入:

target.upgrade("rtwTargetInfo","myPathTo/rtwTargetInfo.m");

在当前文件夹中,该函数会创建此 registerUpgradedTargets.m 文件:

function processor = registerUpgradedTargets(varargin)
% This function was generated using target data export.
  
    % Create target.LanguageImplementation 'MyManufacturer-MyDevice'
    languageimplementation = target.create('LanguageImplementation');
    languageimplementation.AtomicFloatSize = 64;
    languageimplementation.AtomicIntegerSize = 64;
    languageimplementation.DataTypes.Char.Size = 8;
    languageimplementation.DataTypes.Double.Size = 64;
    languageimplementation.DataTypes.Float.Size = 64;
    languageimplementation.DataTypes.Half.IsSupported = false;
    languageimplementation.DataTypes.Half.Size = 16;
    languageimplementation.DataTypes.Int.Size = 32;
    languageimplementation.DataTypes.Long.Size = 64;
    languageimplementation.DataTypes.LongLong.IsSupported = false;
    languageimplementation.DataTypes.LongLong.Size = 64;
    languageimplementation.DataTypes.Pointer.Size = 64;
    languageimplementation.DataTypes.PtrDiffT.Size = 64;
    languageimplementation.DataTypes.Short.Size = 16;
    languageimplementation.DataTypes.SizeT.Size = 64;
    languageimplementation.Name = 'MyManufacturer-MyDevice';
    languageimplementation.WordSize = 64;
  
    % Create target.Processor 'MyManufacturer-MyDevice'
    processor = target.create('Processor');
    processor.LanguageImplementations(1) = languageimplementation;
    processor.Manufacturer = 'MyManufacturer';
    processor.Name = 'MyDevice';
  
    % Add the target objects to MATLAB memory
    target.add(processor, varargin{:});
end

要向 MATLAB® 注册该硬件设备,请输入:

registerUpgradedTargets()

如果希望该注册在各 MATLAB 会话之间持久保留,请输入:

registerUpgradedTargets(UserInstall=true)

sl_customization.m 文件(仅适用于 Simulink Coder 和 Embedded Coder)

假设您在一个 sl_customization.m 文件中有多个硬件设备定义:

function sl_customization(cm)
  % sl_customization function to register a device
  % vendor and type with Simulink.
  % Copy or rename this file to sl_customization.m.
  cm.registerTargetInfo(@loc_register_device);
  cm.registerTargetInfo(@loc_register_device2);
  cm.registerTargetInfo(@loc_createConfig);
     
  cm.registerTargetInfo(@locRegisterTfl);
  cm.CodeCoverageTools.add('DummyCoverageToolForTesting',...
                           'HDummyCovTool',...
                           'A Coverage Tool Vendor');
end
 
function thisDev = loc_register_device
  thisDev = RTW.HWDeviceRegistry;
  thisDev.Vendor = '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
 
function thisDev = loc_register_device2
  thisDev = RTW.HWDeviceRegistry;
  thisDev.Vendor = 'MyDevVendor';
  thisDev.Type = 'MyDevType2';
  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
 
% local function
function config = loc_createConfig
  config = rtw.connectivity.ConfigRegistry;
  config.ConfigName = 'Infineon->C16x, XC16x';
  config.ConfigClass = 'pil_slcust.HostDemoConfig1';
  config.SystemTargetFile = {'custom_target.tlc'};
  config.TemplateMakefile = {'custom_target.tmf'};
  config.TargetHWDeviceType = {'Infineon->C16x, XC16x'};
end
 
function thisTfl = locRegisterTfl
  thisTfl(1) = RTW.TflRegistry;
  thisTfl(1).Name = 'myTFL1';
  thisTfl(1).Description = 'Test';
  thisTfl(1).TableList = {'tfl_table_Sum',...
                          'tfl_table_Product',...
                         }; % Sum includes Add and Subtract
  thisTfl(1).BaseTfl = 'ANSI_C';
  thisTfl(1).TargetHWDeviceType = {'*'};
end

要升级该文件中的 RTW.HWDeviceRegistry 数据定义,请输入:

target.upgrade("sl_customization","myPathTo/sl_customization.m")

在当前文件夹中,该函数会创建此 registerUpgradedTargets.m 文件:

function targetObjects = registerUpgradedTargets(varargin)
% This function was generated using target data export.
 
    % Create target.LanguageImplementation 'MyDevVendor-MyDevType'
    languageimplementation = target.create('LanguageImplementation');
    languageimplementation.AtomicIntegerSize = 8;
    languageimplementation.DataTypes.Char.Size = 8;
    languageimplementation.DataTypes.Double.Size = 64;
    languageimplementation.DataTypes.Float.Size = 32;
    languageimplementation.DataTypes.Half.IsSupported = false;
    languageimplementation.DataTypes.Half.Size = 16;
    languageimplementation.DataTypes.Int.Size = 32;
    languageimplementation.DataTypes.Long.Size = 32;
    languageimplementation.DataTypes.LongLong.IsSupported = false;
    languageimplementation.DataTypes.LongLong.Size = 64;
    languageimplementation.DataTypes.Pointer.Size = 32;
    languageimplementation.DataTypes.PtrDiffT.Size = 32;
    languageimplementation.DataTypes.Short.Size = 16;
    languageimplementation.DataTypes.SizeT.Size = 32;
    languageimplementation.Endianess = target.Endianess.Unspecified;
    languageimplementation.Name = 'MyDevVendor-MyDevType';
    languageimplementation.WordSize = 32;
 
    % Create target.Processor 'MyDevVendor-MyDevType'
    processor = target.create('Processor');
    processor.LanguageImplementations(1) = languageimplementation;
    processor.Manufacturer = 'MyDevVendor';
    processor.Name = 'MyDevType';
 
    % Create target.LanguageImplementation 'MyDevVendor-MyDevType2'
    languageimplementation2 = target.create('LanguageImplementation');
    languageimplementation2.AtomicIntegerSize = 8;
    languageimplementation2.DataTypes.Char.Size = 8;
    languageimplementation2.DataTypes.Double.Size = 64;
    languageimplementation2.DataTypes.Float.Size = 32;
    languageimplementation2.DataTypes.Half.IsSupported = false;
    languageimplementation2.DataTypes.Half.Size = 16;
    languageimplementation2.DataTypes.Int.Size = 32;
    languageimplementation2.DataTypes.Long.Size = 32;
    languageimplementation2.DataTypes.LongLong.IsSupported = false;
    languageimplementation2.DataTypes.LongLong.Size = 64;
    languageimplementation2.DataTypes.Pointer.Size = 32;
    languageimplementation2.DataTypes.PtrDiffT.Size = 32;
    languageimplementation2.DataTypes.Short.Size = 16;
    languageimplementation2.DataTypes.SizeT.Size = 32;
    languageimplementation2.Endianess = target.Endianess.Unspecified;
    languageimplementation2.Name = 'MyDevVendor-MyDevType2';
    languageimplementation2.WordSize = 32;
 
    % Create target.Processor 'MyDevVendor-MyDevType2'
    processor2 = target.create('Processor');
    processor2.LanguageImplementations(1) = languageimplementation2;
    processor2.Manufacturer = 'MyDevVendor';
    processor2.Name = 'MyDevType2';
 
    targetObjects = [processor, processor2];
 
    % Add the target objects to MATLAB memory
    target.add(targetObjects, varargin{:});
end

要向 MATLAB 注册硬件设备定义,请输入:

registerUpgradedTargets()

如果希望该注册在各 MATLAB 会话之间持久保留,请输入:

registerUpgradedTargets(UserInstall=true)

另请参阅

| | | |

主题