Интегрируйте код С Используя блоки C Caller

Можно интегрировать новый или существующий код С в 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.

  1. От панели инструментов Simulink откройте Configuration Parameters.

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

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

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

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

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

  6. Выберите 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, смотрите функциональное размещение массивов По умолчанию.

  1. Выберите параметр макета массивов под Default Array Function Layout.

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

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

  4. Нажмите OK, чтобы закрыть Configuration Parameters.

Вызовите блок C Caller и задайте порты

Можно запустить пользовательское интегрирование кода С в Simulink путем ввода C Вызывающей стороны в холсте Simulink. В качестве альтернативы перетащите блок C Caller из Library Browser> User-Defined Functions. Дважды кликните блок, чтобы открыть диалоговое окно Block Parameters, чтобы видеть имена ваших функций и спецификаций порта.

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

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

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

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

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

Можно сопоставить аргументы функции 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

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

output

double u

input, parameter, constant

double u[]

double u[][2]

double u[2][3]

output (значение по умолчанию), input, parameter

double *u

output (значение по умолчанию), inputoutputвходной параметр, parameter

const double *u

const double u[]

const double u[][2]

const double u[2][3]

input (значение по умолчанию), 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

inputвывод

Имя порта
inputoutputИмя порта в обоих портах ввода и вывода

parameter

'ParameterName'

constant

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

выражения размера с помощью имен входного параметра, например, 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 Caller берет целочисленный тип, например, int16_t, можно изменить его к фиксированной точке с соответствием с базовым типом, например, к fixdt (1, 16, 3).

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

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

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

double u

скаляр (1)

double u[]

double u[][2]

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

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

double *u

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

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

double u[2][3]

Размер [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

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

  1. Откройте новую модель библиотеки. На вкладке Simulation выберите New> Library.

  2. На вкладке Modeling, под Design, нажимают Simulation Custom Code.

  3. Выберите C или C++ в опции Language, в зависимости от вашего кода, и гарантируют, что поле Import custom code выбрано.

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

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

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

Сгенерируйте отладочные символы для пользовательского кода

Чтобы присоединить внешний отладчик к процессу MATLAB® и отладить внешний код С, генерируют использование отладочных символов:

Simulink.CustomCode.debugSymbols = 1
После того, как вы включаете эту установку и обновляете вашу модель, ваши отладочные символы сгенерированы, и можно присоединить внешний отладчик к процессу MATLAB.

Ограничения

  • Глобальная Инициализация состояний 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).

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

| | | | | |

Похожие темы

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