嵌入式开发中需要注意的几个C用法介绍

发布者:神光骑士最新更新时间:2024-01-08 来源: elecfans关键字:嵌入式开发  STM32 手机看文章 扫描二维码
随时随地手机看文章

使用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

LINE 用以指示本行语句在源文件中的位置信息,即这条语句在源文件中的行号。


3.2、FILE

FILE 用以指示本行语句所在源文件的文件名,即标示这条语句是在哪个源文件中出现的。


3.3、func

func 用于指示某个语句出现在哪个函数中,即可以输出该语句所在的函数的函数名。


注意:这个关键字在windows下时使用vc6.0是不支持的。


关键字:嵌入式开发  STM32 引用地址:嵌入式开发中需要注意的几个C用法介绍

上一篇:对一款国产3D霍尔传感器的SPI封装
下一篇:SMT32的HEX文件里加入固件版本的方法

小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved