Поместите Внешний Код C/C++ в Сгенерированный код

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

  • Поместите код в запуске и конце сгенерированного кода для корневой модели.

  • Поместите объявление, тело и код выхода в сгенерированном функциональном коде для блоков в корневых или невиртуальных подсистемах модели.

Функции, которые можно увеличить с внешним кодом, зависят от функций, которые генератор кода производит для блоков, которые находятся в модели. Например, если подсистема модели или атомарная подсистема включают блоки, которые имеют состояния, можно задать код для запрещать функции. Аналогично, если вам нужен код для блока, чтобы сохранить данные, свободную память, или сбросить целевой компьютер, задайте код для оконечной функции. Для получения дополнительной информации см. Методы Конечного файла Блока (Simulink Coder).

Рабочий процесс

Чтобы поместить внешний код C or C++ в определенных местоположениях в коде, который генератор кода производит для корневых моделей и подсистем, выполните итерации через задачи, перечисленные в этой таблице.

ЗадачаДействиеБольше информации
1Если вы хотите интегрировать внешний код С со сгенерированным Кодом С++ или с другой стороны, измените язык внешнего кода, чтобы совпадать с выбором языка для сгенерированного кода.Измените язык программирования внешнего кода, чтобы совпадать со сгенерированным кодом (Simulink Coder)
2Рассмотрите свою оценку внешних характеристик кода и требований интегрирования.Выберите внешний рабочий процесс интеграции кода
3При необходимости перепишите код в C или C++. 
4Выберите подход интегрирования, чтобы добавить внешний код в модель Simulink.Выберите подход интегрирования
5Задайте представление данных модели для генерации кода.Обменивайтесь Данными Между Внешним Кодом C/C++ и Типовым кодексом Simulink или Сгенерированным кодом
6Сконфигурируйте модель для генерации кода.Сгенерируйте код, который совпадает с внешним видом внешнего кода и настройки модели
7Сгенерируйте код и отчет генерации кода.Генерация кода
8Рассмотрите интерфейс сгенерированного кода и статические метрики кода.Анализируйте сгенерированный код интерфейсные и статические метрики кода
9Создайте исполняемую программу из модели.Создайте интегрированный код в окружении Simulink
10Проверьте, что исполняемая программа выполняет как ожидалось.Числовое профилирование тестирования и выполнения кода эквивалентности

Выберите подход интегрирования

В среде моделирования Simulink® два подхода доступны для размещения внешнего кода C or C++ в разделы кода, который производит генератор кода:

  • Добавьте блоки от библиотеки Custom Code до корневой подсистемы модели или атомарной подсистемы.

  • Установите параметры конфигурации модели на Code Generation> панель Custom Code.

Следующая таблица сравнивает два подхода. Выберите подход, который выравнивается лучше всего с вашими требованиями интегрирования. Для получения дополнительной информации о том, как применить каждый подход, смотрите, Интегрируют Внешний Код при помощи Блоков Пользовательского кода и Интегрируют Внешний Код при помощи Параметров конфигурации Модели.

ТребованиеБлокиПараметры конфигурации модели
Включайте представление своего внешнего кода в холсте моделирования 
Поместите код в функции, сгенерированные для корневых моделей
Поместите код в функции, сгенерированные для атомарных подсистем 
Сохраните размещение кода в наборе конфигурации модели 
Поместите код вверху и внизу заголовка и исходных файлов, сгенерированных для модели
Поместите код в объявлении, выполнении и выходных разделах SystemInitialize andSystemTerminate функции, которые создает генератор кода
Поместите код в объявлении, выполнении и выходных разделах SystemStart, SystemEnable, SystemDisable, SystemOutputs, SystemUpdate, orSystemDerivatives функции, которые создает генератор кода 
Добавьте макроопределения препроцессора в сгенерированный код 
Используйте настройки пользовательского кода, которые заданы для цели симуляции 
Сконфигурируйте модель библиотеки, чтобы использовать настройки пользовательского кода родительской модели, с которой соединяется библиотека 

Интегрируйте внешний код при помощи блоков пользовательского кода

Библиотека блоков пользовательского кода

Библиотека блоков Пользовательского кода содержит блоки, которые можно использовать, чтобы поместить внешний код C or C++ в определенные местоположения и функции в рамках кода, который производит генератор кода. Библиотека состоит из 10 блоков, которые добавляют ваш код в заголовок модели (model.h) и источник (model.c или model.cpp) файлы, которые производит генератор кода.

Model Header и блоки Model Source добавляют внешний код вверху и внизу заголовка и исходных файлов, которые генератор кода производит для корневой модели. Эти блоки отображают два текстовых поля, в которые можно ввести или вставить код. Одно поле задает код, который вы хотите поместить наверху сгенерированного заголовка или исходного файла. Второе поле задает код, который вы хотите поместить в нижней части файла.

Оставшиеся блоки добавляют внешний код в функции, которые генератор кода производит для корневой подсистемы модели или атомарной подсистемы, которая содержит блок. Блоки отображают текстовые поля, в которые можно ввести или вставить код, который настраивает функции, которые производит генератор кода. Текстовые поля соответствуют объявлению, выполнению и выходным разделам кода для заданной функции.

Настроить код этоИспользуйте этот блок
Вычисляет непрерывные состоянияSystem Derivatives
Отключает состояние System Disable
Включает состояниеSystem Enable
Состояние сбросаSystem Initialize
Produces выходSystem Outputs
Выполняется однаждыSystem Start
Сохраняет данные, свободную память, целевой компьютер сбросаSystem Terminate
Требует обновлений на каждом главном временном шагеSystem Update

Блок и его местоположение в модели определяют, куда генератор кода помещает внешний код. Например, если блок System Outputs на корневом уровне модели, генератор кода помещает код в модель Outputs функция. Если блок находится в инициированной или активированной подсистеме, генератор кода помещает код в подсистему Outputs функция.

Если генератор кода не должен генерировать функцию, которая соответствует блоку Custom Code, который вы включаете в модель, генератор кода выполняет одно из следующих действий:

  • Не использует внешний код, который вы задаете в блоке Custom Code.

  • Возвращает ошибку, указывая, что модель не включает соответствующий блок. В этом случае удалите блок Custom Code из модели.

Для получения дополнительной информации см. Методы Конечного файла Блока (Simulink Coder).

Примечание

Чтобы избежать потенциального несоответствия между симуляцией и результатами генерации кода, не используйте блоки пользовательского кода, чтобы читать из и записать в глобальные данные Simulink (сигналы, состояния и параметры блоков). Вместо этого используйте соответствующий шаблон моделирования (например, Data Store Read, Data Store Write, State Reader и блоки State Writer.)

Добавьте блоки пользовательского кода в холст моделирования

Добавить библиотечные блоки Пользовательского кода в модель:

  1. В Браузере Библиотеки Simulink откройте библиотеку блоков Пользовательского кода.

  2. Перетащите блоки, которые вы хотите в свою модель или подсистему. Перетащите Model Header и блоки Model Source в корневые модели только. Перетащите функциональные блоки Пользовательского кода в корневые модели или атомарные подсистемы.

Можно использовать модели, которые содержат блоки Custom Code как модели, на которые ссылаются. Генератор кода игнорирует блоки при создании кода для цели симуляции. При создании кода для цели генерации кода генератор кода включает и компилирует пользовательский код.

Добавьте, что внешний код к сгенерированному запускает функцию

В этом примере показано, как использовать блок System Start, чтобы поместить внешний код С в код, который генератор кода производит для модели, которая включает дискретный фильтр.

  1. Создайте следующую модель.

  2. Сконфигурируйте модель для генерации кода.

  3. Дважды кликните блок System Start.

  4. В диалоговом окне параметров блоков, в поле System Start Function Declaration Code, вводят этот код:

    unsigned int *ptr = 0xFFEE;
  5. В поле System Start Function Execution Code введите этот код:

    /* Initialize hardware */
    *ptr = 0;
  6. Нажмите OK.

  7. Сгенерируйте код и отчет генерации кода.

  8. Просмотрите сгенерированный modelC файл. Ищите строку start function. Необходимо найти следующий код, который включает внешний код, который вы ввели на шагах 4 и 5.

      {
        {
          /* user code (Start function Header) */
          /* System '<Root>' */
          unsigned int *ptr = 0xFFEE;
      
          /* user code (Start function Body) */
          /* System '<Root>' */
          /* Initialize hardware */
          *ptr = 0;
        }
      }
    

Для другого примера смотрите, Интегрируют Внешний код С В Сгенерированный код При помощи Блоков Пользовательского кода и Параметров конфигурации Модели.

Интегрируйте внешний код при помощи параметров конфигурации модели

Параметры конфигурации модели обеспечивают способ поместить внешний код C or C++ в определенные местоположения и функции в рамках кода, который производит генератор кода.

КВыбрать
Введите внешний код около верхней части сгенерированного modelC или model.cpp файл

Source file, и вводит внешний код, чтобы вставить.

Если вы генерируете код подсистемы в отдельные файлы, тот код не имеет доступа к внешнему коду, который вы задаете параметром Source file. Например, если вы задаете включать файл как установку Source file, генератор кода вставляет #include около верхней части modelC или model.cpp файл. Код подсистемы, что места генератора кода в отдельном файле не имеют доступа к объявлениям в вашем включенном файле. В этом случае рассмотрите определение вашего внешнего кода параметром Header file.

Введите внешний код около верхней части сгенерированного modelH файлHeader file, и вводит внешний код, чтобы вставить.
Введите внешний код в модели, инициализируют функцию в modelC или model.cpp файлInitialize function, и вводит внешний код, чтобы вставить.
Введите внешний код в оконечной функции модели в modelC или model.cpp файлTerminate function, и вводит внешний код, чтобы вставить. Также выберите параметр Terminate function required на панели Interface.
Добавьте макроопределения препроцессора Defines, и вводит разделенный пробелом список макроопределений препроцессора, чтобы добавить к сгенерированному коду. Список может включать простые определения (например, -DEF1) и определения со значением (например, -DDEF2=1). Определения могут не использовать -D (например, -DFOO=1 и FOO=1 эквивалентны). Если определение включает -D, набор инструментальных средств может заменить флаг, если набор инструментальных средств использует различный флаг в, задает.
Используйте те же установки параметров пользовательского кода в качестве настроек, заданных для симуляции блоков MATLAB Function, графиков Stateflow® и блоков Таблицы истинности

Use the same custom code settings as Simulation Target

Этот параметр относится к панели Simulation Target в диалоговом окне Configuration Parameters.

Позвольте модели библиотеки использовать настройки пользовательского кода, уникальные от родительской модели, до которой соединяется библиотека

Use local custom code settings (do not inherit from main model)

Этот параметр доступен только для моделей библиотеки, которые содержат блоки MATLAB Function, диаграммы Stateflow или блоки Таблицы истинности.

Чтобы включать заголовочный файл во внешний заголовочный файл, добавьте #ifndef код. Используя этот код избегает нескольких включений. Например, в rtwtypes.h, следующий #include защита добавляется:

#ifndef RTW_HEADER_rtwtypes_h_ 
#define RTW_HEADER_rtwtypes_h_ 
... 
#endif /* RTW_HEADER_rtwtypes_h_ */

Для получения дополнительной информации о том, как добавить названия и местоположение файлов заголовка, источника, и совместно использовал файлы библиотеки к процессу сборки, смотрите Сборку Интегрированный Код В окружении Simulink.

Примечание

Генератор кода включает внешний код, который вы включаете в конфигурацию модели при генерации кода для программного обеспечения в цикле (SIL) и процессоре в цикле (PIL) симуляции. Однако генератор кода игнорирует внешний код, который вы включаете в конфигурацию модели при создании кода с S-функцией, быстрой симуляцией или системным конечным файлом симуляции.

Для получения дополнительной информации о параметрах Custom Code, смотрите Параметры конфигурации Модели: Пользовательский код Генерации кода (Simulink Coder). Для примера смотрите, Интегрируют Внешний код С В Сгенерированный код При помощи Блоков Пользовательского кода и Параметров конфигурации Модели.

Интегрируйте внешний код С в сгенерированный код при помощи блоков пользовательского кода и параметров конфигурации модели

В этом примере показано, как поместить, внешний код в сгенерированном коде при помощи пользовательского кода блокируется и параметры конфигурации модели.

1. Откройте модель rtwdemo_slcustcode.

open_system('rtwdemo_slcustcode')

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

3. Откройте диалоговое окно Model Configuration Parameters и перейдите к панели Пользовательского кода.

4. Исследуйте настройки на Исходный файл параметров конфигурации модели и Инициализируйте функцию.

  • Исходный файл задает комментарий и устанавливает переменную GLOBAL_INT2 к-1.

  • Инициализируйте функцию, инициализирует переменную GLOBAL_INT2 к 1.

5. Закройте диалоговое окно.

6. Дважды кликните Исходный блок Модели. Верхняя часть параметров блоков Источника Модели указывает, что генератор кода объявляет переменную GLOBAL_INT1 и набор это к 0 наверху сгенерированного файла rtwdemo_slcustcode.c.

7. Откройте инициированную подсистему Amplifier. Подсистема включает блок System Outputs. Генератор кода помещает код, который вы задаете в том блоке в сгенерированном коде для самой близкой родительской атомарной подсистемы. В этом случае генератор кода помещает внешний код в сгенерированный код для Amplifier подсистема. Внешний код:

  • Объявляет переменную указателя *intPtr и инициализирует его со значением переменной GLOBAL_INT1.

  • Устанавливает переменную указателя на-1 во время выполнения.

  • Сбрасывает переменную указателя к 0 перед выходом.

8. Сгенерируйте код и отчет генерации кода.

9. Исследуйте код в сгенерированном исходном файле rtwdemo_slcustcode.c. Наверху файла, после #include операторы, вы находите следующий код объявления. Пример задает первое объявление с параметром конфигурации Исходного файла и второе объявление с Исходным блоком Модели.

int_T GLOBAL_INT2 = -1;

int_T GLOBAL_INT1 = 0;

Выходная функция для Amplifier подсистема включает следующий код, который показывает внешний код, интегрированный со сгенерированным кодом, который применяет усиление. Пример задает эти три строки кода для переменной указателя с блоком System Outputs в Amplifier подсистема.

int_T *intPtr = &GLOBAL_INT1;

*intPtr = -1;

rtwdemo_slcustcode_Y.Output = rtwdemo_slcustcode_U.Input << 1;

*intPtr = 0;

Следующее присвоение появляется в модели, инициализируют функцию точки входа. Пример задает это присвоение с Инициализировать функциональным параметром конфигурации.

GLOBAL_INT2 = 1;

Похожие темы