目录

一、编译器预定义的宏

二、c语言内置宏

三、实用宏定义


一、编译器预定义的宏

在stm32系列单片机里的core_cmx.h(x:0/3/4/7)头文件里有如下一段宏定义:

/* define compiler specific symbols */
#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

在嵌入式开发中,单片机可以在不同的平台上进行使用,例如stm32单片机可以在IAR平台上进行开发,也可以在KEIL平台上开发。不同的开发平台有不同的编译器,不同的编译器所使用的工具链也不同。在不同的工具链中,c文件和汇编文件中inline和asm关键字的写法也不同。为了兼容不同平台,增强代码的可移植性,在代码里使用宏定义替代,这样就能在不同编译器预处理时产生适用于该工具链的代码。

PS:   __CC_ARM                       // ARM编译器预定义宏
         __GNUC__                       // GNU 编译器的预定义宏
         __ICCARM__                    // IAR编译器预定义宏
         __TMS470__                    // CCS编译器预定义宏
         __TASKING__                  // TASKING编译器预定义宏
         __CSMC__                       // COSMIC编译器预定义宏

二、c语言内置宏

C语言中有许多内置宏,在嵌入式开发中,这些内置宏常用在代码的跟踪调试,输入日志或者版本控制等等,下面列举一些常用的内置宏:

__DATE__     当前日期,输出格式为 "MMM DD YYYY"
__TIME__      当前时间,输出格式为 "HH:MM:SS"
__FILE__       当前文件名
__LINE__       当前行号
__STDC__     当编译器以 ANSI 标准编译时,则输出 1
__FUNCTION__(或者__func__ )   所在函数名的字符串

其中,__DATE__ 和__TIME__常用来输出软件版本信息。

#include <stdio.h>const char Version[]="Version 0.0.1 ";int main(void)
{printf("%s,%s,%s",Version,__DATE__,__TIME__);return 0;
}

__FILE__和__LINE__常用来定位,跟踪调试。

//stm32f10x_conf.h
#ifdef  USE_FULL_ASSERT#define assert_param(expr) ((expr) ? (void)0 : assert_failed((uint8_t *)__FILE__, __LINE__))void assert_failed(uint8_t* file, uint32_t line);
#else#define assert_param(expr) ((void)0)
#endif /* USE_FULL_ASSERT *///stm32f10x_adc.c
void ADC_DeInit(ADC_TypeDef* ADCx)
{/* Check the parameters */assert_param(IS_ADC_ALL_PERIPH(ADCx));...
}

上面两个代码片段只是简单的说明内置宏的用法,在实际的项目开发中,灵活地去运用这些内置宏对我们在调试阶段有很大帮助。

三、实用宏定义

1.最大值和最小值

#define MAX(x, y) (((x)>(y))?(x):(y))
#define MIN(x, y) (((x)<(y))?(x):(y))

2.交换两个变量的值

//加减法实现
#define SWAP(x, y)\
do\
{\x = x + y;\y = x - y;\x = x - y;\
}while(0)

3.数组元素个数

#define ARRAY_SIZE(array) (sizeof((array))/sizeof((array[0])))

4.位操作

//将data的第bit位置为1
#define SET_BIT(data,bit)   ((data) |= (1<<(bit)))//将data的第bit位清零
#define CLR_BIT(data,bit)   ((data) &= (~(1<<(bit))))//将data的第bit位取反
#define CPL_BIT(data,bit)   ((data) ^= ((1<<(bit))))//获取data的第bit位
#define GET_BIT(data,bit)   ((data) & (1<<(bit)))

嵌入式开发常见宏定义相关推荐

  1. utilities —— 常见宏定义

    C语言宏的特殊用法和几个坑 毫无疑问,宏的理解和运用是提升 C 程序效率的一大关键技术,也是评价一个 C 程序员的重要指标.本文将列举一些经典的宏函数,并给出其注意事项. 注意,宏不是函数,没有函数所 ...

  2. 嵌入式开发常见英文单词及缩写

    [前言] 做嵌入式开发,避免不了要看芯片手册(包括参考手册.用户手册等),通常在开头的章节会有"Documentation conventions",意思就是编写文档时的一些约定规 ...

  3. 嵌入式开发常见通信协议

    随着物联网设备数量的持续增加,这些设备之间的通信或连接已成为一个重要的思考课题.通信对物联网来说十分常用且关键,无论是近距离无线传输技术还是移动通信技术,都影响着物联网的发展.而在通信中,通信协议尤其 ...

  4. 单片机开发和嵌入式开发的区别

    单片机开发和嵌入式开发都是针对嵌入式系统的应用领域,但是两者有着不同的特点和应用场景.在本文中,我们将探讨单片机开发和嵌入式开发的区别,并介绍它们的应用场景和技术特点. 一.单片机开发和嵌入式开发的区 ...

  5. [C语言] 在单片机的嵌入式开发中使用宏定义一键开关日志输出/打log调试

    前言 在编写项目时,我们通常需要日志输出来帮助我们追踪程序执行的内容,以便在出现BUG时较为方便的复现,并在调试完成后快速的关闭过于详细的LOG输出,避免干扰使用中的体验,在函数中一个一个的增加pri ...

  6. 宏定义编程软件_什么是计算机编程? 定义软件开发。

    宏定义编程软件 My five year old son, Ramy, approached me one day while I was working from home and asked, & ...

  7. .net 宏定义_C语言、嵌入式中一些实用的宏技巧

    宏打印函数 在我们的嵌入式开发中,使用printf打印一些信息是一种常用的调试手段.但是,在打印的信息量比较多的时候,就比较难知道哪些信息在哪个函数里进行打印. 特别是对于异常情况的打印,我们需要快速 ...

  8. c语言改变cmd 字体大小_嵌入式开发中常见3个的C语言技巧

    原文:https://www.cnblogs.com/CrazyCatJack/p/6080266.html 1.指向函数的指针 指针不光能指向变量.字符串.数组,还能够指向函数.在C语言中允许将函数 ...

  9. iOS 开发 高级:使用 宏定义macros (#,##,...,__VA_ARGS_)

    一直以来用宏定义#define也就是定义一些简单的常量,至多也就是定义一个函数,很少关注宏定义的用法.直到看到这样的代码: [cpp] view plaincopy #define PLAYSOUND ...

最新文章

  1. 一个苹果证书供多台电脑开发使用——导出p12文件
  2. AFDetV2:重新思考点云检测方法中第二阶段检测器的必要性(CVPR2021)
  3. 使用Orange Pi Zero做小小服务器(VNC篇)
  4. 日常如何维护计算机,日常使用中,我们如何维护电脑?
  5. linux开机脚本文件下载,linux 开机启动脚本
  6. python tkmessagebox_在python中关闭tkmessagebox一段时间后
  7. mysql open files
  8. Eclipse组合KEmulator
  9. 9 matlab入门求一元二元函数的最小值和零点
  10. 计算机安装win10配置,安装Win10系统配置的最低要求
  11. edz文件怎么导入EPLAN Electric P8
  12. 线性代数应用于计算机科学例子,Sagemath在线性代数教学中的应用
  13. s型人口增长曲线matlab程序,matlab人口预测及数据曲线拟合.ppt
  14. android按键录制,安卓按键精灵怎么录制脚本
  15. 记一次监控录像断续摄像头时而在线问题
  16. proc oracle12c,Oracle12cRAC安装遭遇CLSRSC-507: The root script cannot proceed on this node
  17. 手头有65万存款,想在广州买房,买南沙好还是黄埔好?
  18. windows 同步时间 cmd 命令
  19. 【GDAL】python读取DEM计算坡度与坡向
  20. python如何升级到指定版本_python如何升级?

热门文章

  1. unity游戏开发-socket网络通信
  2. Sensing and Communication Tradeoff Design for AoI Minimization in a Cellular Internet of UAVs
  3. 我在民大的网络创业经历
  4. 杯具了!曾经很火的百度网盘高速下载工具又跑路了!
  5. ODBC驱动器管理器——未发现数据源名称并且未指定默认驱动程序
  6. 2020年交通运输区块链白皮书
  7. Linux中搜索大于200M的文件
  8. c语言编程银行利率计算器,c语言写用户从键盘上输入银行利率,本金,存...
  9. Hadoop书籍介绍
  10. vue脚手架和html,vue脚手架的作用是什么?