Вызов функций библиотеки C в графиках C

Stateflow® графики в Simulink® модели имеют свойство языка действий, которое задает синтаксис для действий состояния и перехода. Значок в левом нижнем углу холста графика указывает язык действий для графика.

  • MATLAB® как язык действий.

  • C как язык действия.

Вызов функций библиотеки C

Можно вызвать это подмножество функций C Math Library:

abs* **

acos**

asin**

atan**

atan2**

перекрыть**

потому что**

дубинка**

exp**

fabs

пол**

fmod**

labs

ldexp**

журнал**

log10**

голова**

rand

sin**

sinh**

sqrt**

tan**

tanh**

 

* The Stateflow abs функция выходит за рамки стандартного аналога C с собственной встроенной функциональностью. Для получения дополнительной информации смотрите Вызов функции abs.

** Можно также заменить вызовы библиотеки C Math на специфичные для приложения реализации для этого подмножества функций. Для получения дополнительной информации смотрите Замена функций Math Library на Реализации приложения.

При вызове этих функций применяется двойная точность, если все входные параметры не являются явно одинарной точностью. Когда происходит несоответствие типа, приведение входных параметров к ожидаемому типу заменяет исходные аргументы. Для примера, если вы вызываете sin функция с целым аргументом, приведение входного параметра к числу с плавающей запятой типа double заменяет исходный аргумент.

Примечание

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

Если вы вызываете другие функции библиотеки C, не перечисленные выше, включите соответствующую #include... оператор на панели Simulation Target параметров конфигурации.

Вызов функции abs

Толкование abs Stateflow функция выходит за пределы стандартной версии C и включает целое число и аргументы с плавающей точкой всех типов следующим образом:

  • Если x - целое число типа int32 или int64, стандартная функция C abs применяется к x, или abs(x).

  • Если x - целое число типа int16 или int8, стандартный C abs функция применяется к приведению x как целое число типа int32, или abs((int32)x).

  • Если x является число с плавающей запятой типа double, стандартная функция C fabs применяется к x, или fabs(x).

  • Если x является число с плавающей запятой типа single, стандартная функция C fabs применяется к a приведение x как double, или fabs((double)x).

  • Если x является номером с фиксированной точкой, стандартной функцией C fabs применяется к приведению номера с фиксированной точкой как double, или fabs((double) Vx), где V x является реальным значением x.

Если вы хотите использовать abs функция в строгом смысле стандарта C приводит ее аргумент или возвращает значения к целым типам. См. Раздел Операций приведения типов»

Примечание

Если вы заявляете x в пользовательском коде стандартный C abs функция применяется во всех случаях. Инструкции по вставке пользовательского кода в графики см. в разделе Повторное использование пользовательского кода в диаграммах Stateflow.

Вызов функций min и max

Можно вызвать min и max автоматически излучая следующие макросы в верхней части сгенерированного кода.

#define min(x1,x2) ((x1) > (x2) ? (x2):(x1))
#define max(x1,x2) ((x1) > (x2) ? (x1):(x2))

Чтобы разрешить совместимость с пользовательскими графическими функциями с именем min() или max(), сгенерированный код использует искривленное имя следующей формы: <prefix>_min. Однако, если вы экспортируете min() или max() графические функции к другим графикам в вашей модели, имя этих функций больше не может быть испущено с искаженными именами в сгенерированном коде и возникает конфликт. Чтобы избежать этого конфликта, переименуйте min() и max() графические функции.

Замена функций Math Library на реализации приложений

Можно сконфигурировать генератор кода, чтобы изменить код, который он генерирует для функций математической библиотеки, так чтобы код соответствовал требованиям приложения. Для этого сконфигурируйте генератор кода, чтобы применить библиотеку замены кода (CRL) во время генерации кода. Если у вас есть Embedded Coder® лицензия, вы можете разрабатывать и применять пользовательские библиотеки замены кода.

Для получения дополнительной информации о замене кода используйте библиотеки замены кода, которые MathWorks® предоставляет, см. Что такое замена кода? (Simulink Coder) и библиотеки замены кода (Simulink Coder). Для получения информации о разработке пользовательских библиотек замещения кода смотрите Что такое индивидуальная настройка замещения кода? (Embedded Coder) и код, который можно заменить из моделей Simulink (Embedded Coder).

Вызов функций пользовательского кода С

Можно задать пользовательские функции кода для использования в графиках C для симуляции и генерации кода C.

Задайте пользовательские функции C для симуляции

Чтобы задать пользовательские функции C для симуляции:

  1. Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters).

  2. Выберите Simulation Target.

  3. Укажите свои пользовательские файлы C, как описано в Access Custom C Code in Nonlibrary Charts.

Задайте пользовательские функции C для генерации кода

Чтобы задать пользовательские функции C для генерации кода:

  1. Откройте диалоговое окно Параметры конфигурации модели (Model Configuration Parameters).

  2. Выберите Code Generation > Custom Code.

  3. Укажите свои пользовательские файлы C, как описано в Integrate External Code for All Charts (Simulink Coder).

Инструкции по вызову пользовательских функций C на графике

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

  • Передайте параметры в пользовательские функции с помощью одинарных кавычек. Для примера, func('string').

  • Действие может вложить вызовы функций.

  • Действие может вызвать функции, которые возвращают скалярное значение (типа double в случае функций MATLAB и любого типа в случае пользовательских функций C).

Инструкции по записи пользовательских функций C, которые получают доступ к входным векторам

  • Используйте sizeof функция для определения длины входного вектора.

    Например, ваша пользовательская функция может включать цикл for-loop, который использует sizeof следующим образом:

    for(i=0; i < sizeof(input); i++) {
    ......
    }
  • Если ваша пользовательская функция использует значение длины входного вектора несколько раз, включите в свою функцию вход, который задает длину входного вектора.

    Для примера можно использовать input_length как второй вход в sum функционировать следующим образом:

    int sum(double *input, double input_length)
    

    Ваши sum функция может включать цикл for-loop, который итератируется по всем элементам входного вектора:

    for(i=0; i < input_length; i++) {
    ......
    }

Вызов функции в переходном действии

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

Вызов функции для fcn1 происходит с arg1, arg2, и arg3 если следующее имеет значение true:

  • S1 активно.

  • Событийные e происходит.

  • Условие c является true.

  • Пункт назначения перехода S2 является допустимым.

Переходное действие на переходном этапе от S2 на S3 показывает вызов функции, вложенный в другой вызов функции.

Вызов функции в состояние активности

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

Выполнение графика происходит следующим образом:

  1. Когда переход по умолчанию в S1 происходит, S1 становится активным.

  2. The entry действие, вызов функции для fcn1 с указанными аргументами выполняется.

  3. Через 5 секунд времени симуляции S1 становится неактивным и S2 становится активным.

  4. The during действие, вызов функции для fcn2 с указанными аргументами выполняется.

  5. Через 10 секунд времени симуляции S2 становится неактивным и S1 снова становится активным.

  6. Шаги 2-5 повторяются до окончания симуляции.

Передайте аргументы по ссылке

Действие Stateflow может передавать аргументы в написанную пользователем функцию по ссылке, а не по значению. В частности, действие может передать указатель на значение, а не само значение. Для примера действие может содержать следующий вызов:

f(&x);

где f является пользовательским кодом функции C, которая ожидает, что указатель будет x как аргумент.

Если x - имя элемента данных, заданное в иерархии Stateflow, применяются следующие правила:

  • Не используйте указатели, чтобы передать элементы данных, введенные из модели Simulink.

    Если необходимо передать элемент входа по ссылке, для примера массива присвойте элемент локальному элементу данных и передайте локальный элемент по ссылке.

  • Если x является выходным элементом данных Simulink, имеющим тип данных, отличный от double, свойство графика, Use Strong Data Typing with Simulink I/O должно быть включено (см. «Задание свойств для диаграмм Stateflow»).

  • Если тип данных x является booleanнеобходимо выключить опцию кодера Использовать битсеты для хранения строения состояния.

  • Если x - массив с первым индексом набора свойств 0 (см. Set Свойств данных), затем необходимо вызвать функцию следующим образом.

    f(&(x[0]));

    Это передает указатель на первый элемент x в функцию.

  • Если x - массив с первым индексом, набором свойств ненулевым числом (для примера, 1), функция должна вызываться следующим образом:

    f(&(x[1]));

    Это передает указатель на первый элемент x в функцию.