《嵌入式Linux与物联网软件开发——C语言内核深度解析》一2.3 位操作与寄存器

简介:

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

2.3 位操作与寄存器

2.3.1 寄存器的操作

一般来说,一个SOC片内外设由若干个寄存器控制,IO操作的寄存器与内存统一编址,如果我们要操作片内外设,那么就是操作片内外设的控制寄存器。因此,控制硬件就是读写寄存器(寄存器亦可理解为特定地址的内存)。

SOC中一个寄存器的数据宽度一般是32bit,每个bit可以配置为0或者1,单个bit或相邻几个bit一起控制片上外设某个属性的状态。单个bit最多控制两种状态,三个bit最多控制8种状态。因此寄存器的特定bit配置为0或1,就可以实现对硬件的控制。

然而,CPU对寄存器读写一般都是按照寄存器的数据宽度一起读写(部分寄存器可以按照位读取,这里不讨论),即32bit读出,32bit写入。假设我们只想修改寄存器其中某个属性的状态,即修改寄存器特定位。那么就只能先整体读出来,然后将需要修改的部分修改后,再将修改后的值整体写入寄存器中,即读-改-写三部曲。并且我们只能修改需要修改的位,不能影响其他位。对寄存器特定位的操作分三种情况:清零、置1和取反。

2.3.2 寄存器特定位清零用&

如果希望将一个寄存器的某些特定位变成0而不影响其他位,可以构造一个合适的1和0组成的数,和这个寄存器原来的值进行位与操作,就可以将特定位清零。假设原来32位寄存器REG1中的值为0xAAAAAAAA,我们希望将bit8~bit15清零而其他位不变,将这个数与0xFFFF00FF进行位与即可。

REG1 &= 0xFFFF00FF;

经过上式的读-改-写后,REG1中的值为0xAAAA00AA,达到了特定位清零的目的。

2.3.3 寄存器特定位置1用|

如果希望将一个寄存器的某些特定位变成1而不影响其他位,可以构造一个合适的1和0组成的数,和这个寄存器原来的值进行位或操作,就可以将特定位置1。假设原来32位寄存器REG1中的值为0xAAAA00AA,我们希望将bit8~bit15置1而其他位不变,将这个数与0X0000FF00进行位或即可。

REG1 |= 0x0000FF00;

经过上式的读-改-写后,REG1中的值为0xAAAAFFAA,达到了特定位置1的目的。

2.3.4 寄存器特定位取反用~

如果希望将一个寄存器的某些特定位0变成1,而1变成0,即取反而不影响其他位,可以构造一个合适的1和0组成的数,和这个寄存器原来的值进行位异或操作,就可以将特定位取反。假设原来32位寄存器REG1中的值为0xAAAAAAAA,我们希望将bit8~bit15取反而其他位不变,将这个数与0X0000FF00进行位异或即可。

REG1 ^= 0x0000FF00;

经过上式的读-改-写后,REG1中的值为0xAAAA55AA,达到了特定位取反的目的。

学完本节,你会发现配置寄存器操作并没有想象的那么难,只要我们学会设置位操作的特定的构造数就行了。上面举的例子是bit8~bit15,很好算。但如果要构造一个bit1、bit3~bit5、bit15~bit17位为1的数。傻眼了?一步步来,先用二进制挨个排列好0011 1000 0000 0011 1010,再换算成十六进制0X0003803A,总算算出来了。是不是非要这么麻烦呢?我们既然已经学习了位运算,能不能用位运算构建一个构造数呢?

相关实践学习
钉钉群中如何接收IoT温控器数据告警通知
本实验主要介绍如何将温控器设备以MQTT协议接入IoT物联网平台,通过云产品流转到函数计算FC,调用钉钉群机器人API,实时推送温湿度消息到钉钉群。
阿里云AIoT物联网开发实战
本课程将由物联网专家带你熟悉阿里云AIoT物联网领域全套云产品,7天轻松搭建基于Arduino的端到端物联网场景应用。 开始学习前,请先开通下方两个云产品,让学习更流畅: IoT物联网平台:https://iot.console.aliyun.com/ LinkWAN物联网络管理平台:https://linkwan.console.aliyun.com/service-open
相关文章
|
8天前
|
存储 物联网 调度
操作系统的心脏:内核深度解析
在数字世界的构建中,操作系统扮演着基石的角色,而其核心—内核,则是这一复杂系统的灵魂。本文将深入探讨操作系统内核的工作原理,揭示它是如何管理硬件资源、运行程序以及提供系统服务的。通过理解内核的结构和功能,我们可以更好地把握计算机系统的运作机制,进而优化和创新我们的技术实践。
|
3月前
|
存储 人工智能 安全
操作系统的心脏:内核深度解析
【8月更文挑战第13天】 在数字世界的每一次跳动中,都能感受到操作系统内核的强大生命力。本文将带你走进操作系统的核心——内核,揭示它如何协调和管理计算机硬件资源,保证软件运行的高效和稳定。从内核的定义和功能,到它的结构和设计哲学,再到现代操作系统中的创新与挑战,我们将一起探索这个让计算机系统“活着”的秘密所在。
58 3
|
2天前
|
存储 人工智能 安全
操作系统的心脏——内核深度解析
【10月更文挑战第29天】 本文深入探讨了操作系统的核心组件——内核,包括其定义、功能、架构以及在现代计算中的重要性。通过对比不同操作系统内核的设计哲学和技术实现,揭示了内核如何影响系统性能、稳定性和安全性。此外,文章还讨论了未来内核技术的潜在发展方向,为读者提供了一个全面了解内核工作原理的平台。
|
6天前
|
算法 Linux 定位技术
Linux内核中的进程调度算法解析####
【10月更文挑战第29天】 本文深入剖析了Linux操作系统的心脏——内核中至关重要的组成部分之一,即进程调度机制。不同于传统的摘要概述,我们将通过一段引人入胜的故事线来揭开进程调度算法的神秘面纱,展现其背后的精妙设计与复杂逻辑,让读者仿佛跟随一位虚拟的“进程侦探”,一步步探索Linux如何高效、公平地管理众多进程,确保系统资源的最优分配与利用。 ####
31 4
|
7天前
|
缓存 负载均衡 算法
Linux内核中的进程调度算法解析####
本文深入探讨了Linux操作系统核心组件之一——进程调度器,着重分析了其采用的CFS(完全公平调度器)算法。不同于传统摘要对研究背景、方法、结果和结论的概述,本文摘要将直接揭示CFS算法的核心优势及其在现代多核处理器环境下如何实现高效、公平的资源分配,同时简要提及该算法如何优化系统响应时间和吞吐量,为读者快速构建对Linux进程调度机制的认知框架。 ####
|
1月前
|
安全 中间件 人机交互
探索操作系统:从内核到用户界面的全面解析
本文旨在深入探讨操作系统的本质、核心组件及其功能。通过分析操作系统的各个层次,包括内核、驱动程序、中间件及用户界面,揭示其背后的技术原理和设计思想。此外,本文还将讨论操作系统在现代计算中的重要性及其未来发展趋势。
|
24天前
|
敏捷开发 数据可视化 测试技术
解析软件项目管理:以板栗看板为例,其如何有效影响并优化软件开发流程
软件项目管理是一个复杂而重要的过程,涵盖了软件产品的创建、维护和优化。其核心目标是确保软件项目能够顺利完成,同时满足预定的质量、时间和预算目标。本文将深入探讨软件项目管理的内涵及其对软件开发过程的影响,并介绍一些有效的管理工具。
|
2月前
|
存储 算法 安全
操作系统的心脏:内核深入解析
本文将带您走进计算机的大脑—操作系统内核,探索它如何管理硬件资源、提供系统服务,并确保多任务高效运行。文章以浅显易懂的语言,逐步揭示内核的神秘面纱,从基础概念到实际应用,让您对操作系统的核心组件有更深的理解。
96 5
|
1月前
|
程序员 编译器 数据处理
【C语言】深度解析:动态内存管理的机制与实践
【C语言】深度解析:动态内存管理的机制与实践
|
2月前
|
存储 资源调度 监控
操作系统的心脏:内核深度解析
在数字世界的庞大机器中,操作系统扮演着至关重要的角色。而作为操作系统核心的内核,其重要性不言而喻。本文将深入浅出地探讨操作系统内核的基本概念、主要功能和工作原理,以及它如何影响计算机的整体性能和稳定性。我们将从内核的设计哲学出发,逐步深入到内核的各个组成部分,包括进程管理、内存管理、文件系统和设备驱动等关键模块。最后,文章还将讨论当前操作系统内核面临的挑战和未来的发展趋势。通过这篇文章,读者将获得对操作系统内核更深层次的理解,从而更好地把握计算机系统的运行机制。
65 1

热门文章

最新文章

相关产品

  • 物联网平台
  • 下一篇
    无影云桌面