В этом примере показано, как программно создавать определения кода в словаре встроенного кодера. Чтобы автоматизировать создание словаря встроенного кодера в сценарии или программно создавать определения, используйте этот интерфейс программирования.
В этом примере в словаре данных Simulink создается Embedded Coder Dictionary, что позволяет нескольким моделям совместно использовать определения кода. Создаются определения кода, которые управляют присвоением имен и размещением глобальных данных и функций. Для размещения данных и функций в оперативной памяти также используется определение раздела памяти, которое включает в себя прагматику. Чтобы проверить архитектуру, настроенную с помощью определений кода, примените определения к модели, а затем создайте код.
Создайте словарь данных Simulink для хранения определений кода. Сохранение определений в словаре данных позволяет использовать определения в нескольких моделях путем связывания каждой модели со словарем данных, как показано в разделе Применение определений генерации кода.
dataDictionary = Simulink.data.dictionary.create('dataDictionary.sldd');Создание словаря встроенного кодера в словаре данных. При создании словаря представляйте его с помощью coder.Dictionary объект. Используйте объект для выполнения операций над всем словарем Embedded Coder Dictionary и доступа к его разделам.
codeDictionary = coder.dictionary.create('dataDictionary.sldd'); coder.Dictionary объект содержит три coder.dictionary.Section объекты, представляющие разделы словаря встроенного кодера: классы хранения, разделы памяти и шаблоны настройки функций. A coder.dictionary.Section объект содержит coder.dictionary.Entry объекты, представляющие определения в этом разделе. Для взаимодействия с определением и доступа к его свойствам используйте coder.dictionary.Entry объект, который его представляет.

При создании словаря встроенного кодера словарь загружает определения из Simulink таким образом, словарь Embedded Coder Dictionary будет содержать встроенные определения. Если в пакете хранятся пользовательские определения кода, загрузите этот пакет в словарь. При использовании словаря встроенного кодера для настройки интерфейса кода для модели можно применять определения из загруженных пакетов.
Чтобы создать определения разделов памяти, добавьте записи в раздел «Разделы памяти». Классы хранения и шаблоны настройки функций, находящиеся в одном словаре, могут использовать эти разделы памяти. В этом примере добавьте раздел памяти с именем FastMem, которая выделяет память с помощью прагматики. При применении раздела памяти к классу хранения или шаблону функции их созданные определения и объявления находятся в разделе памяти.
memorySections = getSection(codeDictionary,'MemorySections'); msFast = addEntry(memorySections,'FastMem'); set(msFast,'PreStatement','#pragma begin FAST'); set(msFast,'Comment','/*Fast onchip RAM*/'); set(msFast,'PostStatement','#pragma end FAST');
Для этого примера создайте класс хранения с именем ExportToPrivateHeader, которая генерирует объявление глобальной переменной в файле заголовка $R_private.h и определение в $R_private.c. Символ $R обозначает имя корневой модели, для которой создается код. Чтобы использовать переменную во внешнем коде, примените этот класс хранения к элементу данных и включите файл заголовка во внешний код.
storageClasses = getSection(codeDictionary,'StorageClasses'); exportToPrivateH = addEntry(storageClasses,'ExportToPrivateHeader'); set(exportToPrivateH,'HeaderFile','$R_private.h','DataScope','Exported');
Применение раздела памяти FastMem в класс хранения, используйте coder.dictionary.Entry объект, представляющий раздел памяти.
set(exportToPrivateH,'MemorySection',msFast);Создать другое определение класса хранения с именем ImportFromHeader для данных, определяемых внешним кодом. Поскольку класс хранения имеет 'DataScope' установить в значение 'Imported'сгенерированный код считывает и записывает в переменную, определенную внешним кодом.
importFromH = addEntry(storageClasses,'ImportFromHeader'); set(importFromH,'DataScope','Imported','HeaderFile','$R_input.h','DataInit','Dynamic');
Чтобы создать шаблон настройки функции, создайте другой coder.dictionary.Section объект, представляющий раздел Шаблоны адаптации функции. Добавьте в этот раздел запись, представляющую определение, которое управляет внешним видом созданных функций точек входа. Применить раздел памяти FastMem к шаблону функции.
functionTemplates = getSection(codeDictionary,'FunctionCustomizationTemplates'); fcGlobal = addEntry(functionTemplates,'GlobalFunctions'); set(fcGlobal,'FunctionName','$R$N'); set(fcGlobal,'MemorySection',msFast); saveChanges(dataDictionary);
Подтвердите настройки определений кода, применив их к модели и создав код. Интерфейс кода модели можно настроить для использования определений кода программным путем или с помощью редактора сопоставлений кодов.
Открытие модели rtwdemo_configinterface и свяжите модель с созданным словарем данных.
rtwdemo_configinterface set_param('rtwdemo_configinterface','DataDictionary','dataDictionary.sldd');

Модель содержит четыре входа. In1 настроен на использование класса хранения ImportFromFile. В этом примере выполняется настройка других входов для считывания данных из внешнего кода по умолчанию. Модель также содержит данные о состоянии блока задержки, который настраивается для доступа по внешнему коду. При применении классов хранения ImportFromHeader и ExportToPrivateHeader для элементов модели сгенерированный код соответствует этой архитектуре.
Чтобы настроить модель с определениями генерации кода, получите сопоставление кода для модели.
cm = coder.mapping.api.get('rtwdemo_configinterface');Используйте сопоставление кода, чтобы настроить данные для использования определений классов хранения. Для данных состояния в блоке задержки укажите класс хранения ExportToPrivateHeader.
setState(cm,'rtwdemo_configinterface/Delay','StorageClass','ExportToPrivateHeader');
Укажите класс хранения по умолчанию ImportFromHeader для данных корневого ввода. Для ввода модели по умолчанию созданный код использует данные, определенные внешним кодом в файле. rtwdemo_configinterface_input.c. Чтобы скомпилировать и связать этот внешний файл при построении созданного кода, задайте параметр конфигурации CustomSource кому rtwdemo_configinterface_input.c.
setDataDefault(cm,'Inports','StorageClass','ImportFromHeader'); set_param('rtwdemo_configinterface','CustomSource','rtwdemo_configinterface_input.c');
Укажите шаблон настройки функции GlobalFunctions для генерации кода по умолчанию для функций выполнения.
setFunctionDefault(cm,'Execution','FunctionCustomizationTemplate','GlobalFunctions');
Убедитесь, что определения кода соответствуют вашим спецификациям.
Откройте редактор сопоставлений кода. В редакторе Simulink откройте приложение Embedded Coder. На вкладке C Code выберите Code Interface > Default Code Mappings.
В редакторе сопоставлений кодов на вкладке «Значения по умолчанию» разверните раздел «Порты ввода и выходы». Категория Inports показывает класс хранения ImportFromHeader. На вкладке «Inports» (Ввод данных) выполняется ввод данных. In2, In3, и In4 использовать класс хранения по умолчанию модели ImportFromHeader. Импорт In1 указан другой класс хранения, ImportFromFile. Этот параметр переопределяет класс хранения по умолчанию, так что In1 считывает данные из другого внешнего файла.
На закладке Signals/States в состоянии X отображается класс хранения ExportToPrivateHeader.
На вкладке «Параметры функции по умолчанию» в категории «Выполнение» отображается шаблон. GlobalFunctions.
Откройте словарь встроенного кодера. На вкладке C Code выберите Code Interface > Embedded Coder Dictionary. Определения кода, добавленные в словарь, отображаются на вкладках.
Создайте код для модели.
slbuild('rtwdemo_configinterface', 'generateCodeOnly', true);
### Starting build procedure for: rtwdemo_configinterface ### Successful completion of code generation for: rtwdemo_configinterface Build Summary Top model targets built: Model Action Rebuild Reason =========================================================================================== rtwdemo_configinterface Code generated Code generation information file does not exist. 1 of 1 models built (0 models already up to date) Build duration: 0h 0m 26.762s
Файл заголовка rtwdemo_configinterface_private.h определяет данные состояния блока задержки в соответствии с классом хранения ExportToPrivateHeader. Внешний код может получить доступ к данным о состоянии.
file = fullfile('rtwdemo_configinterface_ert_rtw','rtwdemo_configinterface_private.h'); rtwdemodbtype(file,'/* Storage class', ... '#endif');
/* Storage class 'ExportToPrivateHeader' */ /*Fast onchip RAM*/ #pragma begin FAST extern MYTYPE X; /* '<Root>/Delay' */ #pragma end FAST
Поскольку для входов используются спецификации класса хранения, созданные файлы заголовков не определяют данные ввода. Вместо этого создается файл rtwdemo_configinterface.h включает внешний файл заголовка, указанный в определении класса хранения. Созданный код считывает данные ввода из переменных, определенных во внешнем файле rtwdemo_configinterface_inputs.c.
В созданном исходном файле rtwdemo_configinterface.c, функция выполнения (шаг) отражает настройки шаблона настройки функции GlobalFunctions. Потому что шаблон GlobalFunctions использует раздел памяти FastMem, функция выполнения хранится в разделе памяти и отражает предварительные, последующие и комментарии, установленные в FastMem определение.
file2 = fullfile('rtwdemo_configinterface_ert_rtw','rtwdemo_configinterface.c'); rtwdemodbtype(file2,'/* Model step function */', ... '/* Logic:');
/* Model step function */
/*Fast onchip RAM*/
#pragma begin FAST
void rtwdemo_configinterface_step(void)
{
После настройки словаря Embedded Coder Dictionary можно предоставить общий доступ к словарю коллективу или организации. Вы и другие пользователи можете применить свои определения к нескольким моделям, чтобы модели использовали одну и ту же архитектуру программного обеспечения.
Редактор сопоставлений кода | coder.Dictionary | coder.dictionary.Entry | coder.dictionary.Section | coder.mapping.api.CodeMapping | Словарь встроенного кодера