数据类型与arduino和coder.ceval不匹配

Datatype mismatch with arduino and coder.ceval

本文关键字:ceval 不匹配 coder arduino 数据类型      更新时间:2023-10-16

我正在使用Matlab函数方法为Arduino Due编写一个simulink设备驱动程序块,如Simulink设备驱动程序指南中所述。当我想使用 coder.ceval() 将双精度从 C++ 代码传递到 matlab 函数代码时,我得到一个错误的数字。下面是一个示例:

C++功能:

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

Simulink 中的 Matlab 函数:

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

当我在 adruino 上以外部模式运行此代码时,我没有得到 50.5,而是像 1113794816 这样的大数字。有什么建议吗?

包含dout_output声明的头文件是否包含在从 MATLAB 函数代码生成的 C 代码中?如果没有,您可能会看到编译器警告,其中说明了隐式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 代码的外部代码依赖项。