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

Можно интегрировать новый или существующий код С в Simulink® с помощью блока C Caller. Чтобы создать пользовательские блоки в ваших моделях Simulink, блок C Caller позволяет вам вызывать внешние функции C, заданные во внешнем исходном коде и библиотеках. Преимущества блока C Caller:

  • Автоматизированное интегрирование простых функций C

  • Интегрирование с Simulink Coverage™, Simulink Test™ и дизайном Simulink Verifier™

  • Интегрирование с Simulink Coder™

Блок C Caller позволяет вам приносить алгоритмы C в Simulink. Чтобы смоделировать динамические системы, используйте Разработчика S-функции вместо этого. Следующие шаги описывают рабочий процесс, чтобы интегрировать код С в Simulink с помощью блока C Caller.

Задайте исходный код и зависимости

Задайте свой внешний файл исходного кода, который содержит ваши функции C.

  1. От панели инструментов Simulink откройте Параметры конфигурации.

  2. На левой панели выберите Simulation Target.

  3. Чтобы включить парсинг кода блоком C Caller, гарантируйте, что поле пользовательского кода Импорта выбрано.

    Директории и пути к файлам могут быть путями к абсолютному и файлу прямого доступа к каталогам модели или к текущей рабочей директории. Смотрите Задают Относительные пути для Пользовательского кода (Stateflow).

  4. Выберите Заголовочный файл и введите имя вашего заголовочного файла с тегом #include.

  5. Под Дополнительной информацией о сборке выберите директории Include и введите папки, где дополнительная информация сборки, такая как заголовочные файлы, хранится.

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

Примечание

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

Задайте функциональное размещение массивов по умолчанию

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

  • Главный столбцом — блок C Caller обрабатывает данные Simulink в порядке развертывания по столбцам. Предположим, что вы имеете 3 3 матрица. В блоке C Caller эта матрица сохранена в последовательности: первый столбец, второй столбец и третий столбец.

  • Главный строкой — блок C Caller обрабатывает данные Simulink в главном строкой порядке. Предположим, что вы имеете 3 3 матрица. В блоке C Caller это сохранено в последовательности: первая строка, вторая строка и третья строка.

  • Любой — Данные массива может быть сохранен и в главном столбцом и в главном строкой в блоке C Caller. Можно сгенерировать код и в столбце и в главных строкой настройках.

  • Не заданный — Данные массива могут быть сохранены и в главном столбцом и в главном строкой порядке. По сравнению с Любой установкой можно только сгенерировать код в главной столбцом установке.

Чтобы узнать больше о размещениях главного массива строки и столбца в Simulink, смотрите функциональное размещение массивов По умолчанию.

  1. Выберите параметр макета массивов под Размещением Функции массива По умолчанию.

  2. Если необходимо применить определенное размещение массивов к некоторым функциям в коде, нажмите на Specify by Function, чтобы выбрать эти функции.

  3. Нажмите Apply, чтобы принять ваши изменения.

  4. Нажмите ОК, чтобы закрыть Параметры конфигурации.

Вызовите блок вызывающей стороны C и задайте порты

Можно запустить пользовательское интегрирование кода С в Simulink просто путем ввода C Вызывающей стороны в холст Simulink. Также перетащите блок C Caller от Браузера Библиотеки> Пользовательские Функции. Дважды кликните блок, чтобы открыть диалоговое окно Block Parameter, чтобы видеть имена ваших функций и спецификаций порта.

  1. Нажмите на пользовательском коде Обновления, чтобы импортировать ваш исходный код и его зависимости.

  2. Ваши функции C отображены под Именем функции. Если вы не видите свой полный список функций, нажимаете, чтобы повторно импортировать ваш исходный код.

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

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

Карта C Аргументы функции к портам Simulink

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

extern void mean_filter(const unsigned char* src,
                           unsigned char* dst,
                           unsigned int width, unsigned int height,
                           unsigned int filterSize);

Спецификация порта показывает детали ваших аргументов и как они соединяются с вашим блоком C Caller в Simulink.

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

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

Осциллограф SimulinkC аргумент
входной параметрблокируйте входной порт
вывод блокируйте выходной порт
параметрблокируйте настраиваемый параметр
постоянныйпостоянное значение

Когда у вас есть постоянное определение спецификатора, такое как const double *u, аргумент может только быть входным параметром или параметром. Когда нет никакого постоянного спецификатора, аргументом является вывод по умолчанию, и можно изменить его на входной параметр или параметр. В этом случае гарантируйте, что функция C не изменяет память, указанную указателем. Если аргумент имеет выходной тип, каждый элемент, указанный этим указателем, должен быть повторно присвоен в каждом призыве к этой функции.

Аргумент C

Осциллограф Simulink

функциональный возврат

вывод

double u

double *u

double u[]

double u[][2]

double u[2][3]

выведите (значение по умолчанию), введите, параметр

const double *u

const double u[]

const double u[][2]

const double u[2][3]

введите (значение по умолчанию), параметр

Метка — Указывает на метку для соответствующего аргумента в блоке Simulink. По умолчанию ваша метка аргумента - то же самое с именем аргумента, если вы не изменяете его.

Осциллограф SimulinkМетка

введите, выведите

имя порта

параметр

'ParameterName'

постоянный

выражение для постоянного значения.

выражения размера с помощью имен входного параметра, например size(in1,1)

Введите — Демонстрирует соответствующий тип данных Simulink типу данных аргумента функции C.

Тип данных аргумента CТип данных Simulink
символ со знакомint8
char без знакаuint8
'char'int8 или uint8, в зависимости от компилятора
int*int32
int без знака*uint32
короткий *int16
долго *int32 или fixdt (1,64,0), в зависимости от операционной системы
плаваниеединственный
'double''double'
int8_t*int8
uint8_t*int8
int16_t*int16
uint16_t*uint16
int32_t*int32
uint32_t*uint32
struct определения типа {…} AStruct **Шина: AStruct
перечисление определения типа {..} AnEnum **Перечисление: AnEnum

*, Если Вызывающая сторона C берет целый тип, например, int16_t, можно изменить его к типу фиксированной точки с соответствием с базовым типом, например к fixdt (1, 16, 3).

** Кнопка синхронизации Вызывающей стороны C предлагает вам импортировать struct или перечислимые типы, используемые функцией C в качестве шины Simulink и перечисляемых типов.

Размер — Задает размерности данных в аргументе.

Размерности аргумента CРазмерности порта Simulink

double u

скаляр (1)

double *u

double u[]

double u[][2]

наследованный (-1) (значение по умолчанию)

Если аргумент для выходного порта, размер должен быть задан. Размер выходного порта не может быть наследован.

double u[2][3]

размер [2, 3]

Создайте пользовательскую библиотеку вызывающей стороны C

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

  1. Откройте новую модель библиотеки из Файла> Новый> Библиотека и нажмите Blank Library.

  2. Открытая Цель Моделирования от Представления> Настройки Пользовательского кода Библиотеки> Цель Моделирования

  3. Выберите C или C++ в опции Языка, в зависимости от вашего кода, и гарантируйте, что флажок пользовательского кода Импорта устанавливается.

  4. Следуйте инструкциям в, Задают Исходный код и Зависимости, чтобы добавить ваши исходные файлы и их зависимости.

  5. Создайте блоки Вызывающей стороны C, чтобы вызвать функции C.

  6. Чтобы вставить блок от вашей модели библиотеки до моделей Simulink, просто перетащите блок в свою модель.

Ограничения

  • Глобальная Инициализация состояний C — Если ваше чтение функций C или запись глобальные или статические переменные, остерегайтесь на использовании. Например, если несколько функций C получают доступ к тому же набору глобальных переменных, порядок выполнения блоков может привести к неожиданным результатам.

  • Инициализация/Завершение Настроек Пользовательского кода — Если необходимо выделить и освободить память для пользовательского кода, вставить, выделяет и освобождает в Инициализировать функции и Отключает функциональные поля настроек пользовательского кода.

  • Блок Complex Data Support — The C Caller не поддерживает сложный тип данных в Simulink.

  • Блок Continuous Sample Time — The C Caller не поддерживает время непрерывной выборки.

  • Аргументы переменной — Аргументы переменной в C не поддержаны. Например, int sprintf(char *str, const char *format, ...)

  • Блок Syntax — The C Caller C++ не поддерживает нативный синтаксис C++ непосредственно. Необходимо записать обертку функции C, чтобы взаимодействовать через интерфейс с Кодом С++.

Чтобы протестировать ваши модели, который включает блоки Вызывающей стороны C, смотрите Тест Интегрированный код С (Тест Simulink)

Смотрите также

| | | |

Похожие темы

Была ли эта тема полезной?