Регистрация новых аппаратных устройств

На панели Hardware Implementation можно задать параметры, которые описывают свойства целевого компьютера и компилятора для MATLAB® программное обеспечение, которое позволяет:

  • Наблюдайте целевой компьютер во время симуляций модели.

  • Сгенерируйте оптимизированный код для производственного или тестового оборудования.

  • Непосредственно тестируйте или развертывайте сгенерированный код на целевом компьютере.

Панель Hardware Implementation поддерживает область значений целевых компьютеров. Чтобы расширить область значений, зарегистрируйте новые аппаратные устройства с помощью target.Processor и target.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);

На панели Hardware Implementation теперь можно задать Device vendor и Device type MyManufacturer и MyProcessor соответственно.

Задайте аппаратную реализацию, которая сохраняется во время сеансов работы с 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);

  3. Можно удалить объект из внутренней базы данных.

    target.remove(objectsAdded);

Создайте аппаратную реализацию путем изменения существующей реализации

Если существующая аппаратная реализация содержит большинство значений, которые вы хотите получить в новой аппаратной реализации, можно быстро создать новую реализацию, создав и изменив копию существующей реализации.

  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);

Валидация данных аппаратных устройств

Чтобы подтвердить целостность данных целевых объектов, используйте IsValid свойство или validate метод target.Object базовый класс.

Рассмотрим пример, где вы создаете target.Processor и связать существующую языковую реализацию с объектом.

myProcessor = target.create('Processor');
myProcessor.LanguageImplementations = target.get('LanguageImplementation', ...
                                                 'ARM Compatible-ARM Cortex');
Чтобы подтвердить созданный объект, запустите myProcessor.IsValid или myProcessor.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')
The 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 класс.

Для примера, если a 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.m или sl_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)

См. также

|

Похожие темы