exponenta event banner

Конфигурирование интерфейса данных модели для генерации кода C

Чтобы интегрировать сгенерированный код с внешним кодом или создать код, соответствующий стандартам и рекомендациям по кодированию, можно настроить отображение элементов данных в модели, таких как параметры блоков и строки сигналов, в сгенерированном коде. Можно настроить параметры генерации кода по умолчанию для категорий элементов данных и настроить отдельные элементы с помощью редактора сопоставлений кода или API сопоставлений кода. Например, можно настроить следующие параметры:

  • Управление размещением объявлений и определений в созданных и внешних (экспортированных и импортированных) файлах.

  • Упаковка нескольких элементов данных в структуры.

  • Применение квалификаторов типа склада const и volatile.

В этом примере показано, как настроить элементы данных для создания кода, например, модели rtwdemo_configinterface.

Изучение примера модели

Открыть пример модели rtwdemo_configinterface.

model = 'rtwdemo_configinterface';
open_system(model)

В примере показано, как настроить эти элементы данных модели для генерации кода:

  • Inport блоки In1, In2, In3, и In4

  • Блок аутпорта Out1

  • Аргументы параметра модели LOWER и UPPER

  • Параметры модели K1, Table1, и Table2

  • Локальное хранилище данных mode

  • Сигнальные линии, исходящие из блоков таблицы поиска Table1 и Table2

  • Государство X (задержка)

Настройка параметров по умолчанию для Inport Блоки

  1. Откройте приложение Embedded Coder.

  2. На вкладке Код C выберите Интерфейс кода > Сопоставления кодов по умолчанию.

  3. В редакторе сопоставлений кодов в разделе «Входы и выходы» выберите категорию «Входы». Задать класс хранения по умолчанию как ImportFromFile.

  4. В инспекторе свойств задайте для параметра «Файл заголовка» значение exInDataLut.h.

Настройка параметров по умолчанию для блока исходящего порта

  1. На вкладке «Параметры данных по умолчанию» в разделе «Порты ввода» и «Порты вывода» выберите категорию «Порты вывода». Задать класс хранения по умолчанию как ExportToFile.

  2. В инспекторе свойств задайте для параметра «Файл заголовка» значение exOutSys.h и файл определения для exOutSys.c.

Настройка параметров по умолчанию

  1. На вкладке «Параметры по умолчанию» в разделе «Параметры» выберите категорию «Аргументы параметров модели». Оставьте для класса хранения значение Default. С этой настройкой генератор кода выделяет отдельную область памяти для каждого экземпляра аргумента.

  2. Выберите категорию Параметры модели. Текст ссылки 'Auto' will be inlined указывает, что генератор кода по умолчанию настроен на встроенные параметры модели. В этом примере настройте параметры модели для настройки. Щелкнуть 'Auto' will be inlined. Откроется диалоговое окно Параметры конфигурации модели (Model Configuration Parameters).

  3. Задать для параметра конфигурации модели Поведение параметра по умолчанию значение Tunable. Сохраните изменения и закройте диалоговое окно. В редакторе сопоставлений кодов текст ссылки изменяется на 'Auto' will be tunable.

  4. В редакторе Сопоставления кодов (Code Mappings) с выбранной категорией Параметры модели (Model parameters) установите класс хранения в значение ConstVolatile.

Настройка параметров по умолчанию для сигналов, состояний и хранилищ данных

  1. На вкладке Значения по умолчанию в разделе Сигналы выберите категорию Сигналы, состояния и внутренние данные. Задайте класс хранения по умолчанию FileScope .

  2. Настройте сопоставления кодов по умолчанию для общих локальных хранилищ данных. Выберите категорию Общие локальные хранилища данных. Задайте для класса хранения значение Volatile.

  3. Сохраните модель.

Настройка параметров создания кода для отдельных блоков ввода

  1. В редакторе сопоставлений кодов перейдите на вкладку «Inports». Редактор перечисляет имена корневых уровней Inport и In Bus Element блоков в модели. Если порт получает разрешение на сигнальный объект, справа от имени элемента появляется значок «resolve-to-signal-object». Класс хранения для каждого порта ввода имеет значение Auto, что означает, что генератор кода может исключить релевантный код для целей оптимизации. Если оптимизация невозможна, генератор кода применяет конфигурацию модели по умолчанию. В этом примере конфигурация модели по умолчанию определяет класс хранения ImportedFromFile. Чтобы избежать оптимизации и заставить генератор кода использовать конфигурацию по умолчанию, задайте для класса хранения значение Model default. Чтобы переопределить конфигурацию по умолчанию, укажите класс хранения, который соответствует требованиям к созданию кода для этого входа.

  2. Настройка генератора кода для применения значения класса хранения по умолчанию к входам In2, In3, и In4. Выберите строки для трех входов. Затем для одного из выбранных портов ввода установите класс хранения в значение Model default: ImportFromFile. Класс хранения для трех выбранных входов изменяется на «Модель по умолчанию» (Model default).

  3. Для ввода In1, переопределить значение класса хранения по умолчанию. Задайте для класса хранения значение ImportFromFile. В инспекторе свойств задайте для параметра «Файл заголовка» значение exInDataMem.h.

  4. Настройте идентификаторы кода для входов таким образом, чтобы переменные в сгенерированном коде совпадали с именами интерфейсов во внешнем заголовке и файлах определений. В редакторе сопоставлений кодов выберите строку для каждого порта ввода. В инспекторе свойств задайте для свойства «Идентификатор» следующие значения: input1, input2, input3, и input4.

Настройка параметров генерации кода для отдельных блоков исходящего трафика

  1. В редакторе сопоставлений кодов перейдите на вкладку «Выходы». Редактор перечисляет имена корневых уровней Outport и Out Bus Element блоков в модели. Если порт получает разрешение на сигнальный объект, справа от имени элемента появляется значок «resolve-to-signal-object». Класс хранения для исходящего порта в модели примера имеет значение Auto, что означает, что генератор кода может исключить релевантный код для целей оптимизации.

  2. Чтобы избежать оптимизации и заставить генератор кода использовать конфигурацию по умолчанию, задайте для класса хранения значение Model default: ExportToFile. Класс хранения для выбранного исходящего порта изменяется на Model default: ExportToFile.

  3. Настройте идентификатор кода для исходящего порта таким образом, чтобы переменная в сгенерированном коде соответствовала имени интерфейса, используемому внешним кодом. В редакторе сопоставлений кодов выберите строку для исходящего порта. В инспекторе свойств задайте для свойства «Идентификатор» значение output.

Настройка параметров генерации кода для отдельных параметров

  1. В редакторе сопоставлений кодов перейдите на вкладку «Параметры». Разверните «Аргументы параметра модели». По умолчанию класс хранения для каждого аргумента параметра модели имеет значение Auto, что означает, что генератор кода может исключить релевантный код для целей оптимизации. Если оптимизация невозможна, генератор кода применяет конфигурацию модели по умолчанию. В этом примере оставьте для класса хранения значение Auto.

  2. Разверните узел «Параметры модели». По умолчанию класс хранения для каждого параметра модели имеет значение Auto. В этом примере необходимо избежать оптимизации и использовать в генераторе кода значение класса хранения по умолчанию ConstVolatile.

  3. В редакторе сопоставлений кодов в разделе «Параметры модели» выберите параметры K1, Table1, и Table2. Задайте для класса хранения значение Model default: ConstVolatile.

  4. Настройка идентификаторов кода для параметров модели с именами, включающими префикс mp_, как указано в требованиях. В редакторе сопоставлений кодов выберите параметр модели K1. В инспекторе свойств разверните узел «Код». Задайте для свойства класса хранения Identifier значение mp_K1. Для параметров Table1 и Table2, задайте для параметра Identifier значение mp_Table1 и mp_Table2.

Настройка параметров создания кода для отдельных хранилищ данных

  1. В редакторе сопоставлений кодов перейдите на вкладку «Хранилища данных». Разверните узел Локальные хранилища данных. Класс хранения для режима хранения данных имеет значение Auto, что означает, что генератор кода может исключить релевантный код для оптимизации. В этом примере необходимо избежать оптимизации и использовать в генераторе кода значение класса хранения по умолчанию. Volatile.

  2. В редакторе сопоставлений кодов выберите локальное хранилище данных mode. Задайте для класса хранения значение Model default: Volatile.

  3. Настройка идентификатора кода для хранилища данных с именем, включающим префикс ds_. В редакторе сопоставлений кодов выберите общее локальное хранилище данных mode. В инспекторе свойств разверните узел «Код». Задайте для свойства класса хранения Identifier значение ds_mode.

Настройка параметров создания кода для отдельных состояний

  1. В редакторе сопоставлений кодов перейдите на вкладку «Сигналы/Состояния». Развернуть состояния. Класс хранения для состояния имеет значение Auto, что означает, что генератор кода может исключить релевантный код для целей оптимизации. В этом примере необходимо избежать оптимизации и использовать в генераторе кода значение класса хранения по умолчанию. FileScope.

  2. В редакторе сопоставлений кодов выберите состояние X. Задайте для класса хранения значение Model default: FileScope.

  3. Настройка идентификатора кода для состояния с именем, включающим префикс dstate_, как указано в требованиях. В редакторе сопоставлений кодов выберите состояние X. В инспекторе свойств разверните узел «Код». Затем задайте свойству класса хранения Identifier значение dstate_X.

Настройка параметров генерации кода для отдельных сигналов

Добавьте сигналы, которые требуется настроить, в сопоставления кода модели. В этом примере добавьте к отображениям кода модели выходные сигналы для двух блоков таблицы поиска. Затем сконфигурируйте эти сигналы.

  1. В редакторе сопоставлений кодов перейдите на вкладку «Сигналы/Состояния». Сигналы не перечислены.

  2. Добавьте сигналы в сопоставления кода. Для выходных сигналов блоков таблицы поиска Table1 и Table2, в модели выберите сигнал, остановитесь на многоточии, которое появляется выше или ниже сигнальной линии, чтобы открыть панель действий, и нажмите кнопку «Добавить сигнал». В редакторе сопоставлений кодов узел «Сигналы» расширяет список имен или идентификаторов блоков двух добавленных сигналов. Если сигнал распознается в сигнальном объекте, справа от имени элемента или идентификатора порта появляется значок «resolve-to-signal-object». Класс хранения для каждого сигнала установлен в Auto, что означает, что генератор кода может исключить релевантный код для целей оптимизации. В этом примере необходимо избежать оптимизации и использовать в генераторе кода значение класса хранения по умолчанию. FileScope.

  3. В редакторе сопоставлений кодов выберите выходные сигналы для блоков Table1 и Table2. Задайте для класса хранения значение Model default: FileScope.

  4. Конфигурирование идентификатора кода для выходных сигналов для двух блоков таблицы поиска с именами, включающими префикс dout. В редакторе сопоставлений кодов выберите сигнал Table1:1. В инспекторе свойств разверните узел «Код». Задайте для свойства класса хранения Identifier значение dout_Table1. Для сигнала Table2:1, задайте для параметра Identifier значение dout_Table2.

  5. Сохраните модель.

Программная настройка данных для генерации кода

Также можно использовать API-интерфейс отображения кода для программной настройки элементов данных модели.

1. Получение объекта, представляющего сопоставления кода для модели, путем вызова coder.mapping.api.get. Возвращенный объект указывается в качестве первого аргумента при последующих вызовах функций сопоставления кода.

cm = coder.mapping.api.get(model);

2. Настройка параметров генерации кода по умолчанию для категорий элементов данных с вызовами setDataDefaults. В каждом вызове включите объект, возвращенный вызовом coder.mapping.api.get, имя категории элементов данных и аргументы пары имя-значение, определяющие класс хранения и свойства класса хранения. Использовать setDataDefaults для настройки этих параметров по умолчанию:

  • Inport блоки с классом хранения ImportFromFile и файл заголовка exInDataLut.h

  • Блоки исходящего порта с классом хранения ExportToFile и файл заголовка exOutSys.h и файл определения exOutSys.c

  • Аргументы параметров модели с конфигурацией генератора кода по умолчанию

  • Параметры модели с классом хранения ConstVolatile

  • Внутренние данные (сигналы, состояния и локальные хранилища данных) с классом хранения FileScope

  • Общие локальные хранилища данных с классом хранения Volatile

setDataDefault(cm,'Inports','StorageClass','ImportFromFile','HeaderFile','exInDataLut.h');
setDataDefault(cm,'Outports','StorageClass','ExportToFile','HeaderFile','exOutSys.h',...
'DefinitionFile','exOutSys.c');
setDataDefault(cm,'ModelParameterArguments','StorageClass','Default');
setDataDefault(cm,'ModelParameters','StorageClass','ConstVolatile');
setDataDefault(cm,'InternalData','StorageClass','FileScope');
setDataDefault(cm,'SharedLocalDataStore','StorageClass','Volatile');

Задать параметр конфигурации модели DefaultParameterBehavior кому Tunable, чтобы параметры модели были доступны во время выполнения программы.

set_param(model,'DefaultParameterBehavior','Tunable');

3. Конфигурирование отдельных Inport блоки с вызовами setInport. Чтобы избежать оптимизации, примените конфигурацию по умолчанию для Inport блоки в In2, In3, и In4. Для In1, переопределить конфигурацию по умолчанию, установив для класса хранения значение ImportFromFile и заголовочный файл в exInDataMem.h. Кроме того, настройте идентификаторы кода для входов так, чтобы глобальные переменные, представляющие входы в сгенерированном коде, совпадали с именами переменных во внешнем файле определения. В каждом вызове setInport, укажите объект, возвращенный coder.mapping.api.get, Inport имя блока и аргументы пары имя-значение для класса хранения и параметров свойств.

setInport(cm,'In1','StorageClass','ImportFromFile','HeaderFile','exInDataMem.h',...
    'Identifier','Input1');
setInport(cm,'In2','StorageClass','Model default','Identifier','Input2');
setInport(cm,'In3','StorageClass','Model default','Identifier','Input3');
setInport(cm,'In4','StorageClass','Model default','Identifier','Input4');

4. Настройка параметров отдельных элементов данных для блока Outport Out1 с вызовом setOutport.Во избежание оптимизации примените конфигурацию по умолчанию. Также настройте идентификатор кода для исходящего порта. В вызове для setOutport, укажите объект, возвращенный coder.mapping.api.get, имя блока Outport и аргументы пары имя-значение для класса хранения и параметров свойства идентификатора кода.

setOutport(cm,'Out1','StorageClass','Model default','Identifier','output');

5. Конфигурирование параметров отдельных моделей с вызовами setModelParameter.Во избежание оптимизации примените конфигурацию по умолчанию. Также настройте идентификаторы кода для параметров. В каждом вызове setModelParameter, укажите объект, возвращенный coder.mapping.api.get, имя параметра и аргументы пары имя-значение для класса хранения и параметров свойства идентификатора кода.

setModelParameter(cm,'K1','StorageClass','Model default','Identifier','mp_K1');
setModelParameter(cm,'Table1','StorageClass','Model default','Identifier','mp_Table1');
setModelParameter(cm,'Table2','StorageClass','Model default','Identifier','mp_Table2');

6. Настройка параметров отдельных элементов данных для локального хранилища данных mode с вызовом setDataStore.Во избежание оптимизации примените конфигурацию по умолчанию. Также настройте идентификатор кода для хранилища данных. В вызове для setDataStore, укажите объект, возвращенный coder.mapping.api.get, имя хранилища данных и аргументы пары имя-значение для класса хранения и параметров свойства идентификатора кода.

setDataStore(cm,'mode','StorageClass','Model default','Identifier','ds_mode');

7. Настройка параметров отдельных элементов данных для состояния X с вызовом setState.Во избежание оптимизации примените конфигурацию по умолчанию. Также настройте идентификатор кода для состояния. В вызове для setState, укажите объект, возвращенный coder.mapping.api.get, путь к блоку, использующему аргументы пары «состояние» и «имя-значение» для класса хранения и параметров свойств идентификатора кода.

setState(cm,'rtwdemo_configinterface/Delay','StorageClass','Model default',...
    'Identifier','dstate_X');

8. Добавление сигналов в сопоставления кода и конфигурирование их с вызовами setSignal.Для добавления дескрипторов портов для добавления сигнальных данных в сопоставления кода модели с вызовами get_param. Затем укажите дескрипторы блоков в вызове addSignals. Чтобы избежать оптимизации, примените конфигурацию по умолчанию для сигналов. Кроме того, сконфигурируйте идентификаторы кода для сигналов. В каждом вызове setSignal, укажите объект, возвращенный coder.mapping.api.get, путь или дескриптор блока источника сигнала и аргументы пары имя-значение для параметров класса хранения и идентификатора кода.

lut1D_ports = get_param('rtwdemo_configinterface/Table1','PortHandles');
lut2D_ports = get_param('rtwdemo_configinterface/Table2','PortHandles');

lut1D_outPort = lut1D_ports.Outport;
lut2D_outPort = lut2D_ports.Outport;

addSignal(cm,[lut1D_outPort,lut2D_outPort]);

setSignal(cm,lut1D_outPort,'StorageClass','Model default','Identifier','dout_Table1');
setSignal(cm,lut2D_outPort,'StorageClass','Model default','Identifier','dout_Table2');

Создать и просмотреть код

1. Создать код.

slbuild(model)
### 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 11.593s

2. Просмотр кода. Например, в rtwdemo_configinterface.c найдите, где используются эти переменные в функции step entry-point: input1, input2, input3, input4, output, mp_K1, ds_mode, dstate_X, dout_Table1, и dout_Table2.

Связанные темы