【问题标题】:Cannot link Arduino project to include Simulink Code无法链接 Arduino 项目以包含 Simulink 代码
【发布时间】:2012-06-27 20:08:37
【问题描述】:

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

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

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

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

无奈之下,我复制了生成的“.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);

mass_model2.c 摘录:

#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_model2_private.h”定义了生成代码使用的特定类型,例如int16_T。这些文件包含在项目中,我没有收到任何与它们相关的错误。

在我的草图文件中,setup() 函数调用mass_model2_initialize()loop() 读取我的输入(电位器),在mass_model2_U.PotPos 中设置值,然后调用mass_model2_step()。然后它得到mass_model2_Y.ServoCmd并将值写入伺服输出,最后得到delay()

【问题讨论】:

    标签: arduino simulink avr-gcc


    【解决方案1】:

    您可以将此下载 http://www.mathworks.com/matlabcentral/fileexchange/24675 与 Simulink、Simulink Coder 和 Embedded Coder 一起使用。确保您拥有每个工具的正确版本号。

    【讨论】:

    • 看来我应该使用这个版本,因为我使用的是 R2012a:mathworks.com/matlabcentral/fileexchange/35639。我对此表示赞同,因为它应该可以工作,尽管我目前无法安装它。 (我已经在该页面上向 Mathworks 提出了一个问题......)我看到的有关直接支持的信息表明 I/O 支持是有限的并且不包括伺服驱动器;这个版本似乎。
    【解决方案2】:

    主草图上需要#include "Arduino.h" 语句。

    【讨论】:

      猜你喜欢
      • 2021-06-17
      • 2015-08-04
      • 2021-10-29
      • 1970-01-01
      • 2012-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多