无法链接Arduino项目以包含Simulink代码

无法链接Arduino项目以包含Simulink代码,arduino,simulink,avr-gcc,Arduino,Simulink,Avr Gcc,在工作中,我最近接受了MATLAB/Simulink的培训,包括可以为嵌入式应用程序生成C代码的Simulink编码器。我想尝试一下,所以我买了一辆Arduino,并投入其中。我能够毫无问题地编写简单的草图,但在尝试集成Simulink生成的代码时遇到了困难 我最初使用Arduino IDE,然后使用带有Arduino插件的Eclipse,最后使用带有embedXcode模板的Xcode。(我使用Simulink的工作机器是一台PC,但我不允许安装“未经授权的软件”,所以我在家里的Mac上安装了

在工作中,我最近接受了MATLAB/Simulink的培训,包括可以为嵌入式应用程序生成C代码的Simulink编码器。我想尝试一下,所以我买了一辆Arduino,并投入其中。我能够毫无问题地编写简单的草图,但在尝试集成Simulink生成的代码时遇到了困难

我最初使用Arduino IDE,然后使用带有Arduino插件的Eclipse,最后使用带有embedXcode模板的Xcode。(我使用Simulink的工作机器是一台PC,但我不允许安装“未经授权的软件”,所以我在家里的Mac上安装了其余的软件。)这三台机器都使用相同的avr gcc编译器

这三个函数在生成的函数调用上都有相同的失败点:“未定义引用”错误。我认为这是一个链接器问题,而不是基本语法或头包含问题,因为Eclipse和Xcode代码完成工作正常,如果我以任何方式更改调用签名,错误也会改变。我可以参考数据结构

据我所知,默认的makefile被设置为编译和链接文件夹中的任何文件。正在创建一个“mass_model2.o”文件,至少使用Xcode。最后,如果我用一个简单的函数调用手动编写一个单独的“myFunction.c”和“myFunction.h”文件,这将按照预期在设备上编译和运行

在desparation中,我复制了生成的“.c”文件的全部内容,并将它们粘贴在我的
setup()
loop()
函数之后的主草图文件中,保留了相同的“.h”引用,并从项目中删除了“.c”文件。这实际上是编译并运行的!但是,我不应该为了使用它而触摸生成的代码

我需要做什么才能正确编译和链接

Simulink代码非常冗长,因此以下是关键部分:

mass_model2.h摘录:

#include "rtwtypes.h"
#include "mass_model2_types.h"

/* External inputs (root inport signals with auto storage) */
typedef struct {
  int16_T PotPos;                      /* '<Root>/PotPos' */
} ExternalInputs_mass_model2;

/* External outputs (root outports fed by signals with auto storage) */
typedef struct {
  int16_T ServoCmd;                    /* '<Root>/ServoCmd' */
} ExternalOutputs_mass_model2;

/* External inputs (root inport signals with auto storage) */
extern ExternalInputs_mass_model2 mass_model2_U;

/* External outputs (root outports fed by signals with auto storage) */
extern ExternalOutputs_mass_model2 mass_model2_Y;

/* Model entry point functions */
extern void mass_model2_initialize(void);
extern void mass_model2_step(void);
#include "mass_model2.h"
#include "mass_model2_private.h"

/* External inputs (root inport signals with auto storage) */
ExternalInputs_mass_model2 mass_model2_U;

/* External outputs (root outports fed by signals with auto storage) */
ExternalOutputs_mass_model2 mass_model2_Y;

/* Model step function */
void mass_model2_step(void)
{
    // lots of generated code here
}

/* Model initialize function */
void mass_model2_initialize(void)
{
    // generated code here
}
其他引用的标题“rtwtypes.h”和“mass\u model2\u private.h”定义了生成的代码所使用的特定类型,如
int16\u T
。这些文件包含在项目中,我没有收到任何与它们相关的错误


在我的草图文件中,
setup()
函数调用
mass\u model2\u initialize()
loop()
读取我的输入(电位计),在
mass\U model2\U.PotPos
中设置值,并调用
mass\U model2\U step()
。然后,它获取
mass\u model2\u Y.ServoCmd
并将值写入伺服进行输出,最后有一个
delay()

您可以使用此下载,使用Simulink、Simulink编码器和嵌入式编码器。确保每个工具的版本号正确。

主草图上需要
#include“Arduino.h”
语句

看起来我应该使用这个版本,因为我使用的是R2012a:。我给它一个升级投票,因为它应该工作,虽然我现在无法安装它。(我在该页向Mathworks提出了一个问题…)我看到的有关直接支持的信息表明,I/O支持有限,不包括伺服驱动;这一版本似乎是正确的。