首页 > 其他分享 >嵌入式开发中一些少见的C语言用法

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

时间:2023-02-01 11:32:27浏览次数:50  
标签:__ C语言 嵌入式 Compiler INLINE inline 用法 asm define

嵌入式开发中一些少见的C语言用法_#pragma

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

嵌入式开发中一些少见的C语言用法_编译器_02

标签:__,C语言,嵌入式,Compiler,INLINE,inline,用法,asm,define
From: https://blog.51cto.com/wangjunlv/6030994

相关文章

  • 数组对象的一些快捷用法
    1、数组对象去重this.polluteNumOptions=[            {              remark:'aa',       ......
  • 【mysql】 查询数据时group by,及group_concat()函数用法
    GROUPBY语句语法select聚合函数,列(要求出现在groupby的后面)from表where筛选条......
  • static的详细用法
    1.C++的static有两种用法,面向过程程序设计中的static和面向对象程序涉及中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用1面向过程涉及中......
  • 反射操作的基础代码用法
    `packagecn.javaguide;importjava.lang.reflect.Field;importjava.lang.reflect.InvocationTargetException;importjava.lang.reflect.Method;publicclassMain{......
  • 重学C语言
    /*Add(intx,inty)//自定义加法函数Add{//函数内容\函数体intz=x+y;returnz;}intmain(){intnum1=10;intnum2=20;intsum=0;inta=100;in......
  • 01基本用法
    importmatplotlib.pyplotaspltimportnumpyasnpx=np.linspace(-1,1,50)#y=2*x+1y=x**2plt.plot(x,y)plt.show()......
  • JUnit4 基本用法实例
    本教程介绍了在JUnit4中支持的基本注解。importorg.junit.*;importstaticorg.junit.Assert.*;importjava.util.*;/***@authoryiibai**/publicclassJunitTest......
  • C语言#初识C语言(一)
    自学C语言的第1天。1、什么是C语言2、第一个C程序3、数据类型和格式字符4、变量、常量1、什么是C语言 C语言是一种高级语言,在1972年由丹尼斯·里奇和肯·汤姆逊在开发UNIX......
  • Digicert EV证书签名后出现“证书对于请求用法无效”的解决方案
    一、具体问题近期部分客户使用​​EV代码签名证书Pro​​签名程序后,在部分电脑上安装或查看签名时会出现“证书对于请求用法无效”的错误,具体错误见下图:此问题出现的原因是......
  • Digicert EV证书签名后出现“证书对于请求用法无效”的解决方案
    一、具体问题近期部分客户使用EV代码签名证书Pro签名程序后,在部分电脑上安装或查看签名时会出现“证书对于请求用法无效”的错误,具体错误见下图:此问题出现的原因是由于D......