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

Я пишу блок драйвера устройства Simulink для Arduino из-за подхода Matlab Function, как описано в руководстве по драйверу устройства 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. Любые предложения?

0

Решение

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

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

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

coder.cinclude('dout_output.h');

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

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

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

и возможно:

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

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

2

Другие решения


По вопросам рекламы [email protected]