exponenta event banner

Размещение внешнего кода C/C + + в сгенерированном коде

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

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

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

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

Технологический процесс

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

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

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

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

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

  • Задайте параметры конфигурации модели на панели Создание кода (Code Generation) > Пользовательский код (Custom Code).

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

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

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

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

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

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

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

Настройка кодаИспользовать этот блок
Вычисляет непрерывные состоянияПроизводные системы
Отключает состояние Отключение системы
Включает состояниеВключение системы
Сброс состоянияИнициализация системы
Производит выходные данныеСистемные выходы
Выполняется один разЗапуск системы
Сохраняет данные, освобождает память, сбрасывает целевое оборудованиеЗавершение работы системы
Требуется обновление на каждом основном шаге времениОбновление системы

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

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

  • Пропускает внешний код, указанный в блоке «Пользовательский код».

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

Дополнительные сведения см. в разделе Методы блокировки целевых файлов.

Примечание

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

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

Чтобы добавить в модель блоки библиотеки пользовательского кода, выполните следующие действия.

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

  2. Перетащите нужные блоки в модель или подсистему. Перетащите блоки «Заголовок модели» и «Источник модели» только в корневые модели. Перетащите функциональные блоки пользовательского кода в корневые модели или атомарные подсистемы.

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

Добавление внешнего кода к созданной функции запуска

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

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

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

  3. Дважды щелкните на блоке «Пуск системы».

  4. В диалоговом окне параметров блока в поле System Start Function Declaration Code введите следующий код:

    unsigned int *ptr = 0xFFEE;
  5. В поле Код выполнения функции запуска системы введите следующий код:

    /* Initialize hardware */
    *ptr = 0;
  6. Нажмите кнопку ОК.

  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 в сгенерированный код с помощью пользовательских блоков кода и параметров конфигурации модели.

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

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

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

Исходный файл и введите внешний код для вставки.

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

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

Использовать те же параметры пользовательского кода, что и для цели моделирования

Этот параметр ссылается на панель Цель моделирования (Simulation Target) в диалоговом окне Параметры конфигурации (Configuration Parameters).

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

Использовать локальные пользовательские настройки кода (не наследовать от основной модели)

Этот параметр доступен только для библиотечных моделей, содержащих функциональные блоки MATLAB, диаграммы потока состояний или блоки таблицы истинности.

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

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

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

Примечание

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

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

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

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

1. Открытие модели rtwdemo_slcustcode.

open_system('rtwdemo_slcustcode')

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

3. Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters) и перейдите на панель Пользовательский код (Custom Code).

4. Проверьте настройки параметров конфигурации модели Source file и Initialize function.

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

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

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

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

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

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

  • Задает переменной указателя значение -1 во время выполнения.

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

8. Создание кода и отчета о создании кода.

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

int_T GLOBAL_INT2 = -1;

int_T GLOBAL_INT1 = 0;

Функция вывода для Amplifier подсистема включает в себя следующий код, который показывает внешний код, интегрированный с сгенерированным кодом, который применяет усиление. Пример задает три строки кода для переменной указателя с блоком «Системные выходы» в Amplifier подсистема.

int_T *intPtr = &GLOBAL_INT1;

*intPtr = -1;

rtwdemo_slcustcode_Y.Output = rtwdemo_slcustcode_U.Input << 1;

*intPtr = 0;

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

GLOBAL_INT2 = 1;

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