1 何謂 Embitz
Embitz是一種免費的 IDE,使用的 compiler tool 是 GNU tool,也就是 GCC compiler,MCUxpresso 也是 NXP 提供的 免費 IDE , 而且內建 GNU tool ,
無需安裝, Embitz 目前不支援新一代的 cortex-M33 ,若是想要再使用原來的 code base 來延展是不能使用的,但轉換 IDE過程中總會遇到一些麻煩,
本文是把有可能遇到的問題做個整理。
2 轉換需注意的地方
若是 Embitz 內使用了 C++ 指令,若是不多的話,可以 改寫回 C,但很多的話就比較麻煩了,因為從 C轉成 C++ 是可行的,但若是要從 C++ 轉回 C ,就只能看程式是要做什麼再自行改寫成 C 才行,工程上需先解讀每個 function code,了解其用途之後才能再改寫,是有點麻煩的步驟。不然就是把 IDE 修改成 C++ poject的方式,如下方的鏈結。
https://mcuoneclipse.com/2020/07/11/from-c-to-c-converting-eclipse-c-projekts/
文件=> New C/C++ project > Project Type 勾選 C++ project,如圖 2.1.1~2.1.2
另外檔案的部份 C 轉 C++,把副檔名改成 *.cpp 就好,並將 header file 加上 extern “C”=>
#if defined(__cplusplus)
extern "C" {
#endif /* __cplusplus */
/*******************************************************************************
* API
******************************************************************************/
void BOARD_Init (void);
…
#if defined(__cplusplus)
}
#endif /* __cplusplus */
,還有問題再看編譯器的提示除錯。例如C++ 不允許 void * 隱式轉換為任意型別 T 的指標,但在 C 是可行的,所以必須要指定是何種指標,若是真的不知道就先編譯,再看 compiler warn/error information 來修改成正確的。
MCUxpresso出現下面的錯誤undefined reference to “_sbrk”,”_close” ,
”_fstat”,” _read”,”_write”。是因為 Embitz 引用 靜態庫 libnosys.a 使用參數 --specs=nosys.specs ,但 library 不同的 IDE 不能使用。在這種情況下,只需更改正在使用的 library 成 Newlib 和 NewlibNano,或刪除調用的 function code。例如是要用 UART 則可自行改寫另一個名稱的 簡易型的 print ,並將調用的 function 都一起改名。
MCUXpresso 使用的 Library 有三種=>
- Redlib Our own (non-GNU) ISO C90 standard C library, with some C99 extensions.
- Newlib GNU C/C++ library
- NewlibNano a version of the GNU C/C++ library optimized for embedded.
因為 MCUXpresso 與 Embitz 都屬於 GCC 的 IDE ,所以在假指令,基本上是相同的,但若是 使用 Keil or IAR 的 IDE ,所有的 假指令都還需要再用 compiler option remap。 這個部份也需要一個一個修改才行。
例如 =>
#if defined(__GNUC__) /* GNU Compiler */
#ifndef __ALIGN_END
#define __ALIGN_END __attribute__((aligned(4)))
#endif
#ifndef __ALIGN_BEGIN
#define __ALIGN_BEGIN
#endif
#else
#ifndef __ALIGN_END
#define __ALIGN_END
#endif
#ifndef __ALIGN_BEGIN
#if defined(__CC_ARM) || defined(__ARMCC_VERSION) /* Keil old or New version ARM Compiler */
#define __ALIGN_BEGIN __attribute__((aligned(4)))
#elif defined(__ICCARM__) /* IAR Compiler */
#define __ALIGN_BEGIN
#endif
#endif
#endif
若是程式定址不為 0的話,是在哪裡設定呢?
Embitz : 在 project按滑鼠右鍵 的屬性 ( Properties )=>
Build targets 使用的 .ld ,load file 的詳細路徑,可按下方的按鈕
利用其它的編輯器打開此 load file ,例如使用 MS Word or PSPad 來編輯 gcc_arm.ld
其中 Flash 的 ORIGIN 是 code Flash的起始位址,後面的長度就是這個 project使用的 Flash size.
而 RAM 的 ORIGIN 是 code RAM 的起始位址,後面的長度就是這個 project使用的 RAM size.
如果是有切割成,前後兩個 Firmware ,就要在這裡查看一下定址位址。再去另一個 IDE 修改,如圖 2.3.2
MCUXpresso 可以在 項目資源管理器的 Memory 直接看目前的設定值,但無法修改。要在Memory details 下修改
MCUXpresso : 在 project按滑鼠右鍵 的屬性=>
2.4 其它的可能
- 如果使用 SDK/或是 new project 的 .s ( Startup file ),有可能跟原本 Embitz 所使用的 IRQ handler 的名字會有一些差異,需要每個使用到 IRQ的名稱修改成一致
- startup file 的初始化設定不同,檢查一下原來的 startup file 是不是有增加一些指令在這裡。
- 檢查 link file 或是 load file 是不是有其它的規劃
- 若是不能燒錄 或 debug ,需再檢查 燒錄器 的相關設定
- 是不是有ASM define,所以造成 條件編譯 有所不同,如 Embitz 在 project按滑鼠右鍵 的 Build option =>Assembler settings => Assembler Symbols
- 若是 compiler 還有error /warning,請依照提示進行 debug
評論