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

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

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

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

В этом примере показано, как настроить класс памяти в Словаре Embedded Coder и сопоставить класс памяти с корневым уровнем inports/outports и параметрами модели в редакторе Отображений Кода.

  1. Открытая модель rtwdemo_roll в качестве примера. В окне команды MATLAB запустите эту команду:

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

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

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

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

  4. 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 к Static.

  6. Откройте диалоговое окно Configuration Parameters. Выберите Code Generation> Custom Code> Additional build information> Source files и задайте:

    rtwdemo_roll_Value.c

  7. В перспективе Кода откройте вкладку Code Mappings> Data Defaults. Сопоставьте эти категории элемента модели:

    • Inports к SignalStruct

    • Outports к SignalStruct

    • Model parameters к ParamStruct

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

В сгенерированном коде просмотрите файл rtwdemo_roll.c. Модель step функционируйте использует заданный get и set функции, чтобы выполнить алгоритм. Сгенерированный код получает доступ к устаревшим данным путем вызова пользовательского, рукописного get и set функции. Например, вот фрагмент кода для импорта 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(get_Turn_Knob()) >= 3.0F) {
      rtb_Sum1 = get_Turn_Knob();
    }
Можно сгенерировать код, который вызывает пользовательский get и set функции, если функции, которые вы пишете, принимают и возвращают ожидаемые значения.

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

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

  • В Словаре Embedded Coder, для классов памяти 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 дает вам гибкость настройки имен функций, и возвратите типы. Можно также использовать класс памяти GetSet к данным о доступе через get и set функции. Для получения дополнительной информации см. Доступ к данным Через Функции с Классом памяти GetSet.

Смотрите также

Похожие темы