Я пишу блок драйвера устройства 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. Любые предложения?
Заголовочный файл, содержащий объявление 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.