《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.7 技术升级:用宏定义来完成位运算

简介:

本节书摘来自异步社区《嵌入式Linux与物联网软件开发——C语言内核深度解析》一书中的第2章,第2.7节,作者朱有鹏 , 张先凤,更多章节内容可以访问云栖社区“异步社区”公众号查看。

2.7 技术升级:用宏定义来完成位运算

在Linux内核源码中有很多函数,你一层一层地查看进去,会发现其最终实现其实是一些宏构成的。本节举几个用宏实现位运算的例子。

2.7.1 直接用宏来置位

用宏定义将一个32位二进制数x的第n位(从右边起算,也就是bit0算第1位)置位。

显然,这个宏含有两个参数,即x和n,所以其模型为 #define SET_BIT_N(x,n) xxx。

对其某一位置位,我们可以将该位和1相或,其他位和0相或即可,所以得到x | (1<<(n-1))。

所以该宏为#define SET_BIT_N(x,n) ((x) | (1<<((n)-1)))。

2.7.2 直接用宏来复位

用宏定义将一个32位二进制数x的第n位(右边起算,也就是bit0算第1位)清零。

显然,这个宏含有两个参数,即x和n,所以其模型为 #define CLR_BIT_N(x,n) xxx。

对其某一位清零,我们可以将该位和0相与,其他位和1相与即可,所以得到x & ~(1<<(n-1))。

所以该宏为#define CLR_BIT_N(x,n) ((x) & ~(1<<((n)-1)))

2.7.3 截取变量的部分连续位

这个宏比较复杂,我们单独拿出来分析它。相信有了上面几节的学习,理解起来也不会难。该宏实现的是截取指定的连续位(n~m)作为一个新的值。例如变量0x88,也就是0b10001000,若截取第2~4位(bit0为第一位),则值为0b100 = 4。

define GETBITS(x, n, m) ((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1))

我们看到上面这么一个复杂的宏怎么分析呢?提取对应的括号,将对应的括号分离出来,从最里边开始分析,然后将最里边视为一个整体,一层一层地向外边扩展分析。

分析:((x & ~(~(0U)<<(m-n+1))<<(n-1)) >> (n-1)) 提取最里边的括号对便是~(0U)<<(m-n+1),然后一层一层地往外面分析,如下所示。


d9842bf5fb0559d2945353cf4f3bede0f5048e1d

到目前,已经构造出来了bitn~bitm连续为1,其余位都为0的数。由前面的几节可知,将这个数与操作数x相与即可从操作数x截取到bitn~bitm位为原数不变,其余位全为0的数。假设该数为Y。
Y = (x & ~(~(0U)<<(m-n+1))<<(n-1))

然后只要再将Y右移位(n-1),即可得到以bitn~bitm构成的新数。

课后题
1.嵌入式系统中常常要求用户对变量或者寄存器进行位操作,下面的函数分别用于设置和清除变量a的第5位,请使用下面宏定义bit5,按要求对变量a进行相应的处理,在函数set_bit5中,用位或赋值操作(|=)设置变量a的第5位。在函数clear_bit5中,用位与赋值操作(&=)清除变量a的第5位。(软考题)

define BIT5 (0X01<<5)

static int a;

void set_bit(void)
{

______;

}
void clear_bit5(void)
{

______;

}
2.请描述如下位操作的作用。

a |= (1 << 3); 

a |= (0b11111 << 3); 或a |= (~((~0) << 5) << 3);

a &= ~(1 << 15);

a &= ~(0b111111111 << 15); 或a &= ~(~((~0) << 9) << 15);

a &= (0b111111 << 3); 或a &= (~((~0) << 6) << 3);   

3.请解释如下两个宏的含义。

#define SET_NTH_BIT(x, n) (x | ((1U)<<(n-1)))

#define CLEAR_NTH_BIT(x, n) (x & ~((1U)<<(n-1)))

4.截取变量的部分连续位,例如变量0x88, 也就是10001000,若截取第2~4位,则值为010 = 2,最右边从第0位算起,假设m=4,n=2。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

相关实践学习
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
存储 C语言 C++
【c语言】运算符汇总(万字解析)
今天博主跟大家分享了c语言中各种操作符的功能、使用方法以及优先级和结合性,并且与大家深入探讨了表达式求值的两个重要规则--算数转换和整形提升。学习这些知识对我们的C语言和C++学习都有着极大的帮助。
1048 2
|
11月前
|
安全 Linux 编译器
BigCloud Enterprise Linux 8和Rocky Linux 8升级OpenSSH步骤
本文介绍了在BigCloud Enterprise Linux 8.2/8.6和Rocky Linux 8.10上升级OpenSSH的详细步骤。首先配置Telnet服务和GCC编译器以确保远程登录安全,接着备份旧版OpenSSH并下载、编译、安装最新版本(如9.9p1)。然后创建新的sshd系统服务配置文件,调整配置并启动服务。最后验证升级效果,关闭不必要的Telnet服务,并处理可能的防火墙和SELinux问题。通过这些步骤可有效修复低版本OpenSSH带来的高危漏洞。
756 13
|
应用服务中间件 Linux nginx
【Azure App Service】基于Linux创建的App Service是否可以主动升级内置的Nginx版本呢?
基于Linux创建的App Service是否可以主动升级内置的Nginx版本呢?Web App Linux 默认使用的 Nginx 版本是由平台预定义的,无法更改这个版本。
323 77
|
9月前
|
Linux 开发者
Linux PAGE_ALIGN宏定义的理解
总的来说,PAGE_ALIGN是一个非常有用的工具,它可以帮助内核开发者确保他们的代码能够以最有效的方式使用系统内存。虽然它的实现看起来可能有点复杂,但一旦理解了它的工作原理,就会发现它实际上是一个非常直观和强大的工具。
164 11
|
11月前
|
监控 Shell Linux
Android调试终极指南:ADB安装+多设备连接+ANR日志抓取全流程解析,覆盖环境变量配置/多设备调试/ANR日志分析全流程,附Win/Mac/Linux三平台解决方案
ADB(Android Debug Bridge)是安卓开发中的重要工具,用于连接电脑与安卓设备,实现文件传输、应用管理、日志抓取等功能。本文介绍了 ADB 的基本概念、安装配置及常用命令。包括:1) 基本命令如 `adb version` 和 `adb devices`;2) 权限操作如 `adb root` 和 `adb shell`;3) APK 操作如安装、卸载应用;4) 文件传输如 `adb push` 和 `adb pull`;5) 日志记录如 `adb logcat`;6) 系统信息获取如屏幕截图和录屏。通过这些功能,用户可高效调试和管理安卓设备。
|
网络协议 Unix Linux
深入解析:Linux网络配置工具ifconfig与ip命令的全面对比
虽然 `ifconfig`作为一个经典的网络配置工具,简单易用,但其功能已经不能满足现代网络配置的需求。相比之下,`ip`命令不仅功能全面,而且提供了一致且简洁的语法,适用于各种网络配置场景。因此,在实际使用中,推荐逐步过渡到 `ip`命令,以更好地适应现代网络管理需求。
640 11
|
存储 运维 安全
深入解析操作系统控制台:阿里云Alibaba Cloud Linux(Alinux)的运维利器
本文将详细介绍阿里云的Alibaba Cloud Linux操作系统控制台的功能和优势。
418 6
|
缓存 并行计算 Linux
深入解析Linux操作系统的内核优化策略
本文旨在探讨Linux操作系统内核的优化策略,包括内核参数调整、内存管理、CPU调度以及文件系统性能提升等方面。通过对这些关键领域的分析,我们可以理解如何有效地提高Linux系统的性能和稳定性,从而为用户提供更加流畅和高效的计算体验。
563 24
|
存储 网络协议 编译器
【C语言】深入解析C语言结构体:定义、声明与高级应用实践
通过根据需求合理选择结构体定义和声明的放置位置,并灵活结合动态内存分配、内存优化和数据结构设计,可以显著提高代码的可维护性和运行效率。在实际开发中,建议遵循以下原则: - **模块化设计**:尽可能封装实现细节,减少模块间的耦合。 - **内存管理**:明确动态分配与释放的责任,防止资源泄漏。 - **优化顺序**:合理排列结构体成员以减少内存占用。
1080 14
|
存储 Linux API
深入探索Android系统架构:从内核到应用层的全面解析
本文旨在为读者提供一份详尽的Android系统架构分析,从底层的Linux内核到顶层的应用程序框架。我们将探讨Android系统的模块化设计、各层之间的交互机制以及它们如何共同协作以支持丰富多样的应用生态。通过本篇文章,开发者和爱好者可以更深入理解Android平台的工作原理,从而优化开发流程和提升应用性能。

相关产品

  • 物联网平台