Можно интегрировать новый или существующий код С в 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.
От панели инструментов Simulink откройте Параметры конфигурации.
На левой панели выберите Simulation Target.
Чтобы включить парсинг кода блоком C Caller, гарантируйте, что поле пользовательского кода Импорта выбрано.
Директории и пути к файлам могут быть путями к абсолютному и файлу прямого доступа к каталогам модели или к текущей рабочей директории. Смотрите Задают Относительные пути для Пользовательского кода (Stateflow).
Выберите Заголовочный файл и введите имя вашего заголовочного файла с тегом #include
.
Под Дополнительной информацией о сборке выберите директории Include и введите папки, где дополнительная информация сборки, такая как заголовочные файлы, хранится.
Выберите Исходные файлы и введите путь и имя исходного файла. Если модель и исходные файлы находятся в различных директориях, введите директорию, которая содержит исходный файл перед именем файла.
Если функция объявлена в заголовочном файле, но не реализована в исходном коде, пустая интерфейсная функция автоматически сгенерирована, чтобы моделировать и скомпилировать модель.
Можно задать порядок того, как матричные данные хранятся в Simulink. Матричные данные передали, и от вашего C функции преобразованы в функциональное размещение массивов по умолчанию, которое вы задали. Если функциональное размещение массивов не задано, матричные данные передается через Вызывающую сторону C в том же порядке ваших данных Simulink, и вычислительные ошибки могут произойти из-за столбца строки главная разрегулировка. Гарантируйте, чтобы вы следовали за тем же функциональным размещением массивов по умолчанию для всех данных Simulink.
Главный столбцом — блок C Caller обрабатывает данные Simulink в порядке развертывания по столбцам. Предположим, что вы имеете 3 3 матрица. В блоке C Caller эта матрица сохранена в последовательности: первый столбец, второй столбец и третий столбец.
Главный строкой — блок C Caller обрабатывает данные Simulink в главном строкой порядке. Предположим, что вы имеете 3 3 матрица. В блоке C Caller это сохранено в последовательности: первая строка, вторая строка и третья строка.
Любой — Данные массива может быть сохранен и в главном столбцом и в главном строкой в блоке C Caller. Можно сгенерировать код и в столбце и в главных строкой настройках.
Не заданный — Данные массива могут быть сохранены и в главном столбцом и в главном строкой порядке. По сравнению с Любой установкой можно только сгенерировать код в главной столбцом установке.
Чтобы узнать больше о размещениях главного массива строки и столбца в Simulink, смотрите функциональное размещение массивов По умолчанию.
Выберите параметр макета массивов под Размещением Функции массива По умолчанию.
Если необходимо применить определенное размещение массивов к некоторым функциям в коде, нажмите на Specify by Function, чтобы выбрать эти функции.
Нажмите Apply, чтобы принять ваши изменения.
Нажмите ОК, чтобы закрыть Параметры конфигурации.
Можно запустить пользовательское интегрирование кода С в Simulink просто путем ввода C Вызывающей стороны в холст Simulink. Также перетащите блок C Caller от Браузера Библиотеки> Пользовательские Функции. Дважды кликните блок, чтобы открыть диалоговое окно Block Parameter, чтобы видеть имена ваших функций и спецификаций порта.
Нажмите на пользовательском коде Обновления, чтобы импортировать ваш исходный код и его зависимости.
Ваши функции C отображены под Именем функции. Если вы не видите свой полный список функций, нажимаете, чтобы повторно импортировать ваш исходный код.
Чтобы просмотреть объявления функции или переменные ввода/вывода к вашим функциям в заголовочном файле, нажимают на Движение к объявлению функции , чтобы переместиться по исходным файлам.
Чтобы изменить исходные файлы и их зависимости, или задать и выбрать функциональные размещения массивов, кликают по настройкам Пользовательского кода , чтобы открыть вкладку Simulation Target в Параметрах конфигурации.
Можно сопоставить аргументы функции 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. Ваши аргументы имеют осциллографы по умолчанию в зависимости от функционального определения, и можно изменить осциллографы, зависящие функциональное определение в исходном коде.
Осциллограф Simulink | C аргумент |
---|---|
входной параметр | блокируйте входной порт |
вывод | блокируйте выходной порт |
параметр | блокируйте настраиваемый параметр |
постоянный | постоянное значение |
Когда у вас есть постоянное определение спецификатора, такое как const double *u
, аргумент может только быть входным параметром или параметром. Когда нет никакого постоянного спецификатора, аргументом является вывод по умолчанию, и можно изменить его на входной параметр или параметр. В этом случае гарантируйте, что функция C не изменяет память, указанную указателем. Если аргумент имеет выходной тип, каждый элемент, указанный этим указателем, должен быть повторно присвоен в каждом призыве к этой функции.
Аргумент C | Осциллограф Simulink |
---|---|
функциональный возврат | вывод |
| выведите (значение по умолчанию), введите, параметр |
| введите (значение по умолчанию), параметр |
Метка — Указывает на метку для соответствующего аргумента в блоке Simulink. По умолчанию ваша метка аргумента - то же самое с именем аргумента, если вы не изменяете его.
Осциллограф Simulink | Метка |
---|---|
введите, выведите | имя порта |
параметр | 'ParameterName' |
постоянный | выражение для постоянного значения. выражения размера с помощью имен входного параметра, например |
Введите — Демонстрирует соответствующий тип данных 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 |
---|---|
| скаляр (1) |
| наследованный (-1) (значение по умолчанию) Если аргумент для выходного порта, размер должен быть задан. Размер выходного порта не может быть наследован. |
| размер [2, 3] |
Можно создать модель библиотеки, чтобы сгруппировать блоки Вызывающей стороны C и сохранить модели организованными.
Откройте новую модель библиотеки из Файла> Новый> Библиотека и нажмите Blank Library.
Открытая Цель Моделирования от Представления> Настройки Пользовательского кода Библиотеки> Цель Моделирования
Выберите C
или C++
в опции Языка, в зависимости от вашего кода, и гарантируйте, что флажок пользовательского кода Импорта устанавливается.
Следуйте инструкциям в, Задают Исходный код и Зависимости, чтобы добавить ваши исходные файлы и их зависимости.
Создайте блоки Вызывающей стороны C, чтобы вызвать функции C.
Чтобы вставить блок от вашей модели библиотеки до моделей 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)
Функция MATLAB | Matlab.system | S-функция | Разработчик S-функции | legacy_code