使用STM32開發(fā)的朋友不知道是否有發(fā)現(xiàn)過這樣的一些宏定義? 如下:
#if defined (__CC_ARM)
#pragma anon_unions
#endif
看到上面的語句一開始確實搞不懂為什么要寫這些東西,通過上網(wǎng)去查詢,才搞明白這其中的使用原理。
上面的代碼段我們可以看到兩部分的內容:
1) __CC_ARM
2) #pragma anon_unions
這兩個都有啥用呢? 待我一一道來!
1、__CC_ARM 是 ARM 編譯中的宏選項
__CC_ARM 是一個編譯器的選項,在ARM開發(fā)中根據(jù)開發(fā)環(huán)境的不同,有好幾個可選的宏選項。
這些選項可以查看所開發(fā)的芯片的內核文件,比如我使用的是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 開發(fā)平臺的,它需結合uvision、eclipse或CodeWarrior等開發(fā)環(huán)境來使用的。
(2) ICCARM 是對應 IAR EWARM 開發(fā)環(huán)境的,是 IAR Systems 公司為ARM 微處理器開發(fā)的一個集成開發(fā)環(huán)境。
(3) GNUC 是對應 GNU Compiler Collection 開發(fā)平臺的。 GCC最初是為GNU操作系統(tǒng)專門編寫的一款編譯器,是一款開源的軟件。
(4)TASKING 是對應 Altinum Designer 開發(fā)平臺的。 Altium Designer 是原Protel軟件開發(fā)商Altium公司推出的一體化的電子產(chǎn)品開發(fā)系統(tǒng)。
2、#pragma anon_unions 支持匿名結構體/聯(lián)合體
匿名結構體/聯(lián)合體指的是沒有命名的結構,因為沒有對應的名字,所以也不會直接創(chuàng)建這個對象或者變量,一般都是在嵌套結構中使用。
之所以要使用這個東西進行,是因為在gcc編譯器中是支持匿名結構體/聯(lián)合體的使用的,而在ARMCC中不支持,所以如果要在ARMCC中使用匿名的結構體/結合體,就需要使用 #pragma anon_unions 告知編譯器,不然會編譯不通過。
那到底什么樣的才算是匿名結構體/聯(lián)合體呢? 我下面舉個例子,大家一看就會明白了。
如下代碼:
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;
從上面可以看出來,定義結構體或者聯(lián)合體時,如果沒有命名的話,那這個結構體/聯(lián)合體就是匿名的。
注:#pragma指令來設定編譯器的狀態(tài)或者是指示編譯器完成一些特定的動作。
3、補充幾個調試非常好的操作
3.1、線
LINE 用以指示本行語句在源文件中的位置信息,即這條語句在源文件中的行號。
3.2、文件
FILE 用以指示本行語句所在源文件的文件名,即標示這條語句是在哪個源文件中出現(xiàn)的。
3.3、函數(shù)
func 用于指示某個語句出現(xiàn)在哪個函數(shù)中,即可以輸出該語句所在的函數(shù)的函數(shù)名。
注意:這個關鍵字在windows下時使用vc6.0是不支持的。
-
ARM
+關注
關注
134文章
9006瀏覽量
366033 -
STM32
+關注
關注
2263文章
10846瀏覽量
353701 -
C語言
+關注
關注
180文章
7581瀏覽量
135554 -
編譯器
+關注
關注
1文章
1607瀏覽量
48977 -
宏定義
+關注
關注
0文章
49瀏覽量
8981
發(fā)布評論請先 登錄
相關推薦
評論