Несоответствие типов данных с arduino и coder.ceval

Я пишу блок драйвера устройства simulink для Arduino Due с подходом к функциям Matlab, как описано в руководстве по драйверу устройства 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. Есть предложения?


person Community    schedule 30.01.2015    source источник


Ответы (1)


Заголовочный файл содержит объявление 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"

В качестве альтернативы вы можете использовать _10 _ подход к инкапсуляции зависимостей внешнего кода для вашего кода MATLAB.

person Ryan Livingston    schedule 30.01.2015
comment
Большое спасибо, наконец-то работает. coder.cinclude ('nameHeader.h'); сделали свое дело. - person ; 30.01.2015