嵌入式C语言中宏的使用技巧

在整个嵌入式C语言系列中,我一直都是用嵌入式去限定C语言,而不是针对整个C语言,因为我们这里主要讨论的是嵌入式中的C语言。《C语言程序设计》这门课,大家基本上都在大学课程里学过或者有所了解,甚至可以说在这个C语言领域里,大家都是谭浩强老师的徒子徒孙。与大学理论课不同,我们这里讨论的是实际应用,而且是C语言在嵌入式领域的开发与应用。貌似现在只靠C语言就能混饭吃的,也只有嵌入式行业了。

下面进入正题,这里我们要讨论一下嵌入式C语言中关于宏的使用。

宏的用法

在C语言中,允许用一个标识符来表示一个字符串,称为“宏”。被定义为“宏”的标识符称为“宏名”(注意不是游戏里player killer),也叫宏定义。在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏替换”或“宏展开”。

宏定义和函数的区别

宏定义是由源程序中的宏定义命令完成的,而且是由预处理程序自动完成的。大家知道,预处理过程,是在程序编译链接之前就进行的,这就造就了宏定义的特有属性。它不同于函数定义,函数定义好了以后,是可以被反复调用的,但是被调用的函数都是程序空间中的同一段代码。宏定义就不同,宏定义其实是在程序编译之前,会被完全替换和反复展开的一段代码。

相比较而言,宏定义这种方式消耗了比较多的程序空间。函数虽然节省了空间,而且被调用的次数越多节省的空间也越多,但是你别忘了,函数调用是要消耗时间和其他资源的。这里面包括,调用之前的参数进栈保护 、形参与实参的数据传递、函数的跳入返回和函数调用返回的参数出栈还原。

总的来说,函数就是以时间换空间,减小程序代码空间,实现程序的“”高内聚“;宏定义就是以空间换时间,虽说增加了程序的代码空间,但是可以优化代码的响应速度。比如,在中断响应函数里,我们就可以尽量不采用函数调用的方法,更要杜绝函数的多层嵌套调用。因为这样容易消化过多的堆栈空间不说,还容易造成堆栈溢出,并且大大降低了程序的及时响应速度。

我们在实际项目开发的过程中,经常会用到一些位操作。因此我们可以定义一些常用的位操作宏函数,方便功能实现。

常用宏定义

#define SetiBit(reg,i) (reg |= ((t_uint32)1<<i))#define ClriBit(reg,i) (reg &= ~((t_uint32)1<<i))#define ChkiBit(reg,i) (((reg)&((t_uint32)1<<(i)))!= 0)

说明一下:SetiBit(reg,i)用于位置位;ClriBit(reg,i)用于位清零;ChkiBit(reg,i)用于位检测。这样我们在做一些针对变量的位操作时,会非常方便。

这种宏定义也适用于普通变量的封装调用,这一点类似于C++中,类对其访问私有数据成员的接口函数。比如,

#define GetRxMsg(msg,i)   (C_RxMsg[msg].Byte[i])#define SetRxMsg(msg,i,val)(C_RxMsg[msg].Byte[i] = val)

说明一下:GetRxMsg(msg,i)用于数据读取;SetRxMsg(msg,i,val)用于数据写入。这样,相当于间接实现了某些数据变量的私有化属性,以便封装使用。

类似的宏定义还有很多,大家可以自己总结,最后形成自己的通用宏定义库文件。

(0)

相关推荐

  • 【C语言笔记】如何查看数据类型范围?

    知识点一:查看整数范围 当前的编译环境下,你可能不知道int的数据范围是多少,或者记不清无符号短整型的范围是0~65535还是0~65536?这时候就可以按照如下程序进行输出查看: #include ...

  • 嵌入式百宝箱:第9期

    国庆期间(1~8号)停更,给大家来个文章汇总方便大家阅读. 嵌入式百宝箱是咱公众号推文汇总的一种形式.主要是汇总本周发布过的推文,并做一些概述.这样可以让一些错过推文的朋友可以根据自己的需要选择性的去 ...

  • 嵌入式C语言中常量的应用实例

    原创嵌入式与汽车电子2021-03-15 15:34:17 常量,我们都知道,就是数值保持不变的量. 在C语言中,常量一旦初始化了,它的值将在整个程序运行周期内,不允许发生任何变化.常量与变量是相对的 ...

  • 嵌入式C语言中字节对齐的问题

    嵌入式C语言中,字节对齐的问题主要出现在结构体中,我们先来看一下结构体的定义. 结构体struct的定义 在C语言中,结构体是一种复合数据类型,其构成元素既可以是基本数据类型(如int.long.fl ...

  • Go语言中切片操作的那些技巧

    Go语言中文网 今天 以下文章来源于李文周 ,作者李文周 李文周一个北漂程序员的自我更新之旅. 本文翻译自官方wiki,整理了Go语言中关于切片操作的一些技巧. 备注:由于行文需要,一些细节与原文存在 ...

  • 【孙宏开】纳西语在藏缅语族语言中的历史地位

    [内容提要]本文试图从纳西语的基本特点出发,讨论它在藏缅语族总体特征中的历史地位.本文计划从以下几个方面进行讨论.首先,介绍19世纪以来,国内外语言学界对纳西语历史地位的讨论情况,特别是近半个世纪以来 ...

  • C/C 语言中头文件的保护宏

    什么是保护宏 保护宏就是C/C++头文件开始处的宏判断和宏定义,可以避免该头文件被多次加载执行而导致编译错误的宏. 示例代码如下: #ifndef __PROTECT_TEST_H #define _ ...

  • 嵌入式C语言开发者必知:“设计模式”

    介绍如何使用设计模式为嵌入式系统创建高效且优化的C语言设计.针对嵌入式系统中从内存访问到事件调度,从状态机设计到安全性.可靠性保证,对系统设计以及性能表现的方方面面进行了详细阐述,也提出了很好的设计规 ...

  • 职场中的说话情商技巧你掌握了吗?

    现在我们大家都说一个人的情商比智商要重要很多,有情商的人才能顺利地在这个社会行走.小编其实是赞同这句话的,情商真的很重要,特别是说话的情商在职场上尤为重要.所以今天小编今天就给大家分享一些在职场中提高 ...

  • 书法中加个“小技巧”,就会与众不同!

    当代书法与古人的有所不同,古人写字更多地是为了实用,要不古人也不会说书法是"余事". 而当代书法已经远远失去了写字的实用功能,大都被电脑所代替.当代人把用毛笔写的字再进行一些&qu ...

  • 初学编程,如何玩转C语言?C语言中最重要的知识献上!

    一.C语言的指针 1.指针说明 指针是包含另一变量的地址变量. (1)int *p p是一个指针,指向一个整形数. (2)int *p() p是一个函数,该函数返回一个指向整数的指针. (3)int ...