Определите оптимизацию библиотеки замещения кода

Библиотека замещения кода содержит одну или несколько таблиц замещения кода. Каждая таблица содержит одну или несколько записей замещения кода. Каждая запись содержит параметры отображения и ввода. Запись сопоставляет концептуальное представление автоматически сгенерированных функций MATLAB или Simulink с реализацией оптимизированной функции C или C++. Параметры входа описывают дополнительные свойства для генератора кода, которые должны учитываться во время замены кода.

Чтобы определить библиотеку замещения кода, сначала задайте таблицы замещения кода в файле индивидуальной настройки. Затем на этапе регистрации создайте библиотеку замещения кода путем выбора таблиц для включения в библиотеку. Таблицы замещения кода можно задать как в интерактивном режиме, так и программно, используя один и тот же рабочий процесс.

Оба интерактивных и программных подхода следуют этим 8 шагам:

  1. Откройте окружение.

  2. Составьте таблицу.

  3. Создайте запись.

  4. Создайте параметры входа.

  5. Создайте концептуальное представление.

  6. Создайте представление реализации.

  7. Укажите сведения о сборке.

  8. Проверьте и сохраните.

Интерактивная разработка библиотеки замещения кода

  1. Откройте окружение.

    Чтобы в интерактивном режиме создать библиотеку замещения кода, откройте Code Replacement Tool (crtool) из командной строки MATLAB с помощью команды:

    >> crtool 
  2. Составьте таблицу.

    Таблица замещения кода организует записи замещения кода в группы, которыми легче управлять.

    Чтобы создать таблицу замещения кода:

    1. В меню crtool выберите File > New table.

    2. На правой панели назовите таблицу и нажатие кнопки Apply.

  3. Создайте запись.

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

    Чтобы создать запись замены кода, используйте один из следующих методов:

    • На панели инструментов crtool щелкните значок entry-type, чтобы выбрать entry-type.

    • В меню crtool выберите File > New entry > entry-type.

    • Щелкните правой кнопкой мыши по таблице и выберите New entry > entry-type.

    Новая запись появится без имени на средней панели.

  4. Создайте параметры входа.

    Параметры входа задают требования к оптимизации и сборке для генератора кода, чтобы соответствовать во время замены кода. Эти параметры варьируются и автоматически появляются в различных разделах интерфейса crtool в зависимости от типа замены функции.

    Чтобы создать параметры входа:

    • В раскрывающемся Function или Operation списке выберите имя функции, которую вы хотите заменить.

    Этот выбор определяет параметры входа, которые появляются в crtool.

  5. Создайте концептуальное представление.

    Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. Концептуальное представление состоит из имени функции, возвращаемых аргументов и параметров. Возвращаемые аргументы называются выходными аргументами, а параметры - входными параметрами. Задайте каждый концептуальный аргумент с именем, типом ввода-вывода и, в зависимости от типа замены, другими свойствами, которые появляются в crtool.

    Чтобы определить свое концептуальное представление:

    • В Conceptual Function или Conceptual Operation подразделе crtool задайте входной и выходной аргументы функции, которую вы хотите заменить генератору кода.

  6. Создайте представление реализации.

    Представление реализации описывает сигнатуру функции замены, заданную в библиотеке замены кода. Представление реализации состоит из имени функции, возвращаемых аргументов и параметров. Задайте каждый аргумент реализации с типом, определителем типа и сложностью.

    Чтобы определить представление реализации:

    • В Implementation Function или Operation Function подразделе crtool задайте входной и выходной аргументы для оптимизированной функции, заданной в библиотеке замены кода.

  7. Укажите сведения о сборке.

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

    Чтобы задать информацию о сборке:

    • В crtool перейдите на вкладку Build Information, чтобы открыть панель Requirements к сборке. Укажите необходимую информацию о сборке в этих полях:

    ПараметрОписание
    Файл заголовка реализацииИмя файла заголовка, необходимого для замены кода.
    Исходный файл реализацииИмя исходного файла, необходимого для замены кода.
    Дополнительные файлы заголовков/включить путиИмя и путь дополнительных заголовочных файлов, необходимых для замены кода.
    Дополнительные исходные файлы/путиИмя и путь дополнительных исходных файлов, необходимых для замены кода.
    Дополнительные файлы объектовИмя и путь дополнительных файлов объектов, необходимых для замены кода.
    Дополнительные флаги ссылкиФлаги, необходимые линкеру для генерации исполняемого файла для кода замены.
    Дополнительные флаги компиляцииФлаги, необходимые компилятору для генерации объектного кода для кода замены.
    Скопируйте файлы в директорию сборкиФлаги, копировать ли заголовки, исходные файлы или файлы объектов, которые требуются для генерации кода замены, в папку сборки перед генерацией кода. Если вы задаете файлы с дополнительными файлами заголовка/включая пути или Дополнительные исходные файлы/пути и копируете файлы, компилятор и утилиты, такие как packNGo, могут найти повторяющиеся образцы файлов.
  8. Проверьте и сохраните.

    Сохраните библиотеку замещения кода с таким же именем, как и таблицу замещения кода, в пути MATLAB. Сохранение библиотеки автоматически проверяет невалидированное содержимое.

    Чтобы проверить и сохранить библиотеку:

    • В меню crtool выберите File > Save Table > Save.

Программно разрабатывайте библиотеку замещения кода

  1. Откройте окружение.

    Чтобы программно создать библиотеку замещения кода, откройте файл функции MATLAB. В меню MATLAB выберите New > Function.

  2. Составьте таблицу.

    Таблица замещения кода организует записи замещения кода в группы, которыми легче управлять.

    Чтобы создать таблицу замещения кода:

    1. Создайте функцию, которую можно использовать для вызова таблицы библиотеки замещения кода. Функция не должна иметь аргументов и возвращать объект таблицы.

    2. Создайте объект таблицы с вызовом RTW.TflTable.

    function hTable = code_replacement_library_table()
    % Create a function to call code replacement library table
    
    %% Create a code replacement library table object
    hTable = RTW.TflTable;
     
    end
    
  3. Создайте запись.

    Запись таблицы замещения кода содержит параметры входа и отображение концептуального представления сгенерированной функции с реализацией представления оптимизированной реализации этой функции.

    Чтобы создать таблицу замещения кода:

    1. Определите тип функции, которую вы хотите заменить.

    2. Вызовите соответствующую функцию Entry Function, чтобы создать запись в таблице.

    Тип функции, которую вы хотите заменитьФункция ввода
    Математическая операцияRTW.TflCOperationEntry
    ФункцияRTW.TflCFunctionEntry
    Операция BLASRTW.TflBlasEntryGenerator
    Операция CBLASRTW.TflCBlasEntryGenerator
    Операции сложения и вычитания с фиксированной точкойRTW.TflCOperationEntryGenerator
    Операция с фиксированной точкой сетевого откосаRTW.TflCOperationEntryGenerator_NetSlope
    Семафор или мьютексRTW.TflCSemaphoreEntry
    Пользовательская функцияRTW.TflCFunctionEntryML
    Настраиваемая операция RTW.TflCOperationEntryML
    function hTable = code_replacement_library_table()
    % Create a function to call code replacement library table
    
    %% Create a code replacement library table object
    hTable = RTW.TflTable;
    
    %% Create a code replacement library entry
    % Pick one from list below
    hEntry = RTW.TFLCOperationEntry;
    hEntry = RTW.TflCFunctionEntry;
    hEntry = RTW.TflBlasEntryGenerator;
    hEntry = RTW.TflCBlasEntryGenerator;
    hEntry = RTW.TflCOperationEntryGenerator;
    hEntry = RTW.TflCOperationEntryGenerator_NetSlope;
    hEntry = RTW.TflCSemaphoreEntry;
    hEntry = RTW.TflCFunctionEntryML;
    hEntry = RTW.TflCOperationEntryML;
    
    end
    
  4. Создайте параметры входа.

    Параметры входа задают требования к оптимизации и сборке для генератора кода, чтобы соответствовать во время замены кода. Эти параметры варьируются в зависимости от типа замены функции.

    Чтобы создать параметры входа:

    • Вызовите функцию Set Parameters, которая соответствует типу функции, которую вы хотите заменить, идентифицированному на предыдущем шаге (шаг 3).

      Тип функции, которую вы хотите заменитьУстановите функцию Parameters
      Математическая операция, операция BLAS, операция CBLAS, Fixed-Point, Net Slope Fixed-Point, Пользовательская операцияsetTflCOperationEntryParameters
      Функция, Пользовательская функцияsetTflCFunctionEntryParameters
      Семафор или МутексsetTflCSemaphoreEntryParameters

      Каждая функция Set Parameter показана со всеми доступными свойствами, установленными на их значения по умолчанию. Точные свойства и значения, которые вам нужно задать, зависят от функции, которую вы заменяете. Подробные сведения о замене см. в примерах.

      function hTable = code_replacement_library_table()
      % Create a function to call code replacement library table
      
      %% Create a code replacement library table object
      hTable = RTW.TflTable;
      
      %% Create a code replacement library entry
      % Pick one from list below
      hEntry = RTW.TFLCOperationEntry;
      hEntry = RTW.TflCFunctionEntry;
      hEntry = RTW.TflBlasEntryGenerator;
      hEntry = RTW.TflCBlasEntryGenerator;
      hEntry = RTW.TflCOperationEntryGenerator;
      hEntry = RTW.TflCOperationEntryGenerator_NetSlope;
      hEntry = RTW.TflCSemaphoreEntry;
      hEntry = RTW.TflCFunctionEntryML;
      hEntry = RTW.TflCOperationEntryML;
      
      %% Create entry parameters
      % Pick one from list below
      hEntry.setTflCOperationEntryParameters(...        
              'Key',                          ' ', ...
              'Priority',                     100, ...
              'AcceptExprInput',              true, ...
              'AdditionalHeaderFiles',        {}, ...
              'AdditionalIncludePaths',       {}, ...
              'AdditionalLinkObjs',           {}, ...
              'AdditionalLinkObjsPaths',      {}, ...
              'AdditionalSourceFiles',        {}, ...
              'AdditionalSourcePaths',        {}, ...
              'AdditionalCompileFlags',       {}, ...
              'AdditionalLinkFlags',          {}, ...
              'AllowShapeAgnostic',           false, ...
              'ArrayLayout',                  'COLUMN_MAJOR', ...
              'EntryInfoAlgorithm',           'RTW_CAST_BEFORE_OP', ...
              'GenCallback',                  ' ', ...
              'ImplementationHeaderFile',     ' ', ...
              'ImplementationHeaderPath',     ' ', ...
              'ImplementationName',           ' ', ...
              'ImplementationSourceFile',     ' ', ...
              'ImplementationSourcePath',     ' ', ...
              'ImplType',                     'FCN_IMPL_FUNCT', ...
              'MustHaveZeroNetBias',          false, ...
              'NetFixedExponet',              0, ...
              'NetAdjustmentFactor', 1,       ...
              'RoundingModes',                'RTW_ROUND_UNSPECIFIED', ...
              'SaturationMode',               'RTW_SATURATE_UNSPECIFIED', ...
              'SideEffects',                  false, ...
              'SlopesMustBeTheSame',          false, ...
              'StoreFcnReturnInLocalVar',     false);
          
      hEntry.setTflCFunctionEntryParameters(...
              'Key',                          ' ', ...
              'Priority',                     100, ...
              'AcceptExprInput',              true, ...
              'AdditionalHeaderFiles',        {}, ...
              'AdditionalIncludePaths',       {}, ...
              'AdditionalLinkObjs',           {}, ...
              'AdditionalLinkObjsPaths',      {}, ...
              'AdditionalSourceFiles',        {}, ...
              'AdditionalSourcePaths',        {}, ...
              'AdditionalCompileFlags',       {}, ...
              'AdditionalLinkFlags',          {}, ...
              'ArrayLayout',                  'COLUMN_MAJOR', ...
              'EntryInfoAlgorithm',           'RTW_DEFAULT', ...
              'GenCallback',                  ' ', ...
              'ImplementationHeaderFile',     ' ', ...
              'ImplementationHeaderPath',     ' ', ...
              'ImplementationName',           ' ', ...
              'ImplementationSourceFile',     ' ', ...
              'ImplementationSourcePath',     ' ', ...
              'ImplType',                     'FCN_IMPL_FUNCT', ...
              'RoundingModes',                'RTW_ROUND_UNSPECIFIED', ...
              'SaturationMode',               'RTW_SATURATE_UNSPECIFIED', ...
              'SideEffects',                  false, ...
              'StoreFcnReturnInLocalVar',     false);
          
      hEntry.setTflCSemaphoreEntryParameters(...       
              'Key',                          ' ', ...
              'Priority',                     100, ...
              'AcceptExprInput',              true, ...
              'AdditionalHeaderFiles',        {}, ...
              'AdditionalIncludePaths',       {}, ...
              'AdditionalLinkObjs',           {}, ...
              'AdditionalLinkObjsPaths',      {}, ...
              'AdditionalSourceFiles',        {}, ...
              'AdditionalSourcePaths',        {}, ...
              'AdditionalCompileFlags',       {}, ...
              'AdditionalLinkFlags',          {}, ....
              'GenCallback',                  ' ', ...
              'ImplementationHeaderFile',     ' ', ...
              'ImplementationHeaderPath',     ' ', ...
              'ImplementationName',           ' ', ...
              'ImplementationSourceFile',     ' ', ...
              'ImplementationSourcePath',     ' ', ...
              'ImplType',                     'FCN_IMPL_FUNCT', ...
              'RoundingModes',                'RTW_ROUND_UNSPECIFIED', ...
              'SaturationMode',               'RTW_SATURATE_UNSPECIFIED', ...
              'SideEffects',                  false, ...
              'StoreFcnReturnInLocalVar',     false);
       
      end
      
  5. Создайте концептуальное представление.

    Концептуальное представление описывает сигнатуру функции, которую вы хотите заменить. Он состоит из имени функции, возвращаемых аргументов и параметров. Возвращаемые аргументы называются выходными аргументами, а параметры - входными параметрами. Задайте каждый концептуальный аргумент с необходимыми свойствами и, в зависимости от типа замены, другие необязательные свойства.

    Необходимые свойства:

    • Name - Определяется как y1.. yn для выходных аргументов и u1.. un для входных параметров

    • I/O type - Определяется как RTW_IO_OUTPUT или RTW_IO_INPUT

    Чтобы определить свое концептуальное представление, используйте один из следующих подходов:

    ПодходФункцияЦель
    1createAndAddConceptualArg

    Индивидуальная настройка и управление.

    Если вы хотите явным образом задать аргументы как скаляры или матрицы и другие свойства.

    2getTflArgFromString

    Быстрое прототипирование.

    Если вы хотите быстро задать аргументы со встроенными типами данных.

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

    function hTable = code_replacement_library_table()
    % Create a function to call code replacement library table
    
    %% Create a code replacement library table object
    hTable = RTW.TflTable;
    
    %% Create a code replacement library entry
    % Pick one from list below
    hEntry = RTW.TFLCOperationEntry;
    hEntry = RTW.TflCFunctionEntry;
    hEntry = RTW.TflBlasEntryGenerator;
    hEntry = RTW.TflCBlasEntryGenerator;
    hEntry = RTW.TflCOperationEntryGenerator;
    hEntry = RTW.TflCOperationEntryGenerator_NetSlope;
    hEntry = RTW.TflCSemaphoreEntry;
    hEntry = RTW.TflCFunctionEntryML;
    hEntry = RTW.TflCOperationEntryML;
    
    %% Create entry parameters
    % Pick one from list below
    % To view properties, see step 4 
    hEntry.setTflCOperationEntryParameters( );
    hEntry.setTflCFunctionEntryParameters( );
    hEntry.setTflCSemaphoreEntryParameters( );
    
    %% Create the conceptual representation
    
    % Approach 1: createAndAddConceptualArg
    % arg = createAndAddConceptualArg(hEntry, argType, varargin)
    % argType - 'RTW.TflArgNumeric' | 'RTW.TflArgMatrix'
    % varargin - 'name', 'value' pairs shown below set to default values,
    % includes name and I/O type
    
    % Define Output Arguments
    hEntry.createAndAddConceptualArg(...
            'RTW.TflArgNumeric',            ...
            'Name',                         'y1', ... 
            'IOType',                       'RTW_IO_OUTPUT', ... 
            'IsSigned',                     true, ...
            'WordLength',                   32, ...
            'CheckSlope',                   true, ...
            'CheckBias',                    true, ...
            'DataTypeMode',                 'Fixed-point:binary point scaling', ...
            'DataType',                     'Fixed', ...
            'Scaling',                      'BinaryPoint', ...
            'Slope',                        1, ...
            'SlopeAdjustmentFactor',        1.0, ...
            'FixedExponent',                -15, ...
            'Bias',                         0.0, ...
            'FractionLength',               15, ...
            'BaseType',                     'double', ...
            'DimRange',                     [2,2]);
    
    % Define Input Arguments
    hEntry.createAndAddConceptualArg(...
            'RTW.TflArgNumeric',            ...
            'Name',                         'u1', ...
            'IOType',                       'RTW_IO_OUTPUT', ...
            'IsSigned',                     true, ...
            'WordLength',                   32, ...
            'CheckSlope',                   true, ...
            'CheckBias',                    true, ...
            'DataTypeMode',                 'Fixed-point:binary point scaling', ...
            'DataType',                     'Fixed', ...
            'Scaling',                      'BinaryPoint', ...
            'Slope',                        1, ...
            'SlopeAdjustmentFactor',        1.0, ...
            'FixedExponent',                -15, ...
            'Bias',                         0.0, ...
            'FractionLength',               15, ...
            'BaseType',                     'double', ...
            'DimRange',                     [2,2]);
    
    
    % Approach 2: getTflArgFromString
    % arg = getTflArgFromString(hEntry, name, I/O type)
    % name- y1..yn | u1..un
    % I/O type- RTW_IO_OUTPUT | RTW_IO_INPUT
    
    % Define Output Arguments
    arg = getTflArgFromString('y1', 'double');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEntry.addConceptualArg(arg);
    
    % Define Input Arguments
    arg = getTflArgFromString('u1', 'double');
    arg.IOType = 'RTW_IO_INPUT';
    hEntry.addConceptualArg(arg);
    
    end
    
  6. Создайте представление реализации.

    Представление реализации описывает сигнатуру функции замены, заданную библиотекой замены кода. Он состоит из имени функции, возвращаемых аргументов и параметров. Задайте аргументы реализации с типом, определителем типа и сложностью. После определения представления реализации добавьте завершенную запись в таблицу замещения кода с вызовом функции addEntry.

    Чтобы определить представление реализации, используйте один из следующих подходов:

    ПодходФункцияЦель
    1copyConceptualArgsToImplementation

    Идентичные аргументы.

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

    2createAndAddImplementationArg createAndSetCImplementationReturn

    Тот же порядок, другие свойства.

    Задайте, что аргументы реализации имеют тот же порядок, что и концептуальные аргументы, но имеют другие свойства.

    3getTflArgFromString

    Добавьте постоянное значение.

    Задайте аргументы реализации с постоянным значением.

    4getTflDWorkFromString

    Замена Mutex/Semaphore.

    Задайте аргументы реализации для функций mutex или semaphore.

    5createCRLEntry

    Создайте запись с одной функцией.

    Объявите и задайте запись таблицы замещения кода (концептуальные аргументы и аргументы реализации) в одной функции.

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

    function hTable = code_replacement_library_table()
    % Create a function to call code replacement library table
    
    %% Create a code replacement library table object
    hTable = RTW.TflTable;
    
    %% Create a code replacement library entry
    % Pick one from list below
    hEntry = RTW.TFLCOperationEntry;
    hEntry = RTW.TflCFunctionEntry;
    hEntry = RTW.TflBlasEntryGenerator;
    hEntry = RTW.TflCBlasEntryGenerator;
    hEntry = RTW.TflCOperationEntryGenerator;
    hEntry = RTW.TflCOperationEntryGenerator_NetSlope;
    hEntry = RTW.TflCSemaphoreEntry;
    hEntry = RTW.TflCFunctionEntryML;
    hEntry = RTW.TflCOperationEntryML;
    
    %% Create entry parameters
    % Pick one from list below
    % To view properties, see step 4
    hEntry.setTflCOperationEntryParameters( );
    hEntry.setTflCFunctionEntryParameters( );
    hEntry.setTflCSemaphoreEntryParameters( );
    
    %% Create the conceptual representation
    
    % Approach 1: createAndAddConceptualArg
    % arg = createAndAddConceptualArg(hEntry, argType, varargin)
    % argType - 'RTW.TflArgNumeric' | 'RTW.TflArgMatrix'
    % varargin - 'name', 'value' pairs shown below set to default values,
    % includes name and I/O type, to view properties, see step 5
    
    % Define Output Arguments
    hEntry.createAndAddConceptualArg( );
    
    % Define Input Arguments
    hEntry.createAndAddConceptualArg( );
    
    
    
    % Approach 2: getTflArgFromString
    % arg = getTflArgFromString(hEntry, name, I/O type)
    % name- y1..yn | u1..un
    % I/O type- RTW_IO_OUTPUT | RTW_IO_INPUT
    
    % Define Output Arguments
    arg = getTflArgFromString('y1', 'double');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEntry.addConceptualArg(arg);
    
    % Define Input Arguments
    arg = getTflArgFromString('u1', 'double');
    arg.IOType = 'RTW_IO_INPUT';
    hEntry.addConceptualArg(arg);
    
    
    
    %% Create the implementation representation
    
    % Approach 1: copyConceptualArgsToImplementation
    copyConceptualArgsToImplementation(hEntry);
    
    
    % Approach 2: createAndSetCImplementation, createAndSetCImplementationArg
    % arg = createAndAddImplementation(hEntry, argType,varargin),
    % arg = createAndSetCImplementationReturn(hEntry, argType,varargin)
    % argType - 'RTW.TflArgNumeric' | 'RTW.TflArgMatrix'
    % varargin - 'name', 'value' pairs shown below set to default values,
    % includes name and I/O type
    
    % Define Output Arguments
    hEntry.createAndSetCImplementationReturn(...
            'RTW.TflArgNumeric',            ...
            'Name',                         'y1', ...
            'IOType',                       'RTW_IO_Output', ...
            'IsSigned',                     true, ...
            'WordLength',                   16, ...
            'DataTypeMode',                 'Fixed-point:binary point scaling', ...
            'DataType',                     'Fixed', ...
            'Scaling',                      'BinaryPoint', ...
            'Slope',                        1.0, ...
            'SlopeAdjustmentFactor',        1.0, ...
            'FixedExponent',                -15, ...
            'Bias',                         0.0, ...
            'FractionLength',               15, ...
            'Value',                        0);
        
    % Define Input Arguments
    hEntry.createAndAddImplementationArg(...
            'RTW.TflArgNumeric',            ...
            'Name',                         'y1', ...
            'IOType',                       'RTW_IO_Output', ...
            'IsSigned',                     true, ...
            'WordLength',                   16, ...
            'DataTypeMode',                 'Fixed-point:binary point scaling', ...
            'DataType',                     'Fixed', ...
            'Scaling',                      'BinaryPoint', ...
            'Slope',                        1.0, ...
            'SlopeAdjustmentFactor',        1.0, ...
            'FixedExponent',                -15, ...
            'Bias',                         0.0, ...
            'FractionLength',               15, ...
            'Value',                        0);
     
    
    
    % Approach 3: getTflArgFromString
    % arg = getTflArgFromString(hEntry, name, datatype)
    % name- y1..yn | u1..un, datatype - built-in data type
    
    % Define Output arguments
    arg = getTflArgFromString(hEntry, 'y1', 'double');
    arg.IOType = 'RTW_IO_OUTPUT';
    hEntry.Implementation.setReturn(arg);
    
    % Define Input arguments
    arg = getTflArgFromString(hEntry, 'u1', 'double', 0);
    hEntry.Implementation.addArgument(arg);
    
    
    
    % Approach 4: getTflDWorkFromString
    % arg = getTflDWorkFromString(hEntry, name, datatype)
    
    % Define arguments
    arg = getTflDWorkFromString('d1', 'void*');
    hEntry.addDWorkArg(arg);
    
    
    
    % Approach 5: createCRLEntry
    % tableEntry = createCRLEntry(crTable,conceptualSpecification,implementationSpecification)
    
    % Define code replacement conceptual and implementation arguments
    hEntry = createCRLEntry(...
            hTable, ...
            'conceptualSpecification', ...
            'implementationSpecification');
    
    
    %% Add code replacement library entry to table
    hTable.addEntry(hEntry);
    
    end
    
  7. Укажите сведения о сборке.

    Укажите сведения о сборке для библиотеки замещения кода. Информация о сборке предоставляет генератору кода файлы, необходимые для выполнения замены функции.

    Чтобы задать информацию о сборке:

    • Задайте параметры сборки в функции Entry Parameters, определенной на шаге 4, или с заданными функциями. Укажите сведения о сборке со следующими свойствами:

    ПараметрОписание

    Файл заголовка реализации

    Задайте свойства ImplementationHeaderFile и ImplementationHeaderPath.

    Имя файла заголовка, необходимого для замены кода.

    Исходный файл реализации

    Задайте свойства ImplementationSourceFile и ImplementationSourcePath.

    Имя исходного файла, необходимого для замены кода.

    Дополнительные файлы заголовков/включить пути

    Для каждого файла укажите имя файла и путь в вызовах функций addAdditionalHeaderFile и addAdditionalIncludePath.

    Имя и путь дополнительных заголовочных файлов, необходимых для замены кода.

    Дополнительные исходные файлы/пути

    Для каждого файла укажите имя файла и путь в вызовах функций addAdditionalSourceFile и addAdditionalSourcePath.

    Имя и путь дополнительных исходных файлов, необходимых для замены кода.

    Дополнительные файлы объектов

    Для каждого файла укажите имя файла и путь в вызовах функций addAdditionalLinkObj и addAdditionalLinkObjPath.

    Имя и путь дополнительных файлов объектов, необходимых для замены кода.

    Дополнительные флаги ссылки

    Установите свойство entry AdditionalLinkFlags в массив ячеек из векторов символов или строковых массивов, представляющий требуемые флаги компиляции.

    Флаги, необходимые линкеру для генерации исполняемого файла для кода замены.

    Дополнительные флаги компиляции

    Установите свойство entry AdditionalCompileFlags в массив ячеек из векторов символов или строковых массивов, представляющий требуемые флаги ссылок.

    Флаги, необходимые компилятору для генерации объектного кода для кода замены.

    Скопируйте файлы в директорию сборки.

    Установите GenCallback свойств на 'RTW.copyFileToBuildDir'.

    Если для записи таблицы происходит соответствие, вызов функции RTW.copyFileToBuildDir копирует необходимые файлы в папку сборки.

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

    Флаги, копировать ли заголовки, исходные файлы или файлы объектов, которые требуются для генерации кода замены, в папку сборки перед генерацией кода. Если вы задаете файлы с дополнительными файлами заголовка/включая пути или Дополнительные исходные файлы/пути и копируете файлы, компилятор и утилиты, такие как packNGo, могут найти повторяющиеся образцы файлов.
    • Если запись использует файлы заголовка, источника или объекта, рассмотрите, сделать ли файлы доступными для генератора кода. Можно скопировать файлы в папку сборки или указать имена отдельных файлов и пути явным образом.

    • Если вы задаете дополнительные файлы заголовков/включают пути или исходные файлы/пути и копируете файлы, компилятор и утилиты, такие как packNGo можно найти повторяющиеся образцы файлов (образец в папке сборки и образца в исходной папке).

    • Если вы принимаете решение скопировать файлы в папку сборки и используете packNGo функция для перемещения статических и сгенерированный код файлов в другую среду разработки:

      • В вызове на packNGo, задайте пару свойство-значение 'minimalHeaders' true (значение по умолчанию). Эта настройка предписывает функции включать минимальные заголовочные файлы, необходимые для создания кода в zip-файл.

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

    • Если вы используете интерфейс программирования, пути, которые вы задаете, могут включать лексемы. Лексема является переменной, заданной как вектор символов, массив ячеек из векторов символов или строковые массивы в MATLAB® рабочая область, которую вы заключаете в долларовые знаки ($ variable$). Генератор кода оценивает и заменяет лексему на заданное значение. Для примера рассмотрим путь $myfolder$\folder1, где myfolder - вектор символов или строковый скаляр переменная, заданная в рабочем пространстве MATLAB как 'd:\work\source\module1'. Генератор кода генерирует пользовательский путь следующим d:\work\source\module1\folder1.

  8. Проверьте и сохраните.

    Сохраните файл индивидуальной настройки библиотеки замещения кода с таким же именем, как и таблица библиотеки замещения кода, в пути MATLAB.

    Чтобы сохранить и проверить библиотеку:

    1. Сохраните файл. В меню MATLAB выберите File > Save.

    2. Проверьте библиотеку, вызвав ее из командной строки MATLAB. Для примера:

      >> hTable = code_replacement_library_table()

Похожие темы