无法链接Arduino项目以包含Simulink Code

时间:2012-06-27 20:08:38

标签: arduino simulink avr-gcc

在工作中,我最近接受了MATLAB / Simulink的培训,包括可以为嵌入式应用程序生成C代码的Simulink Coder。我想尝试一下,所以我买了一个Arduino,然后潜入。我能够写出简单的草图而没有问题,但在尝试集成Simulink生成的代码时,它已经碰到了一堵砖墙。

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

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

据我所知,默认的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);

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()

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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