【阿福的隨筆】Embitz 程式轉換 IDE 平台,需注意的細項_V1.0

1 何謂 Embitz

Embitz是一種免費的 IDE,使用的 compiler tool 是 GNU tool,也就是 GCC compiler,MCUxpresso 也是 NXP 提供的 免費 IDE , 而且內建 GNU tool ,
無需安裝, Embitz 目前不支援新一代的 cortex-M33 ,若是想要再使用原來的 code base 來延展是不能使用的,但轉換 IDE過程中總會遇到一些麻煩,
本文是把有可能遇到的問題做個整理。


2 轉換需注意的地方

2.1 C++ 指令

若是 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

 
圖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 來修改成正確的。

 

2.2假指令

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

 

2.3 程式定址和記憶體的配置

若是程式定址不為 0的話,是在哪裡設定呢?

Embitz : 在 project按滑鼠右鍵 的屬性 ( Properties )=>

Build targets 使用的 .ld ,load file 的詳細路徑,可按下方的按鈕

“Selected file properties” ,如圖 2.3.1

圖2.3.1

 

利用其它的編輯器打開此 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

 
圖2.3.2

MCUXpresso 可以在 項目資源管理器的 Memory 直接看目前的設定值,但無法修改。要在Memory details 下修改

MCUXpresso  : 在 project按滑鼠右鍵 的屬性=>

MCU Settings => Memory details 的視窗來修改,如圖 2.3.3~2.3.4

圖2.3.3
 
圖2.3.4

 

2.4 其它的可能

  1. 如果使用 SDK/或是 new project 的 .s ( Startup file ),有可能跟原本 Embitz 所使用的 IRQ handler 的名字會有一些差異,需要每個使用到 IRQ的名稱修改成一致 
  1. startup file 的初始化設定不同,檢查一下原來的 startup file 是不是有增加一些指令在這裡。 
  1. 檢查 link file 或是 load file 是不是有其它的規劃 
  1. 若是不能燒錄 或 debug ,需再檢查 燒錄器 的相關設定 
  1. 是不是有ASM define,所以造成 條件編譯 有所不同,如  Embitz 在 project按滑鼠右鍵 的 Build option =>Assembler settings => Assembler Symbols
  1. 若是 compiler 還有error /warning,請依照提示進行 debug

 

★博文內容均由個人提供,與平台無關,如有違法或侵權,請與網站管理員聯繫。

★文明上網,請理性發言。內容一周內被舉報5次,發文人進小黑屋喔~

評論