Чтобы заменить прямой доступ к данным в сгенерированном коде с вашими собственными или устаревшими функциями, которые читают и записывают данные индивидуально настраиваемым способом, можно включить функциональный доступ на классах памяти. Вы создаете эти классы памяти в Словаре Embedded Coder®. Импорт корневого уровня, выходные порты корневого уровня и параметры модели, которые используют ваш класс памяти, появляются в сгенерированном коде как вызовы заданных функций. Вы предоставляете объявления функции и определения в отдельном заголовке и исходных файлах, на которые указывает класс памяти.
Можно задать и применить класс памяти к импорту корневого уровня, выходным портам корневого уровня и параметрам модели, таким образом, к ним может получить доступ настраиваемый get
и set
функции. Такая индивидуальная настройка может быть полезной, например, к абстрактным слоям программного обеспечения, получить доступ к данным из внешнего файла или управлять доступом к критическим разделам кода.
В этом примере показано, как настроить класс памяти в Словаре Embedded Coder и сопоставить класс памяти с корневым уровнем inports/outports и параметрами модели в редакторе Отображений Кода.
Открытая модель rtwdemo_roll
в качестве примера. В окне команды MATLAB запустите эту команду:
addpath(fullfile(docroot,'toolbox','ecoder','examples'))
get
и set
функции:
Сохраните эти файлы к своему локальному пути.
В галерее Apps, под Code Generation, нажимают Embedded Coder.
Чтобы открыть Словарь Embedded Coder, на вкладке C Code, нажимают Code Interface> Embedded Coder Dictionary.
rtwdemo_roll
модель имеет два класса памяти: SignalStruct
и ParamStruct
. Они уже создаются при помощи кнопки Add. Этот пример использует эти классы памяти. Можно выполнить следующие шаги для класса памяти, который вы создаете также.
Для 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
.
Откройте диалоговое окно Configuration Parameters. В панели инструментов, на вкладке C Code, нажимают Settings. Выберите Code Generation> Custom Code> Additional build information> Source files и задайте:
rtwdemo_roll_Value.c
В приложении Embedded Coder откройте редактор Отображений Кода. На вкладке Data Defaults сопоставьте эти категории элемента модели:
Inports к SignalStruct
Outports к SignalStruct
Model parameters к ParamStruct
Создайте модель и сгенерируйте код.
В сгенерированном коде просмотрите файл 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.