Cortex-M3 Bit-Banding
Cortex-M3 Bit-Banding
1. 概述
CM3的存储器系统支持所谓的“位带”(bit-band)操作。
通过它,实现了对单一bit的原子操作。位带操作仅适用于一些特殊的存储器区域中。

从汇编角度看:

与传统方法的比较:

在位带区中,每个比特都映射到别名地址区的一个字——这是个只有 LSB才有效的字。
支持位带操作的两个内存区的范围是:
**0x2000_0000-0x200F_FFFF(SRAM区中的最低 1MB)
0x4000_0000-0x400F_FFFF(片上外设区中的最低1MB)  **
2. 优点
- 位带操作对于硬件 I/O密集型的底层程序最有用处了;
- 位带操作还能用来化简跳转的判断。
 当跳转依据是某个位时,以前必须这样做:
 读取整个寄存器
 掩蔽不需要的位
 比较并跳转
 现在只需:
 从位带别名区读取状态位
 比较并跳转
- 位带操作还有一个重要的好处是在多任务中,用于实现共享资源在任务间的“互锁”访问;
 多任务的共享资源必须满足一次只有一个任务访问它——亦即所谓的“原子操作”。
 以前的读-改-写需要 3 条指令,导致这中间留有两个能被中断的空当。
 于是可能会出现如下图所示的紊乱危象:
  
 同样的紊乱危象可以出现在多任务的执行环境中.其实,上图所演示的情况可以看作是多任
 务的一个特例:主程序是一个任务,ISR是另一个任务,这两个任务并发执行。
 通过使用 CM3的位带操作,就可以消灭上例中的紊乱危象。CM3把这个“读-改-写”做成一
 个硬件级别支持的原子操作,不能被中断,如下图:
  
3. 其它数据长度上的位带操作
位带操作并不只限于以字为单位的传送。亦可以按半字和字节为单位传送。例如,可以使用
LDRB/STRB来以字节为长度单位去访问位带别名区,同理可用于 LDRH/STRH。但是不管用哪一个对
子,都必须保证目标地址对齐到字的边界上。
4. 在 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,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的考虑,在中途使用寄存器来操作数据的副本,直到最后才把副本写回——这会导致按不同的方式访问同一个位会得到不一致的结果(可能被优化到不同的寄存器来保存中间结果——译注)
Cortex-M3 Bit-Banding的更多相关文章
- ARM Cortex M3系列GPIO口介绍(工作方式探讨)
		一.Cortex M3的GPIO口特性 在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图 从图中可以看出 ... 
- ARM Cortex M3(V7-M架构)硬件启动程序 一
		Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ... 
- ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)
		ARM架构: 由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7: 一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ... 
- STM32学习之路入门篇之指令集及cortex——m3的存储系统
		STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码 操作数1, 操作数2,... ... 
- Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors
		Implementation of Serial Wire JTAG flash programming in ARM Cortex M3 Processors The goal of the pro ... 
- 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别
		ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ... 
- 【freertos】002-posix模拟器设计与cortex m3异常处理
		目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ... 
- ARM Cortex M3(V7-M架构)硬件启动程序 二
		解析 STM32 的启动过程 解析STM32的启动过程 当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择.如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main ... 
- stm32和cortex M3学习内核简单总结
		1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ... 
- CORTEX -M3 : Registers in depth
		http://www.zembedded.com/cortex-m3-registers-in-depth/ Thanks for the overwhelm response you show in ... 
随机推荐
- flask的安全注意事项,如何防范XSS、CSRF、JSON安全
			参考官方文档:http://docs.jinkan.org/docs/flask/security.html 1.xss Flask 配置 Jinja2 自动转义所有值,除非显式地指明不转义.这就排除 ... 
- 【GLSL教程】(七)逐像素的光照 【转】
			http://blog.csdn.net/racehorse/article/details/6662540 逐像素的方向光(Directional Light per Pixel) 这一节将把前面的 ... 
- GLSL逐顶点光照[转]
			转载:http://blog.csdn.net/hgl868/article/details/7872350 引言 在OpenGL中有三种类型的光:方向光(directional).点光(point) ... 
- ArcGIS教程:面积制表
			摘要 计算两个数据集之间交叉制表的区域并输出表. 插图 使用方法 · 区域定义为输入中具有同样值的全部区.各区无需相连. 栅格和要素数据集都可用于区域输入. · 假设区域输入和类输入均为具有同样分辨率 ... 
- MySQL经常使用命令--create命令使用
			切换数据库的字符集 在mysql中的配置文件里: 使用vim /etc/mysql/my.cnf [client] default-character-set = utf8 [mysqld] char ... 
- C 递归  递归指的是在函数的定义中
			C 递归 递归指的是在函数的定义中使用函数自身的方法. 举个例子:从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?"从前有座山,山里有座庙,庙里有个老和尚,正在给 ... 
- Android设计中的尺寸问题
			Android把屏幕大小分成四种:small, normal, large, xlarge; 屏幕密度分成:low(ldpi), medium(mdpi), high(hdpi), extra hig ... 
- POJ 2001 Shortest Prefixes 【 trie树(别名字典树)】
			Shortest Prefixes Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 15574 Accepted: 671 ... 
- 【LeetCode】Partition List ——链表排序问题
			[题目] Given a linked list and a value x, partition it such that all nodes less than x come before nod ... 
- html的table使用div创建
			午休时间写了一个使用div创建table的案例 1.样式 <style> .table { display: table; } .tableRow { display: table-row ... 
