打印
[开发资料]

嵌入式开发中一些少用的C语言用法

[复制链接]
567|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
elephant00|  楼主 | 2023-8-14 10:40 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

使用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是不支持的。


使用特权

评论回复
沙发
小夏天的大西瓜| | 2023-8-26 22:18 | 只看该作者
这些都在那些层面进行使用呢

使用特权

评论回复
板凳
星辰大海不退缩| | 2023-8-27 19:41 | 只看该作者
这个关键字在windows下时使用vc6.0是不支持的,在其他版本支持嘛

使用特权

评论回复
地板
AdaMaYun| | 2023-8-27 21:52 | 只看该作者
__LINE__文件标注用到的比较多

使用特权

评论回复
5
OKAKAKO| | 2023-8-27 22:06 | 只看该作者
#pragma anon_unions 支持匿名结构体/联合体,对于C语言确实很重要

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

970

主题

2981

帖子

7

粉丝