Можно интегрировать новый или существующий код С в Simulink® с помощью блока C Caller. Чтобы создать пользовательские блоки в ваших моделях Simulink, блок C Caller позволяет вам вызывать внешние функции C, заданные во внешнем исходном коде и библиотеках. Преимущества блока the C Caller:
Автоматизированное интегрирование простых функций C
Интеграция с Simulink Coverage™, Simulink Test™ и Simulink Design Verifier™
Интеграция с Simulink Coder™
Блок The C Caller позволяет вам приносить алгоритмы C в Simulink. Чтобы смоделировать динамические системы, используйте S-Function Builder вместо этого. Следующие шаги описывают рабочий процесс, чтобы интегрировать код С в Simulink с помощью блока C Caller.
Задайте свой внешний файл исходного кода, который содержит ваши функции C.
От панели инструментов Simulink откройте Configuration Parameters.
На левой панели выберите Simulation Target.
Чтобы включить парсинг кода блоком C Caller, гарантируйте, что поле Import custom code выбрано.
Директории и пути к файлам могут быть путями к абсолютному и файлу прямого доступа к каталогам модели или к текущей рабочей директории. Смотрите Задают Относительные пути к Вашему Пользовательскому коду (Stateflow).
Выберите Header file и введите имя своего заголовочного файла с #include
тег.
Под Additional build information выберите Include directories и введите папки, где дополнительная информация о сборке, такая как заголовочные файлы, хранится.
Выберите Source files и введите путь и имя исходного файла. Если модель и исходные файлы находятся в различных директориях, введите директорию, которая содержит исходный файл перед именем файла.
Если функция объявлена в заголовочном файле, но не реализована в исходном коде, пустая интерфейсная функция автоматически сгенерирована, чтобы симулировать и скомпилировать модель.
Можно задать порядок того, как матричные данные хранятся в Simulink. Матричные данные передали, и от вашего C функции преобразованы в функциональное размещение массивов по умолчанию, которое вы задаете. Если функциональное размещение массивов не задано, матричные данные передаются через C Caller в том же порядке ваших данных Simulink, и вычислительные ошибки могут произойти из-за упорядоченной по столбцам строкой разрегулировки. Убедитесь, что вы следуете за тем же функциональным размещением массивов по умолчанию для всех данных Simulink.
Упорядоченный по столбцам — блок C Caller обрабатывает данные Simulink в порядке развертывания по столбцам. Предположим, что у вас есть 3х3 матрица. В блоке C Caller эта матрица хранится в этой последовательности: первый столбец, второй столбец и третий столбец.
Упорядоченный по строкам — блок C Caller обрабатывает данные Simulink в упорядоченном по строкам порядке. Предположим, что у вас есть 3х3 матрица. В блоке C Caller эта матрица хранится в этой последовательности: первая строка, вторая строка и третья строка.
Любой — Данные массива может храниться и в упорядоченном по столбцам и упорядоченном по строкам порядке в блоке C Caller. В результате можно сгенерировать код и в упорядоченных по столбцам и упорядоченных по строкам настройках.
Не заданный — Данные массива могут храниться и в упорядоченном по столбцам и в упорядоченном по строкам порядке. По сравнению с установкой Any можно только сгенерировать код в упорядоченной по столбцам установке.
Чтобы узнать больше об упорядоченных по строкам и упорядоченных по столбцам размещениях массивов в Simulink, смотрите функциональное размещение массивов По умолчанию.
Выберите параметр макета массивов под Default Array Function Layout.
Если необходимо применить определенное размещение массивов к некоторым функциям в коде, нажмите Specify by Function, чтобы выбрать эти функции.
Нажмите Apply, чтобы принять ваши изменения.
Нажмите OK, чтобы закрыть Configuration Parameters.
Можно запустить пользовательское интегрирование кода С в Simulink путем ввода C Вызывающей стороны в холсте Simulink. В качестве альтернативы перетащите блок C Caller из Library Browser> User-Defined Functions. Дважды кликните блок, чтобы открыть диалоговое окно Block Parameters, чтобы видеть имена ваших функций и спецификаций порта.
Нажмите на Refresh custom code, чтобы импортировать ваш исходный код и его зависимости.
Ваши функции C отображены под Function Name. Если вы не видите свой полный список функций, нажимаете, чтобы повторно импортировать ваш исходный код.
Чтобы просмотреть объявления функции или переменные ввода/вывода к вашим функциям в заголовочном файле, нажмите Go to function declaration , чтобы переместиться по исходным файлам.
Чтобы изменить исходные файлы и их зависимости, или задать и выбрать функциональные размещения массивов, нажимают Custom code settings , чтобы открыть вкладку Simulation Target в Параметрах конфигурации.
Можно сопоставить аргументы функции C от исходного кода до портов Simulink с помощью таблицы Port specification в блоке C Caller и путем создания FunctionPortSpecification
объект через командную строку. В вашем исходном коде заголовочный файл включает аргументы функции C, которые будут соединены с портами Simulink.
extern void mean_filter(const unsigned char* src, unsigned char* dst, unsigned int width, unsigned int height, unsigned int filterSize);
Port specification показывает детали ваших аргументов и как они соединяются с вашим блоком C Caller в Simulink.
ArgName Задает имя аргументов ввода и вывода. Arg name является аргументом функции или названием параметра, как задано в ваших функциях C из исходного кода. Этот столбец в ссылочных целях только.
Осциллограф Задает, как аргументы функции C сопоставляют с Осциллографом Simulink. Ваши аргументы имеют осциллографы по умолчанию в зависимости от функционального определения, и можно изменить осциллографы, зависящие функциональное определение в исходном коде.
Осциллограф Simulink | Определите объем, чтобы блокировать отображение |
---|---|
input | Блокируйте входной порт |
output | Блокируйте выходной порт |
inputoutput | Блокируйте порт ввода и вывода |
parameter | Блокируйте настраиваемый параметр |
constant | Постоянное значение |
Когда у вас есть постоянное определение спецификатора, такое как const double *u
, аргумент может только быть входом или параметром. Когда нет никакого постоянного спецификатора, аргументом является выход по умолчанию, и можно изменить его в input
, inputoutput
или к parameter
осциллограф. В этом случае гарантируйте, что функция C не изменяет память, указанную указателем. Если аргумент имеет output
введите, каждый элемент, указанный этим указателем, должен быть повторно присвоен в каждом призыве к этой функции.
C аргумент | Осциллограф Simulink |
---|---|
Функциональный возврат |
|
| input , parameter , constant |
|
|
| output (значение по умолчанию), inputoutput входной параметр , parameter |
|
|
К аргументам функции карты C к inputoutput
порт, задайте переменную как указатель в ваших функциональных определениях.
extern void mean_filter(unsigned char* src, unsigned int width, unsigned int height, unsigned int filterSize);
Затем выберите спецификацию порта к inputoutput
определите объем в таблице Port Specification и присвойте получившийся функциональный выход входной переменной в пользовательской функции.
Метка — Указывает на метку для соответствующего аргумента в блоке Simulink. По умолчанию ваша марка аргумента совпадает с именем аргумента, если вы не изменяете его.
Осциллограф Simulink | Метка порта Simulink |
---|---|
| Имя порта |
inputoutput | Имя порта в обоих портах ввода и вывода |
| '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 Caller берет целочисленный тип, например, int16_t, можно изменить его к фиксированной точке с соответствием с базовым типом, например, к fixdt (1, 16, 3). ** Кнопка синхронизации C Caller предлагает вам импортировать struct или перечислимые типы, используемые функцией C в качестве шины Simulink и перечисляемых типов. |
Размер — Задает размерности данных в аргументе.
C размерности аргумента | Размерности порта Simulink |
---|---|
| скаляр (1) |
| наследованный (-1) (значение по умолчанию) Если аргумент для выходного порта, размер должен быть задан. Размер выходного порта не может быть наследован. |
| наследованный (-1) (значение по умолчанию) Если аргумент для |
| Размер [2, 3]. |
FunctionPortSpecification
Объект и редактирование свойства блока C CallerЧтобы изменить свойства таблиц Port Specification программно, можно создать FunctionPortSpecification
возразите и измените его свойства. Создать FunctionPortSpecification
объект для выбранного блока C Caller в модели, введите в командной строке:
myCCallerConfigObj = get_param(gcb, 'FunctionPortSpecification')
myCCallerConfigObj = FunctionPortSpecification with properties: CPrototype: 'real_T add(real_T u1, real_T u2);' InputArguments: [1×2 Simulink.CustomCode.FunctionArgument] ReturnArgument: [1×1 Simulink.CustomCode.FunctionArgument]
CPrototype
свойство только для чтения, и показывает объявление переменных входного параметра функции C. InputArgument
и ReturnArgument
свойства создают FunctionArgument
возразите, что можно далее отредактировать его свойства согласно правилам, заданным для приведенной выше таблицы Port Specification. Смотрите FunctionPortSpecification
узнавать больше.Можно создать модель библиотеки, чтобы сгруппировать блоки C Caller и сохранить модели организованными.
Откройте новую модель библиотеки. На вкладке Simulation выберите New> Library.
На вкладке Modeling, под Design, нажимают Simulation Custom Code.
Выберите C
или C++
в опции Language, в зависимости от вашего кода, и гарантируют, что поле Import custom code выбрано.
Следуйте инструкциям в, Задают Исходный код и Зависимости, чтобы добавить ваши исходные файлы и их зависимости.
Создайте блоки C Caller, чтобы вызвать функции C.
Чтобы вставить блок от вашей модели библиотеки до модели Simulink, просто перетащите блок в свою модель.
Чтобы присоединить внешний отладчик к процессу MATLAB® и отладить внешний код С, генерируют использование отладочных символов:
Simulink.CustomCode.debugSymbols = 1
Глобальная Инициализация состояний C — Если ваше чтение функций C или запись глобальные или статические переменные, наблюдайте порядок. Например, если несколько функций C получают доступ к тому же набору глобальных переменных, порядок выполнения блоков может привести к неожиданным результатам.
Инициализация/Завершение Настроек Пользовательского кода — Если необходимо выделить и освободить память для пользовательского кода, вставить, выделяет и освобождает в полях Initialize function и Terminate function настроек пользовательского кода.
Блок 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 Caller, смотрите Тест Интегрированный код С (Simulink Test).
C Caller | FunctionPortSpecification
| MATLAB Function | MATLAB System | S-Function | S-Function Builder | legacy_code