Несоответствие типов данных с Arduino и Coder.ceval

0

Я пишу блок драйвера устройства simulink для Arduino Due с помощью метода Matlab Function Approach, как описано в руководстве по драйверам Simulink. Когда я хочу передать двойной код C++ в код функции matlab с помощью coder.ceval(), я получаю неправильный номер. Вот пример:

Функция C++:

#include <Arduino.h>
extern "C" double dout_output()
{
return 50.5;
}

Функция Matlab в Simulink:

function x = example()
x = 0.0;
if strcmp(coder.target,'rtw'),
x = coder.ceval('dout_output');
end

Когда я запускаю этот код во внешнем режиме на adruino, я не получаю 50,5, а большое количество, например 1113794816. Какие-либо предложения?

Теги:
arduino
simulink
matlab-coder

1 ответ

2
Лучший ответ

Является ли файл заголовка, содержащий объявление dout_output, включенным в код C, сгенерированный из кода функции MATLAB? Если нет, то вы, вероятно, увидите предупреждения компилятора, которые говорят что - то о неявной int типа возвращаемого значения.

Когда компиляторы C не имеют объявления для функции, они могут предположить, что тип возвращаемого значения - int. Обычно sizeof(int) != sizeof(double). Таким образом, это несоответствие может привести к неожиданным результатам. Этот ответ обсуждает это больше.

Попробуйте добавить:

coder.cinclude('dout_output.h');

к вашему коду MATLAB, где dout_output.h заменяется именем заголовка, содержащего объявление dout_output.

Вам также может потребоваться добавить каталог include в пользовательские настройки кода в:

"Configuration Parameters->Simulation Target->Custom Code->Include Directories"

и возможно:

"Configuration Parameters->Code Generation->Custom Code->Include Directories"

Кроме того, вы можете использовать подход coder.ExternalDependency для инкапсуляции внешних зависимостей кода для вашего кода MATLAB.

  • 0
    Большое вам спасибо, наконец-то это работает. coder.cinclude ( 'nameHeader.h'); сделал свое дело.
  • 0
    @PatrickStegers, мое удовольствие. Рад слышать, что это работает сейчас.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню