在工作中,我最近接受了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()
。
答案 0 :(得分:1)
您可以将此下载http://www.mathworks.com/matlabcentral/fileexchange/24675与Simulink,Simulink Coder和Embedded Coder一起使用。确保每个工具都有正确的版本号。
答案 1 :(得分:0)
主草图上需要#include "Arduino.h"
语句。