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