Понимание сгенерированного C-кода. Как обмениваться аргументами и возвращать значения? - PullRequest
0 голосов
/ 28 августа 2018

У меня есть вопрос новичка. Я новичок в программировании и успешно сгенерировал свой первый C-код из Simulink. Но я не понимаю, как вход и выход проходят функцию. Как работает эта функция? Он не имеет аргументов и возвращаемых значений, но обеспечивает расчет. Как основная программа взаимодействует с этой функцией?

firstTest.c генерирует функции инициализации, шага и завершения. Шаг - это расчет.

 // firstTest.c
 void firstTest_step(void)
 {    
   Test_Y.Out = 2.0 + Test_U.In;
 }

firstTest.h генерирует соответствующие файлы заголовков для firstTest.c

// firstTest.h
extern void firstTest_step(void);

Мой план - как-то использовать эту функциональность в моем собственном приложении на c #. Решение, вероятно, будет содержать pinvoke для обработки неуправляемого кода. Поскольку я не понимаю эту функцию, я попытался немного поиграть и обнаружил, что можно настроить функцию шага, чтобы генератор кода создавал функцию шага из той же модели так, чтобы я видел аргументы с которым я могу работать! (Я даже не знаю, если это необходимо?). Итак, второй тест выглядит так:

// secondTest.c
void secondTest_step(real_T In, real_T *Out)
    {     
      *Out = 2.0 + In;
    }

Сгенерированный заголовочный файл для этого:

// secondTest.h
extern void secondTest_step(real_T In, real_T *Out);

Теперь Simulink предоставляет возможность генерировать C DLL. Так что это то, что я попытался успешно, мне нужно было только изменить заголовок с помощью __declspec в соответствии с документацией mathworks / simulink. Прямо сейчас мой код выглядит так:

// The DLL in which __declspec(dllexport) is a custom modification
__declspec(dllexport) void secondTest(real_T In, real_T *Out)

Является ли secondTest правильным подходом для обмена данными с внешним приложением, которое хочет использовать функциональность простого шага (out = in + 2)? Моя самая большая путаница все еще связана с функцией void-void. Я могу понять, что вы можете передавать аргументы через функцию с помощью указателей, а не «нормальных» аргументов. Но я не вижу, как работает сгенерированная функция firstTest.c? У него нет указателей и значений в качестве аргументов, только вычисления без возвращаемого значения.

1 Ответ

0 голосов
/ 06 сентября 2018

В случае firstTest входная структура Test_U и выходная структура Test_Y являются глобальными, поэтому их можно установить из кода оболочки / интеграции.

Настройки по умолчанию позволяют генерировать автономный exe-файл, поэтому эти глобальные структуры объявляются и определяются. Поэтому, как правило, интерфейс сгенерированного настраивается. Вот почему Simulink предлагает все опции для настройки самой функции, а также способ отображения отдельного сигнала в коде.

...