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