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