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的更多相关文章

  1. ARM Cortex M3系列GPIO口介绍(工作方式探讨)

    一.Cortex M3的GPIO口特性    在介绍GPIO口功能前,有必要先说明一下M3的结构框图,这样能够更好理解总线结构和GPIO所处的位置. Cortex M3结构框图     从图中可以看出 ...

  2. ARM Cortex M3(V7-M架构)硬件启动程序 一

    Cortex-m3启动代码分析笔记 启动代码文件名是STM32F10X.S,它的作用先总结下,然后再分析. 启动代码作用一般是: 1)堆和栈的初始化: 2)中断向量表定义: 3)地址重映射及中断向量表 ...

  3. ARM 架构、ARM7、ARM9、STM32、Cortex M3 M4 、51、AVR 之间有什么区别和联系?(转载自知乎)

    ARM架构:  由英国ARM公司设计的一系列32位的RISC微处理器架构总称,现有ARMv1~ARMv8种类. ARM7:       一类采用ARMv3或ARMv4架构的,使用冯诺依曼结构的内核. ...

  4. STM32学习之路入门篇之指令集及cortex——m3的存储系统

    STM32学习之路入门篇之指令集及cortex——m3的存储系统 一.汇编语言基础 一).汇编语言:基本语法 1.汇编指令最典型的书写模式: 标号 操作码        操作数1, 操作数2,... ...

  5. 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 ...

  6. 【ARM-Linux开发】ARM7 ARM9 ARM Cortex M3 M4 有什么区别

    ARM7 ARM9 ARM Cortex M3 M4 区别 arm7 arm9 可以类比386和奔腾, 不同代,arm9相比arm7指令集和性能都有所增强,arm7和arm9都有带mmu和无mmu的版 ...

  7. 【freertos】002-posix模拟器设计与cortex m3异常处理

    目录 前言 posix 标准接口层设计 模拟器的系统心跳 模拟器的task底层实质 模拟器的任务切换原理 cortex M3/M4异常处理 双堆栈指针 双操作模式 栈帧 EXC_RETURN 前言 如 ...

  8. ARM Cortex M3(V7-M架构)硬件启动程序 二

    解析 STM32 的启动过程 解析STM32的启动过程 当前的嵌入式应用程序开发过程里,并且C语言成为了绝大部分场合的最佳选择.如此一来main函数似乎成为了理所当然的起点——因为C程序往往从main ...

  9. stm32和cortex M3学习内核简单总结

    1.stm32综述 2.寄存器组 3.操作模式和特权级别 4.存储器映射 5.中断和异常 6.其他 Stm32综述 这可以说是我第一款认真学习的单片机了,学完这个就要开启我通往arm9的大门了,接下来 ...

  10. CORTEX -M3 : Registers in depth

    http://www.zembedded.com/cortex-m3-registers-in-depth/ Thanks for the overwhelm response you show in ...

随机推荐

  1. 写在php设计模式前

    在学校写代码的时候,看过许多代码,跟着学长学过一段时间.找工作的时候由于种种原因,从事于本专业, 最近重拾php,充充电,找个好工作. 以前项目中设计模式用的比较多的也就是单例模式,看书中回顾写过的代 ...

  2. Ubuntu免安装配置MySQL

    1.下载mysql http://cdn.mysql.com/Downloads/MySQL-5.6/mysql-5.6.21-linux-glibc2.5-x86_64.tar.gz 2.解压 ta ...

  3. DevExpress控件之TreeList

    基于v18.1 使用AppendNode方法手动赋值时,首先要添加treeListColumn 默认样式                                     修改后的样式   1 ...

  4. [Golang] 从零開始写Socket Server(2): 自己定义通讯协议

    在上一章我们做出来一个最基础的demo后,已经能够初步实现Server和Client之间的信息交流了~ 这一章我会介绍一下怎么在Server和Client之间实现一个简单的通讯协议.从而增强整个信息交 ...

  5. 性能测试脚本开发(LR.NET控件)

    性能测试过程中,最耗费经历的就是编写性能测试脚本的过程,在大部分的测试工具中都是采用录制的方式,通过录制产生脚本,然后根据需要进行修改,以及参数化.有些时候为了能够完成某一个功能的脚本,需要将录制下来 ...

  6. Vue 引入ElementUI 2.0.11:依赖未发现的问题

    转自:https://blog.csdn.net/cslucifer/article/details/79019649

  7. 基于pcl 和 liblas 库 las与pcd格式(rgb点)相互转换(win10 VS2013 X64环境 )

    #include <liblas/liblas.hpp> #include <iomanip> #include <iostream> #include <s ...

  8. 在一个JS文件中引用另一个JS文件

    方法一,在调用文件的顶部加入下例代码: document.write(”<script language=javascript src=’/js/import.js’></scrip ...

  9. js 第二篇 (DOM 操作)

    DOM 节点含有:元素节点,属性节点,文本节点. document.getElementById("id") //通过页面元素ID 值 捕获元素对象,得到的值为一个object 1 ...

  10. 禁用android studio自身的ndk编译disable automatic ndk-build call

    1,让studio不自动编译jni文件,而是我们手动通过ndk-build编译    打开工程下面的app文件夹, 找到build.gradle   添加如下:  defaultConfig {   ...