exponenta event banner

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

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

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

Интерактивный и программный подходы следуют следующим 8 шагам:

  1. Откройте среду.

  2. Создайте таблицу.

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

  4. Создание параметров записи.

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

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

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

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

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

  1. Откройте среду.

    Для интерактивного создания библиотеки замены кода откройте инструмент замены кода (crtool) из командной строки MATLAB с помощью команды:

    >> crtool 
  2. Создайте таблицу.

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

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

    1. В меню crtool выберите Файл > Новая таблица.

    2. На правой панели присвойте таблице имя и нажмите кнопку Применить.

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

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

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

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

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

    • Щелкните таблицу правой кнопкой мыши и выберите Создать запись > Тип записи.

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

  4. Создание параметров записи.

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

    Для создания параметров записи:

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

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

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

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

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

    • В подразделе «Концептуальная функция» или «Концептуальная операция» crtool укажите входные и выходные аргументы функции, которую требуется заменить генератором кода.

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

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

    Для определения представления внедрения:

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

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

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

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

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

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

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

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

    • В меню crtool выберите «Файл» > «Сохранить таблицу» > «Сохранить».

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

  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. Вызовите соответствующую функцию ввода для создания записи в таблице.

    Тип функции, которую требуется заменитьФункция ввода
    Математическая операция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).

      Тип функции, которую требуется заменитьФункция «Задать параметры»
      Математическая операция, операция BLAS, операция CBLAS, Фиксированная точка, Чистая Наклонная Фиксированная точка, таможенная операция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. Создайте концептуальное представление.

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

    Обязательные свойства:

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

    • Тип ввода-вывода - определяется как 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. Укажите сведения о построении.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Задать свойство записи 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 выберите «Файл» > «Сохранить».

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

      >> hTable = code_replacement_library_table()

Связанные темы