使用STM32開發的朋友不知道是否有發現過這樣的一些宏定義? 如下:
#if defined (__CC_ARM)
#pragma anon_unions
#endif
看到上面的語句一開始確實搞不懂為什么要寫這些東西,通過上網去查詢,才搞明白這其中的使用原理。
上面的代碼段我們可以看到兩部分的內容:
1) __CC_ARM
2) #pragma anon_unions
這兩個都有啥用呢? 待我一一道來!
1、__CC_ARM 是 ARM 編譯中的宏選項
__CC_ARM 是一個編譯器的選項,在ARM開發中根據開發環境的不同,有好幾個可選的宏選項。
這些選項可以查看所開發的芯片的內核文件,比如我使用的是STM32F407,所以我從 core_cm4.h 文件中可以查閱到:
#if defined ( __CC_ARM )
#define __ASM __asm /*!< asm keyword for ARM Compiler */
#define __INLINE __inline /*!< inline keyword for ARM Compiler */
#define __STATIC_INLINE static __inline
#elif defined ( __GNUC__ )
#define __ASM __asm /*!< asm keyword for GNU Compiler */
#define __INLINE inline /*!< inline keyword for GNU Compiler */
#define __STATIC_INLINE static inline
#elif defined ( __ICCARM__ )
#define __ASM __asm /*!< asm keyword for IAR Compiler */
#define __INLINE inline /*!< inline keyword for IAR Compiler. Only available in High optimization mode! */
#define __STATIC_INLINE static inline
#elif defined ( __TMS470__ )
#define __ASM __asm /*!< asm keyword for TI CCS Compiler */
#define __STATIC_INLINE static inline
#elif defined ( __TASKING__ )
#define __ASM __asm /*!< asm keyword for TASKING Compiler */
#define __INLINE inline /*!< inline keyword for TASKING Compiler */
#define __STATIC_INLINE static inline
#elif defined ( __CSMC__ )
#define __packed
#define __ASM _asm /*!< asm keyword for COSMIC Compiler */
#define __INLINE inline /*use -pc99 on compile line !< inline keyword for COSMIC Compiler */
#define __STATIC_INLINE static inline
#endif
其中:
(1) __CC_ARM 是對應 ARM RealView 開發平臺的,它需結合uvision、eclipse或CodeWarrior等開發環境來使用的。
(2) ICCARM 是對應 IAR EWARM 開發環境的,是 IAR Systems 公司為ARM 微處理器開發的一個集成開發環境。
(3) GNUC 是對應 GNU Compiler Collection 開發平臺的。 GCC最初是為GNU操作系統專門編寫的一款編譯器,是一款開源的軟件。
(4)TASKING 是對應 Altinum Designer 開發平臺的。 Altium Designer 是原Protel軟件開發商Altium公司推出的一體化的電子產品開發系統。
2、#pragma anon_unions 支持匿名結構體/聯合體
匿名結構體/聯合體指的是沒有命名的結構,因為沒有對應的名字,所以也不會直接創建這個對象或者變量,一般都是在嵌套結構中使用。
之所以要使用這個東西進行,是因為在gcc編譯器中是支持匿名結構體/聯合體的使用的,而在ARMCC中不支持,所以如果要在ARMCC中使用匿名的結構體/結合體,就需要使用 #pragma anon_unions 告知編譯器,不然會編譯不通過。
那到底什么樣的才算是匿名結構體/聯合體呢? 我下面舉個例子,大家一看就會明白了。
如下代碼:
typedef union
{
struct {
uint32_t Address;
uint32_t OutputBits;
uint32_t ExtendedAddressBits;
uint32_t ExtendedOutputBit;
uint32_t FrameID;
uint32_t EmptyBits;
};
uint32_t Value;
} StdFrame_t;
從上面可以看出來,定義結構體或者聯合體時,如果沒有命名的話,那這個結構體/聯合體就是匿名的。
注:#pragma指令來設定編譯器的狀態或者是指示編譯器完成一些特定的動作。
3、補充幾個調試非常好的操作
3.1、線
LINE 用以指示本行語句在源文件中的位置信息,即這條語句在源文件中的行號。
3.2、文件
FILE 用以指示本行語句所在源文件的文件名,即標示這條語句是在哪個源文件中出現的。
3.3、函數
func 用于指示某個語句出現在哪個函數中,即可以輸出該語句所在的函數的函數名。
注意:這個關鍵字在windows下時使用vc6.0是不支持的。
-
ARM
+關注
關注
134文章
9087瀏覽量
367401 -
STM32
+關注
關注
2270文章
10896瀏覽量
355766 -
C語言
+關注
關注
180文章
7604瀏覽量
136707 -
編譯器
+關注
關注
1文章
1624瀏覽量
49108 -
宏定義
+關注
關注
0文章
50瀏覽量
9007
發布評論請先 登錄
相關推薦
評論