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

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

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

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

Функции, которые можно дополнить внешним кодом, зависят от функций, которые производит генератор кода для блоков, которые находятся в модели. Например, если подсистема модели или атомарная подсистема включает блоки, которые имеют состояния, можно задать код для функции disable. Точно так же, если вам нужен код для блока, чтобы сохранить данные, свободную память или сбросить целевой компьютер, задайте код для функции terminate. Для получения дополнительной информации смотрите Методы блочного файла целевого файла.

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

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

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

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

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

  • Добавьте блоки из библиотеки Пользовательского кода в корневую подсистему модели или атомарную подсистему.

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

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

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

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

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

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

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

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

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

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

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

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

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

Для получения дополнительной информации смотрите Методы блочного файла целевого файла.

Примечание

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

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

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

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

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

Можно использовать модели, которые содержат блоки 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. Просмотрите сгенерированные model.c файл. Поиск строки 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++ в определенные местоположения и функции в коде, который производит генератор кода.

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

Source file и введите внешний код для вставки.

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

Вставьте внешний код в верхней части сгенерированного model.h файлHeader file и введите внешний код для вставки.
Вставьте внешний код внутрь функции инициализации модели в model.c или model.cpp файлInitialize function и введите внешний код для вставки.
Вставьте внешний код внутрь функции завершения модели в model.c или 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 в диалоговом окне Параметров конфигурации.

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

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

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

Чтобы включить заголовочный файл во внешний заголовочный файл, добавьте #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 смотрите Параметры конфигурации модели: Пользовательский код генерации кода. Для получения примера смотрите Интеграция внешних Кодов С в сгенерированный код при помощи блоков пользовательского кода и параметров конфигурации модели.

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

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

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

open_system('rtwdemo_slcustcode')

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

3. Откройте диалоговое окно Model Параметры Конфигурации и перейдите к панели Custom Code.

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

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

  • Функция Initialize инициализирует переменную GLOBAL_INT2 по 1.

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

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

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

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

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

  • Устанавливает значение переменной указателя 0 перед выходом.

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

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

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;

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

GLOBAL_INT2 = 1;

Похожие темы