Доступ к данным через функции при помощи классов памяти в словаре Embedded Coder

Чтобы заменить прямой доступ к данным в сгенерированном коде собственными или устаревшими функциями, которые считывают и записывают данные настраиваемым способом, можно включить доступ к функциям в классах памяти. Эти классы памяти создаются в Embedded Coder® Словарь. Входные порты корневого уровня, выходные порты корневого уровня и параметры модели, которые используют ваш класс памяти, появляются в сгенерированном коде как вызовы заданных функций. Объявления и определения функций предоставляются в отдельных заголовках и исходных файлах, на которые указывает класс памяти.

Доступ к унаследованным данным по значению

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

В этом примере показано, как настроить класс памяти в словаре Embedded Coder и сопоставить класс памяти с входными/выходными портами корневого уровня и параметрами модели в редакторе Code Mappings.

  1. Откройте пример модели rtwdemo_roll. В командном окне MATLAB запустите эту команду:

    addpath(fullfile(docroot,'toolbox','ecoder','examples'))
    Выполнение предыдущей команды дает вам эти вспомогательные файлы, необходимые для примера, который задает get и set функции:

    Сохраните эти файлы в локальный путь.

  2. В галерее Apps под Code Generation нажмите Embedded Coder.

  3. Чтобы открыть словарь Embedded Coder Dictionary, на вкладке C Code, нажмите Code Interface > Embedded Coder Dictionary.

  4. The rtwdemo_roll модель имеет два класса памяти: SignalStruct и ParamStruct. Они уже создаются при помощи кнопки Add. Этот пример использует эти классы памяти. Можно также выполнить следующие шаги для созданного класса памяти.

  5. Для SignalStruct класс памяти, на панели Property Inspector, обновите следующие значения свойств:

    • Data Access с Function

    • Header File с $R_Value.h

    Убедитесь, что для Access Mode задано значение Value. Data Scope установлено на Imported по умолчанию и не может быть изменен.

    Для ParamStruct класс памяти, на панели Property Inspector, обновите следующие значения свойств:

    • Data Access с Function

    • Header File с $R_Value.h

    Эти свойства уже заданы:

    • Access Mode с Value

    • Data Initialization с Static

    Классы памяти, используемые для параметров, могут Data Initialization установлены на Auto, Static, или None.

  6. Откройте диалоговое окно Параметры конфигурации. На панели инструментов, на вкладке C Code, нажмите Settings. Выберите Code Generation > Custom Code > Additional build information > Source files и укажите:

    rtwdemo_roll_Value.c

  7. В приложении Embedded Coder откройте редактор Code Mappings. На вкладке Data Defaults сопоставьте эти категории элементов модели:

    • Inports с SignalStruct

    • Outports с SignalStruct

    • Model parameters с ParamStruct

  8. Создайте модель и сгенерируйте код.

В сгенерированном коде просмотрите файл rtwdemo_roll.c. Модель step функция использует заданную get и set функций для выполнения алгоритма. Сгенерированный код обращается к устаревшим данным, вызывая пользовательские, рукописные get и set функций. Например, вот фрагмент кода для HDG_Ref inport:

if (get_HDG_Mode()) {
    /* Outputs for Atomic SubSystem: '<Root>/HeadingMode' */
    rtb_Sum1 = (get_HDG_Ref() - get_Psi()) * 0.015F * get_TAS();

    /* End of Outputs for SubSystem: '<Root>/HeadingMode' */
  } else {
    /* Outputs for Atomic SubSystem: '<Root>/RollAngleReference' */
    if ((real32_T)fabs(get_Turn_Knob()) >= 3.0F) {
      rtb_Sum1 = get_Turn_Knob();
    }
Можно сгенерировать код, который вызывает ваш пользовательский get и set functions, если функции, которые вы записываете, принимают и возвращают ожидаемые значения.

Доступ к устаревшим данным по указателям

Чтобы получить доступ к данным с помощью указателя, выполните все предыдущие шаги, но внесите следующие изменения:

  • В словаре Embedded Coder Dictionary для классов памяти SignalStruct и ParamStruct, задайте:

    • Access Mode с Pointer

    • Header File с $R_Pointer.h

  • Выберите Configuration Parameters> Code Generation> Custom Code> Additional build information> Source files и замените rtwdemo_roll_Value.c с:

    rtwdemo_roll_Pointer.c

С доступом к указателю, get теперь функция возвращает указатель, значение которого должно быть разменено с помощью * перед использованием. Например, сгенерированный код для входного порта HDG_Ref теперь выглядит как этот код:

if (*get_HDG_Mode()) {
    /* Outputs for Atomic SubSystem: '<Root>/HeadingMode' */
    rtb_Sum1 = (*get_HDG_Ref() - *get_Psi()) * 0.015F * *get_TAS();

    /* End of Outputs for SubSystem: '<Root>/HeadingMode' */
  } else {
    /* Outputs for Atomic SubSystem: '<Root>/RollAngleReference' */
    if ((real32_T)fabs(tmp_1) >= 3.0F) {
      rtb_Sum1 = tmp_1;
    }

Создание собственного класса памяти данных в словаре Embedded Coder Dictionary обеспечивает гибкость настройки имен функции и типов возврата. Можно также использовать класс памяти GetSet для доступа к данным через get и set функций. Для получения дополнительной информации смотрите Доступ к данным через функции с класс памяти.

См. также

Похожие темы