exponenta event banner

Согласование данных для замены кода

Библиотеки замены кода могут выравнивать объекты данных, передаваемые в функцию замены, по заданной границе.

Согласование данных замены кода

При использовании MATLAB ® Coder™ можно воспользоваться преимуществами реализации функций, для которых требуются выровненные данные для оптимизации производительности приложений. Чтобы настроить выравнивание данных для реализации функции:

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

  2. Укажите возможности выравнивания данных и синтаксис для одного или нескольких компиляторов. Включить спецификации трассы в запись регистрации библиотеки в rtwTargetInfo.m файл. См. раздел Предоставление спецификаций выравнивания данных для компиляторов.

  3. Зарегистрируйте библиотеку, содержащую запись таблицы и объект спецификации трассы.

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

Примеры см. в разделе Базовый пример выравнивания данных замены кода и раздел «Выравнивание данных для реализаций функций» на странице примера «Оптимизация сгенерированного кода путем разработки и использования библиотек замены кода - Simulink ®».

Примечание

Если для замены, требующей выравнивания, используются импортированные данные (например, ввод-вывод функции точки входа или экспортированной функции), укажите выравнивание данных с помощью coder.dataAlignment операторов в коде MATLAB. Укажите выравнивание отдельно для каждого экземпляра импортированных данных. См. раздел Задание выравнивания данных в коде MATLAB для импортированных данных.

Определение требований к выравниванию данных для аргументов функции

Чтобы указать требование выравнивания данных для аргумента в записи замены кода:

  • При определении функции замены в файле регистрации таблицы замены кода создайте объект дескриптора аргумента (RTW.ArgumentDescriptor). Использовать его AlignmentBoundary свойство для задания требуемой границы трассы и назначения объекта аргументу Descriptor собственность.

  • При определении функции замены с помощью инструмента «Замена кода» на вкладке «Информация о сопоставлении» в разделе «Свойства аргумента» для функции замены введите значение параметра «Значение трассы».

AlignmentBoundary свойство (или параметр Alignment value) определяет границу выравнивания для данных, передаваемых аргументу функции, в количестве байт. AlignmentBoundary допустимо только для адресуемых объектов, включая аргументы матрицы и указателя. Он неприменим для аргументов значения. Допустимые значения:

  • -1 (по умолчанию) - если данные являются Simulink.Bus, Simulink.Signal, или Simulink.Parameter указывает, что генератор кода определяет оптимальное выравнивание на основе использования. В противном случае указывает, что для этого аргумента не требуется выравнивание.

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

Следующий код определяет AlignmentBoundary для аргумента 16 байт.

hLib = RTW.TflTable;
entry = RTW.TflCOperationEntry;
arg = getTflArgFromString(hLib, 'u1','single*');
desc = RTW.ArgumentDescriptor;
desc.AlignmentBoundary = 16;
arg.Descriptor = desc;
entry.Implementation.addArgument(arg);

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

Примечание

Если модель импортируется Simulink.Bus, Simulink.Parameter, или Simulink.Signal задайте границу трассы в свойствах объекта с помощью свойства «Трасса». Дополнительные сведения см. в разделе Simulink.Bus, Simulink.Parameter, и Simulink.Signal.

Предоставление спецификаций выравнивания данных для компиляторов

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

Описание возможностей выравнивания данных и синтаксиса компилятора:

  • При определении записи регистрации библиотеки замены кода в rtwTargetInfo.m файл адаптации, добавить один или несколько AlignmentSpecification объекты в RTW.DataAlignment объект. Присоедините RTW.DataAlignment объект для TargetCharacteristics объект записи реестра.

    RTW.DataAlignment объект также имеет свойство DefaultMallocAlignment, которая определяет границу выравнивания по умолчанию (в байтах), используемую компилятором для динамически выделяемой памяти. Если генератор кода использует динамическое выделение памяти для объекта данных, участвующего в замене кода, это значение определяет, удовлетворяет ли память требованию выравнивания замены. В противном случае генератор кода не использует замену. Значение по умолчанию для DefaultMallocAlignment является -1, указывая, что граница выравнивания по умолчанию, используемая для динамически выделяемой памяти, неизвестна. В этом случае генератор кода использует естественное выравнивание типа данных, чтобы определить, разрешить ли замену.

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

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

    Щелкните символ «плюс» (+), чтобы добавить дополнительные спецификации компилятора.

Для каждой спецификации выравнивания данных введите следующую информацию.

AlignmentSpecification СобственностьПараметр диалогового окнаОписание
AlignmentTypeТип трассы

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

  • DATA_ALIGNMENT_LOCAL_VAR - Локальные переменные.

  • DATA_ALIGNMENT_GLOBAL_VAR - глобальные переменные.

  • DATA_ALIGNMENT_STRUCT_FIELD - Отдельные поля структуры.

  • DATA_ALIGNMENT_WHOLE_STRUCT - Вся структура, с заполнением (выравнивание отдельных полей структуры, если указано, является предпочтительным и имеет приоритет над выравниванием всей структуры).

В каждой спецификации трассы должно быть указано не менее DATA_ALIGNMENT_GLOBAL_VAR и DATA_ALIGNMENT_STRUCT_FIELD.

AlignmentPositionПоложение выравнивания

Предопределенная перечисляемая строка, указывающая позицию, в которую необходимо поместить директиву выравнивания компилятора для типа выравнивания DATA_ALIGNMENT_WHOLE_STRUCT:

  • DATA_ALIGNMENT_PREDIRECTIVE - Директива выравнивания выдается до struct st_tag{…}, как часть оператора определения типа (например, MSVC).

  • DATA_ALIGNMENT_POSTDIRECTIVE - Директива выравнивания выдается после struct st_tag{…}, как часть оператора определения типа (например, gcc).

  • DATA_ALIGNMENT_PRECEDING_STATEMENT - Директива выравнивания выводится как автономный оператор, непосредственно предшествующий определению типа структуры. Точка с запятой (;) должна заканчивать зарегистрированный синтаксис выравнивания.

  • DATA_ALIGNMENT_FOLLOWING_STATEMENT - Директива выравнивания выдается как автономный оператор сразу после определения типа структуры. Точка с запятой (;) должна заканчивать зарегистрированный синтаксис выравнивания.

Для типов трасс, отличных от DATA_ALIGNMENT_WHOLE_STRUCT, при формировании кода используется положение выравнивания DATA_ALIGNMENT_PREDIRECTIVE.

AlignmentSyntaxTemplateСинтаксис выравнивания

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

  • %n - заменяется границей выравнивания для аргумента функции замены.

  • %s - заменяется выравниваемым символом, обычно идентификатором переменной.

Например, для компилятора gcc можно указать __attribute__((aligned(%n)))или для компилятора MSVC, __declspec(align(%n)).

SupportedLanguagesПоддерживаемые языки

Массив ячеек, указывающий языки, к которым применяется данная спецификация выравнивания, среди c и c++. Иногда синтаксис и положение выравнивания различаются между языками компилятора.

Вот спецификация выравнивания данных для компилятора GCC:

da = RTW.DataAlignment;

as = RTW.AlignmentSpecification;
as.AlignmentType = {'DATA_ALIGNMENT_LOCAL_VAR', ...
                    'DATA_ALIGNMENT_STRUCT_FIELD', ...
                    'DATA_ALIGNMENT_GLOBAL_VAR'};
as.AlignmentSyntaxTemplate = '__attribute__((aligned(%n)))';
as.AlignmentPosition = 'DATA_ALIGNMENT_PREDIRECTIVE';
as.SupportedLanguages = {'c', 'c++'};
da.addAlignmentSpecification(as);

tc = RTW.TargetCharacteristics;
tc.DataAlignment = da;

Вот соответствующая спецификация в диалоговом окне Создать настройку (Generate customization) инструмента замены кода.

Задание выравнивания данных в коде MATLAB для импортированных данных

Если для замены кода кодера MATLAB, требующего выравнивания данных, используются импортированные данные, такие как входная точка или экспортированная функция ввода-вывода, укажите выравнивание данных по внешнему коду с помощью coder.dataAlignment операторов в коде MATLAB.

Если происходит замена кода кодера MATLAB, требующая выравнивания данных (использует импортированные данные), например, функция точки входа или экспортированная функция с вводом-выводом, укажите выравнивание данных замены кода с помощью coder.DataAlignment операторов в коде MATLAB.

Для определения требований к выравниванию данных для импортированных данных в коде MATLAB:

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

    coder.dataAlignment('varName', align_value)

  • varName - символьный массив имени переменной, для которого требуется спецификация информации выравнивания. align_value - целое число, которое должно быть степенью 2, от 2 до 128. Это число определяет границу выравнивания мощности 2 байта.

  • Пример функции, определяющей выравнивание данных:

    function y = testFunction(x1,x2)
    
    coder.dataAlignment('x1',16);	  % Specifies information
    coder.dataAlignment('x2',16);    % Specifies information
    coder.dataAlignment('y',16);     % Specifies information
    
    y = x1 + x2;
    
    end
    

Если testFunction является функцией точки входа или экспортируемой, импортированные данные x1, x2, и y не выравниваются автоматически генератором кода. coder.DataAlignment операторы для этих переменных предназначены только в качестве информации для генератора кода. Узлы вызовов, выделяющие память для данных, должны гарантировать, что данные выровнены, как указано.

Можно также задать выравнивание данных замены кода для экспортируемых данных, например, global переменная или ExportedGlobal класс хранения. Дополнительные сведения см. в разделе Выбор класса хранения для представления управляющих данных в сгенерированном коде.

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