Main Content

注册新硬件设备

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

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

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

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

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

为新设备指定硬件实现

要注册新硬件设备,请执行以下操作:

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

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

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

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

  3. 指定语言实现详细信息。

    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;

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

    myProc.LanguageImplementations = myLanguageImplementation;
    

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

    objectsAdded = target.add(myProc);

硬件实现窗格中,您现在可以将设备供应商设备类型分别设置为 MyManufacturerMyProcessor

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

默认情况下,当您将目标对象添加到内部数据库时,目标数据仅可用于当前 MATLAB 会话。您可以指定是否在各 MATLAB 会话之间持久保留目标数据。

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

    myProc = target.create('Processor', ...
                           'Name', 'MyProcessor', ...
                           'Manufacturer', 'MyManufacturer');
    
    existingImplementation = target.get('LanguageImplementation', ... 
                                        'ARM Compatible-ARM Cortex'); 
    myProc.LanguageImplementations = existingImplementation;

  2. target.Processor 对象添加到一个内部数据库,并指定是否在各 MATLAB 会话之间持久保留目标数据。

    objectsAdded = target.add(myProc, 'UserInstall', true);
    如果您随后修改 MATLAB 工作区中的对象,然后要更新内部数据库中的对象,则可以使用 target.update 函数。

  3. 您可以从内部数据库中删除该对象。

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

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

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

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

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

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

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

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

    myCopiedImplementation.Endianess = target.Endianess.Big;

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

    myProc.LanguageImplementations = myCopiedImplementation;

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

    objectsAdded = target.add(myProc);

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

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

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

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

  2. 通过使用设备供应商的标识符和类型检索现有实现,例如 'ARM Compatible-ARM Cortex'

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

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

    myProc.LanguageImplementations = existingImplementation;

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

    objectsAdded = target.add(myProc);

验证硬件设备数据

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

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

myProcessor = target.create('Processor');
myProcessor.LanguageImplementations = target.get('LanguageImplementation', ...
                                                 'ARM Compatible-ARM Cortex');
要验证创建的对象,请运行 myProcessor.IsValidmyProcessor.validate()
myProcessor.IsValid
ans =
  logical
  0
myProcessor.validate()
Error using target.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
该对象的有效性已建立。

注意

当您使用 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.export(myProc, 'FileName', 'exportMyProcFunction')
target.export 函数在当前工作文件夹中创建 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{:});
现在,您可以使用生成的函数跨计算机和用户共享数据库中的硬件设备数据了。例如,在另一台计算机上运行以下命令。
objectsAdded = exportMyProcFunction;
生成的函数会重新创建 target.Processor 对象 MyManufacturer-MyProcessor,并将其添加到内部数据库中。

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

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

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

  1. 检索 target.Processor 对象。

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

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

    aliasProcessorObj = target.create('Alias');

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

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

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

    target.add(aliasProcessorObj);
  5. 要检索原始 target.Processor 对象,请运行:

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

升级硬件设备的数据定义

要升级通过 rtwTargetInfo.msl_customization.m 文件指定的现有硬件设备定义,请使用 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 文件

假设您在一个 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)

另请参阅

|

相关主题