【ARM 嵌入式 C 入门及渐进 12.1 -- 寄存器多bit值返回宏实现】


请阅读【嵌入式开发学习必备专栏 】


文章目录

背景

在嵌入式开发过程中,我们经常遇到需要返回从第n bit 到 m bit的值,如下:
在这里插入图片描述
比如,在我们想判断 MEMWIDTH 的值是多少的时候,我们需要返回 bit[10:8] 的值,如果一个一个bit去判断那就太麻烦了,那么我们如何使用宏来实现这个功能?

宏代码实现

要实现一个宏,用于返回一个32位寄存器从第n位开始的width位的值,可以使用位操作。这个宏将会做两件事:

  1. 首先,将寄存器向右移动n位,使得我们感兴趣的那一段位移到寄存器的最低位。
  2. 然后,使用位掩码来保留低width位,同时清除其他所有位。
    以下是实现上述操作的宏定义:
#define GET_BITS(reg, n, width) (((reg) >> (n)) & ((1U << (width)) - 1))

这里:

  • reg是要从中提取位的32位寄存器。
  • n是想要开始提取的起始位(从0开始计数)。
  • width是想要提取的位宽。

这个宏首先通过((reg) >> (n))将寄存器向右移动n位,然后用((1U << (width)) - 1)创建一个width位全为1的掩码,并与移位后的寄存器进行与操作(&),从而只保留最低的width位。
这个方法的关键在于构造掩码。1U << (width)将数值1无符号左移width位,这样就在对应的位置创建了一个单个的1,其余位为0。然后从这个数值中减去1,将那个单一的位以下的所有位都变为1,达到了我们想要的掩码效果。
例如,如果有一个寄存器reg,想要获取从第5位开始的3位,可以这样调用宏:

uint32_t value = GET_BITS(reg, 5, 3);

这将返回reg从第5位开始的3位的值。

最近更新

  1. TCP协议是安全的吗?

    2024-04-21 00:18:06       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-21 00:18:06       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-21 00:18:06       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-21 00:18:06       20 阅读

热门阅读

  1. LeetCode题练习与总结:爬楼梯--70

    2024-04-21 00:18:06       11 阅读
  2. 通过HTML标签来实现文字颜色的设置

    2024-04-21 00:18:06       15 阅读
  3. mybatis批量查询List实体类

    2024-04-21 00:18:06       13 阅读
  4. List<Entity>与Map<String, Entity>互转

    2024-04-21 00:18:06       14 阅读
  5. 【iOS】—— SDWebImage源码学习(2)(源码解读)

    2024-04-21 00:18:06       16 阅读
  6. Windows 下 bat 脚本调用 Git bash 环境 sh 脚本

    2024-04-21 00:18:06       15 阅读
  7. redis zremove删除不掉【bug】

    2024-04-21 00:18:06       23 阅读
  8. draw.io使用心得

    2024-04-21 00:18:06       16 阅读
  9. 发挥创意,绘制无限可能:draw.io 使用心得

    2024-04-21 00:18:06       15 阅读
  10. Excel使用 CONCATENATE 函数或“&”符号拼接多列数据

    2024-04-21 00:18:06       30 阅读
  11. js高级 笔记01

    2024-04-21 00:18:06       15 阅读
  12. Golang最快的Web框架

    2024-04-21 00:18:06       16 阅读
  13. 【算法基础】第四章:数学知识

    2024-04-21 00:18:06       15 阅读