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