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