近期建立工程加入了 Segger RTT源碼編譯,發現什麼都沒做卻報錯了,具體錯誤代碼如下所示:
.....
warning: #47-D: incompatible redefinition of macro "SEGGER_RTT_LOCK" (declared at line 199)
warning: #47-D: incompatible redefinition of macro "SEGGER_RTT_UNLOCK" (declared at line 200)
......
始終找不到錯誤原因,然後對比原來的工程發現新工程中勾選了GNU extensions選項。然後去掉該選項就可以成功編譯。
分析原因: 因為新工程勾選了這個 GUN 拓展的特性,是以環境會自帶宏定義 __GUNC__ 表示, 也就是說在目前環境中既有MDK的__CC_ARM, 也有GCC的__GUNC__ , 是以造成在 SEGGER_RTT_Conf.h 檔案中的下面代碼中的 SEGGER_RTT_LOCK 和 SEGGER_RTT_UNLOCK 會重複宏定義,如下:
/*********************************************************************
*
* RTT lock configuration for SEGGER Embedded Studio,
* Rowley CrossStudio and GCC
*/
#if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || (defined __GNUC__)
#ifdef __ARM_ARCH_6M__
#define SEGGER_RTT_LOCK() { \
//省略 .................. \
#define SEGGER_RTT_UNLOCK() __asm volatile ("msr primask, %0 \n\t" \
//省略.................... \
}
/*********************************************************************
*
* RTT lock configuration for KEIL ARM
*/
#ifdef __CC_ARM
#if (defined __TARGET_ARCH_6S_M)
#define SEGGER_RTT_LOCK() { \
//省略.................... \
#define SEGGER_RTT_UNLOCK() PRIMASK = LockState; \
//省略.................... \ \
}
\
//省略.................... \
#endif
#endif
解決辦法是在 GCC 的條件編譯項目外加限制條件,如下:
/*********************************************************************
*
* RTT lock configuration for SEGGER Embedded Studio,
* Rowley CrossStudio and GCC
*/
#if (defined __SES_ARM) || (defined __CROSSWORKS_ARM) || ((defined __GNUC__)&&!(defined(__CC_ARM)))
.....................................
即将 (defined __GNUC__) 修改為 ((defined __GNUC__)&&!(defined(__CC_ARM))) 。