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

使用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、lineline 用以指示本行语句在源文件中的位置信息,即这条语句在源文件中的行号。
3.2、filefile 用以指示本行语句所在源文件的文件名,即标示这条语句是在哪个源文件中出现的。
3.3、funcfunc 用于指示某个语句出现在哪个函数中,即可以输出该语句所在的函数的函数名。
注意:这个关键字在windows下时使用vc6.0是不支持的。

Wi-Fi 6时代下了,有线交换机网络将发生什么样的改变呢?
利好高压连接器 新能源汽车购置税减免返场
锡膏熔点与焊接合金的成分密切相关
全球车用嵌入式影像传感器市场需求暴增,复合成长率将达19%
2020年最大的3次云中断事件影响分析
嵌入式开发中需要注意的几个C用法介绍
怎样通过继电器触点保护电路来抑制电压呢?
昕诺飞智能照明走进科隆,助力打造德国首个智慧城市
苹果13发布是真的假的
全要素气象站
东芝推出首款充氦硬盘:MG07ACA系列企业级硬盘,容量14TB
借助多功能电源快速实施智能消防安全和安防系统
朗讯扩建VIVO电信3G CDMA2000 1X等网络
工业交换机在分布式控制系统中的应用
户外摄像头防水检测是如何实现IP67防水等级的
PCB画板子步骤是怎样的
该如何选择合适的可编程电源供应器功率呢?
高压负荷开关工作原理_高压负荷开关安装
英特尔积极支持构建以小芯片为核心的行业生态系统
智能人工气候室的作用是什么,关于它的功能分析