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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавить библиотеку Custom Code блокируется к модели:

  1. В Браузере Библиотеки Simulink откройте библиотеку блоков Пользовательского кода. Можно получить доступ к библиотеке:

    • Навигация к Simulink Coder> Custom Code в браузере.

    • Ввод команды MATLAB® custcode.

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

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

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

Этот пример показывает, как использовать блок 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;
        }
      }
    

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

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

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

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

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

Примечание

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

Введите внешний код около верхней части сгенерированного файла model.hHeader file, и вводит внешний код, чтобы вставить.
Введите внешний код в модели, инициализируют функцию в файле model.cpp или model.cInitialize function, и вводит внешний код, чтобы вставить.
Введите внешний код в образцовой оконечной функции в файле model.cpp или model.cTerminate 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 (Embedded Coder).

Примечание

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

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

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

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

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

open_system('rtwdemo_slcustcode')

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

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

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

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

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

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

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

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

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

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

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

8. Исследуйте код в сгенерированном исходном файле 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;

Похожие темы