CM3的存储器系统支持所谓的“位带”(bit-band)操作。通过它,实现了对单一比特

的原子操作。位带操作仅适用于一些特殊的存储器区域中。

位带区与位带别名区的膨胀关系图

在位带区中,每个比特都映射到别名地址区的一个字——这是个只有 LSB才有效的字。

支持位带操作的两个内存区的范围是:

0x2000_0000-0x200F_FFFF(SRAM区中的最低 1MB)

0x4000_0000-0x400F_FFFF(片上外设区中的最低1MB)

例子:

1.  在地址 0x20000000处写入 0x3355AACC

2.  读取地址 0x22000008。本次读访问将读取 0x20000000,并提取比特 2,值为1。

3.  往地址 0x22000008 处写 0。本次操作将被映射成对地址 0x20000000 的“读-改-写”操作

(原子的),把比特 2清0。

4.  现在再读取 0x20000000,将返回 0x3355AAC8(bit[2]已清零)。

位带别名区的字只有 LSB 有意义。另外,在访问位带别名区时,不管使用哪一种长度的数据传

送指令(字/半字/字节),都把地址对齐到字的边界上,否则会产生不可预料的结果。

位带操作的优越性

1.      位带操作对于硬件 I/O密集型的底层程序最有用处了

2.位带操作还能用来化简跳转的判断。当跳转依据是某个位时,以前必须这样做:

  读取整个寄存器

  掩蔽不需要的位

  比较并跳转

现在只需:

从位带别名区读取状态位

      比较并跳转

3.位带操作还有一个重要的好处是在多任务中,用于实现共享资源在任务间的“互锁”访问。多任务的共享资源必须满足一次只有一个任务访问它——亦即所谓的“原子操作”。以前的读-改-写需要 3 条指令,导致这中间留有两个能被中断的空当。于是可能会出现如下图所示的紊乱危象:

同样的紊乱危象可以出现在多任务的执行环境中。其实,图 5.8所演示的情况可以看作是多任

务的一个特例:主程序是一个任务,ISR是另一个任务,这两个任务并发执行。

通过使用 CM3的位带操作,就可以消灭上例中的紊乱危象。CM3把这个“读-改-写”做成一

个硬件级别支持的原子操作,不能被中断,如图 5.9所演示

5.5.2    其它数据长度上的位带操作

位带操作并不只限于以字为单位的传送。亦可以按半字和字节为单位传送。例如,可以使用

LDRB/STRB来以字节为长度单位去访问位带别名区,同理可用于 LDRH/STRH。但是不管用哪一个对

子,都必须保证目标地址对齐到字的边界上。

5.5.3    在 C语言中使用位带操作

为简化位带操作,也可以定义一些宏。比如,我们可以建立一个把“位带地址+位序号”转换成别名地址的宏,再建立一个把别名地址转换成指针类型的宏:

//把“位带地址+位序号”转换成别名地址的宏

#define BITBAND(addr, bitnum) ((addr & 0xF0000000) + 0x20000000 + ((addr & 0xFFFFF) << 5) + (bit<<2));

//把该地址转换成一个指针

#define MEM_ADDR(addr) *((volatile unsigned long *) (adr));

在此基础上,我们就可以如下改写代码:

MEM_ADDR(DEVICE REG0) = 0xAB; //使用正常地址访问寄存器,即把0xAB作为DEVICE REG0地址上的值

MEM_ADDR(DEVICE_REG0) = MEM_ADDR(DEVICE_REG0) | 0x2; //传统做法

MEM_ADDR(BITBAND(DEVICE_REG0, 1)) = 0x1; //使用位带别名地址

请注意:当使用位带功能时,要访问的变量必须用 volatile来定义。因为 C编译器并不知道同一个比特可以有两个地址。所以就要通过 volatile,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的考虑,在中途使用寄存器来操作数据的复本,直到最后才把复本写回——这会导致按不同的方式访问同一个位会得到不一致的结果(可能被优化到不同的寄存器来保存中间结果——译注)

bit-band是Cortex-M3内核中针对某一段区域进行位和字映射的机制,对于位操作,如IO控制LED,相比传递的C语言的位操作,提供了很大的方便.
bit-band 区域将存储器别名区(bit-band alias region)的一个字映射为 bit-band区的一个位. 处理器存储器映射包括两个 bit-banding 区域, 它们分别为 SRAM 和外设存储区域中的最低的 1MB.
下图是处理器的地址空间映射,包含了(bit-banding区域的映射)

Cortex-M3 存储器映射有2个32MB别名区,它们被映射为两个1MB的bit-band 区:

  • 对 32MB SRAM 别名区的访问映射为对1MB SRAM bit-band区的访问
  • 对 32MB 外设别名区的访问映射为对1MB外设bit-band区的访问


映射公式显示如何将别名区中的字与 bit-band 区中的对应位或目标位关联,映射公式如下:
bit_word_offset = (byte_offset x 32) + (bit_number x 4)
bit_word_addr = bit_band_base + bit_word_offset

这里:

  • Bit_word_offset 为bit-band存储区中的目标位的位置
  • Bit_word_addr为别名存储区中映射为目标位的字的地址
  • Bit_band_base 是别名区的开始地址
  • Byte_offset 为bit-band 区中包含目标位的字节的编号
  • Bit_number 为目标位的位位置(0-7)

下图显示了 SRAM bit-band 别名区和 SRAMbit-band 区之间的 bit-band 映射的例子:

  • 地址 0x23FFFFE0 的别名字映射为 0x200FFFFF 的bit-band 字节的位 0:
    0x23FFFFE0=0x22000000+(0xFFFFF*32)+0*4
  • 地址 0x23FFFFFC 的别名字映射为 0x200FFFFF 的bit-band 字节的位 7:
    0x23FFFFFC=0x22000000+(0xFFFFF*32)+7*4
  • 地址 0x22000000 的别名字映射为 0x20000000 的bit-band 字节的位 0:
    0x22000000=0x22000000+(0*32)+0*4
  • 地址 0x220001C 的别名字映射为 0x20000000 的bit-band 字节的位 0:
    0x2200001C=0x22000000+(0*32)+7*4

向别名区写入一个字与在 bit-band 区的目标位执行读-修改-写操作具有相同的作用.
写入别名区的字的位0决定了写入bit-band 区的目标位的值。将位 0 为1的值写入别名区表示向 bit-band 位写入1, 将位0 为0 的值写入别名区表示向bit-band 位写入 0.
别名字的位[31:1]在 bit-band 位上不起作用。写入 0x01 与写入 0xFF 的效果相同, 写入0x00 与写入0x0E 的效果相同.
读别名区的一个字返回 0x01 或0x00, 0x01 表示 bit-band 区中的目标位置位, 0x00 表示目标位清零。位[31:1]将为 0。
注:采用大端格式时,对 bit-band 别名区的访问必须以字节方式。否则访问值不可预知。

以下是一个根据bit-band区域地址和目标位来计算bit-band alias region映射的对应字节的宏(来源于Atmel ASF的bit-banding Example):

[cpp] view plaincopyprint?
  1. /**
  2. *  \brief Calculate bit band alias address.
  3. *
  4. *  Calculate the bit band alias address and return a pointer address to word.
  5. *
  6. *  \param addr The byte address of bitbanding bit.
  7. *  \param bit  The bit position of bitbanding bit.
  8. *  \callergraph
  9. */
  10. #define BITBAND_ALIAS_ADDRESS(addr, bit) \
  11. ((volatile uint32_t*)((((uint32_t)(addr) & 0xF0000000) + 0x02000000) \
  12. +((((uint32_t)(addr)&0xFFFFF)*32)\
  13. +(  (uint32_t)(bit)*4))))

参考资料:《《Cortex-M3权威指南》》

关于bit-banding的解释和相关作用(转载)相关推荐

  1. IP地址子网掩码位数换算方法及解释子网掩码的作用

    IP地址子网掩码位数换算方法及解释子网掩码的作用 子网位 /主机位 子网掩码 子网最大数 /主机最大数 2 /22 /10 | 255.192.0.0 2 /4194302 3 /21 /11 | 2 ...

  2. 中国史前文化相关作用地图

    中国史前文化相关作用地图 Jietu20190403-094759@2x.jpg

  3. AutoEventWireup 属性的作用(转载)

    AutoEventWireup 属性的作用(转载) 一.Page指令中的AutoEventWireup="true",该指令默认值为true. 指示页的事件是否自动绑定.如果启用了 ...

  4. cmos sensor camera banding 现象发生原因及相关问题

    在某些场景下,使用者可以看到相机画面出现一条一条的滚动暗条纹,如下图片所示,这样的现象,通常是CMOS sensor 曝光时间方面的因素引起的. 我们把这种现象叫做banding或者flicker,为 ...

  5. java浅显易懂解释return相关

    搜了一些帖子没有很浅显易懂的解释关于return相关的帖子,所以写一个简单的随笔方便大家阅读. 首先,看三个例子. (1) public void get1(){ } (2) public boole ...

  6. linux 目录的粘滞位,Linux浅谈SUID,SGID,Sticky粘滞位对目录以及文件的相关作用

    我们知道在Linux中,root管理员的权限是很大的,能够支持执行绝大部分程序以及命令进而对文件进行相对应的修改,写入.当然这些作用只能体现在root管理员上.但是有一个现象,有些普通用户是可以通过p ...

  7. wince下sources\sources.cmn\Makefile.def的相关作用

    1:首先是Makefile.def: ---------------------------------------- 在所有驱动的makefile中有!INCLUDE $(_MAKEENVROOT) ...

  8. 选择偏好(Selectional Preference)概念解释及其相关研究

    在自然语言处理中,"选择偏好"这个概念非常容易理解.比如下面的例子: a)我吃了一个苹果. b)电脑吃了一串钥匙. 很明显a句子是非常合理的,但b句子就非主流了.对于"吃 ...

  9. input元素所有type类型及相关作用

    随着HTML5的出现,input表单元素新增了多种输入控件,用以接受各种类型 的用户输入.其中text.password.radio.checkbox.button.submit.reset.imag ...

最新文章

  1. VS2013导入opencv320配置属性文件
  2. 【推荐】查找一代用户出口Userexit
  3. “睡服”面试官系列第二篇之promise(建议收藏学习)
  4. ei会议论文录用但不参加会议_美国研究生和博士申请论文发表真的很重要吗?...
  5. UBNT ER-4 UPnP相关配置
  6. NSIS 简易教程(四)
  7. 内网穿透软件对比——cpolar : 花生壳(中)
  8. 数据结构和算法学习网站
  9. 湖南大学计算机博士好考吗,欲报考湖南大学人文类博士者注意:极难毕业
  10. 自组织神经网络SOM算法对Iris数据集进行聚类的matlab实现
  11. java命令--jstack 工具
  12. 考研英语作文:小作文、图画 图表 文字材料大作文
  13. 吃货联盟订餐系统(查看餐袋功能实现)
  14. 场效应管工作原理分析及总结
  15. 重拾JavaSE学习笔记
  16. 输入任意一种物质,要求输出其每种元素的数量。比如输入 CaCO3,其组成分别为 Ca:1,C:1,O:3,输出 Ca1C1O3
  17. 幼儿计算机培训老师,幼儿园教师计算机的培训计划方案
  18. 扩展 WPF 动画类
  19. 《英雄联盟》与路易威登联名的皮肤
  20. 随机换桌面壁纸工具开发

热门文章

  1. 公安部:河南特大套路贷受害人超95%为在校大学生
  2. 【Shell】Shell脚本中调用另一个脚本的三种方式(fork/exec/source)
  3. 求最大公约数c语言实验心得,C语言编程实训报告(合集)
  4. 用vc++穷举windows应用程序密码
  5. 三步必杀(P4231)
  6. go-ipfs-api
  7. 一篇关于运放自激振荡的帖子
  8. Android 4.4 kitkat以上及以下根据uri获取路径的方法
  9. MacOS删除系统自带软件-MacOS10.15 Catalina删除系统系统软件
  10. python chm模块_python3.7.0官方参考文档 最新api文档 chm