2012-06-27 14 views
0

在工作中,我最近接受了有關MATLAB/Simulink的培訓,其中包括可以爲嵌入式應用程序生成C代碼的Simulink編碼器。我想嘗試一下它,所以我買了一個Arduino,然後插入。我能夠寫出沒有問題的簡單草圖,但是在嘗試集成Simulink生成的代碼時碰到了磚牆。無法連接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」文件,它將按照預期編譯並在設備上運行。

我絕望地複製了生成的「.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()

回答

1

您可以使用此下載,http://www.mathworks.com/matlabcentral/fileexchange/24675,與Simulink,Simulink編碼器和嵌入式編碼器。確保你有每個工具的正確版本號。

+0

它看起來像我應該使用這個版本,因爲我使用R2012a:http://www.mathworks.com/matlabcentral/fileexchange/35639。我爲此付出了努力,因爲它*應該*工作,雖然我現在無法安裝它。 (我在該頁面上向Mathworks提出了一個問題...)我看到的關於直接支持的信息表明I/O支持有限,並且不包括伺服驅動器;此版本顯示。 – mbmcavoy

0

主草圖上需要聲明#include "Arduino.h"