cortex-m3权威指南_core M3

cortex-m3权威指南_core M3Cortex-M3Bit-Banding1.概述CM3的存储器系统支持所谓的“位带”(bit-band)操作。通过它,实现了对单一bit的原子操作。位带操作仅适用于一些特殊的存储器区域中。从汇编角度看:与传统方法的比较:在位带区中,每个比特都映射到别名地址区的一个字——这是个只有LSB才有效的字。支持位带操作的两个内存区的范围是:0x2000_0000-0x2…


Jetbrains全系列IDE稳定放心使用

Cortex-M3 Bit-Banding

1. 概述

CM3的存储器系统支持所谓的“位带”(bit-band)操作。
通过它,实现了对单一bit的原子操作。位带操作仅适用于一些特殊的存储器区域中。
位带区与位带别名区对应关系

从汇编角度看:
bitbanding对应关系汇编角度
与传统方法的比较:
与传统方法的比较
在位带区中,每个比特都映射到别名地址区的一个字——这是个只有 LSB才有效的字。

支持位带操作的两个内存区的范围是:
0x2000_0000-0x200F_FFFF(SRAM区中的最低 1MB)
0x4000_0000-0x400F_FFFF(片上外设区中的最低1MB)

2. 优点

  • 位带操作对于硬件 I/O密集型的底层程序最有用处了;
  • 位带操作还能用来化简跳转的判断。
    当跳转依据是某个位时,以前必须这样做:
    读取整个寄存器
    掩蔽不需要的位
    比较并跳转
    现在只需:
    从位带别名区读取状态位
    比较并跳转
  • 位带操作还有一个重要的好处是在多任务中,用于实现共享资源在任务间的“互锁”访问;
    多任务的共享资源必须满足一次只有一个任务访问它——亦即所谓的“原子操作”。
    以前的读-改-写需要 3 条指令,导致这中间留有两个能被中断的空当。
    于是可能会出现如下图所示的紊乱危象:
    多任务操作非原子访问
    同样的紊乱危象可以出现在多任务的执行环境中.其实,上图所演示的情况可以看作是多任
    务的一个特例:主程序是一个任务,ISR是另一个任务,这两个任务并发执行。
    通过使用 CM3的位带操作,就可以消灭上例中的紊乱危象。CM3把这个“读-改-写”做成一
    个硬件级别支持的原子操作,不能被中断,如下图:
    bit-banding原子操作

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,使得编译器每次都如实地把新数值写入存储器,而不再会出于优化的考虑,在中途使用寄存器来操作数据的副本,直到最后才把副本写回——这会导致按不同的方式访问同一个位会得到不一致的结果(可能被优化到不同的寄存器来保存中间结果——译注)

转载于:https://www.cnblogs.com/yanghong-hnu/p/6163611.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/182431.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • tomcat部署war包,jar包

    tomcat部署war包,jar包在tomcat根目录下部署war包,通过http://ip:port的方式访问网上说的方法很多,这里记录一下自己的经过实践检验的一种方法。1、先去tomcat/conf/server.xml里有一个HOST标签,有个参数appBase,表示你的应用应该部署在什么位置。例如下面写的是webapps,那就在webapps/ROOT/路径下解压你的war包。如果appBase=XXX,那么就…

    2022年6月4日
  • Vue+Element UI 商城后台管理系统[通俗易懂]

    Vue+Element UI 商城后台管理系统[通俗易懂]Vue+ElementUI商城后台管理系统一、前言1.项目背景此项目来自B站Vue实战项目:电商管理系统(Element-UI)。此项目的功能与后端提供的接口并不完全相同,根据后端接口进行开发并添加了部分功能从而进行修改。在完成此项目并测试上线后,在这里记录一下项目的开发思路,以及遇到的一些问题。自我感觉这个项目是一个很不错的关于Vue+ElementUI的练手项目2.部分效果图展示先放一些效果图项目上线地址:https://aerowang.cn/vue_shop

    2022年11月1日
  • pycharm如何设置背景图片_微信主题背景图片

    pycharm如何设置背景图片_微信主题背景图片好看的编译器能使我们愉快的完成编码工作,那么我们能不能给我们的编译器设置一个背景图片的呢???详细步骤1.打开我们的PyCharm,File–>Settings。2.Apperence–>BackgroundImage…。3.选择背景图片的路径,点击下方灰色的方块调整背景图片透明度,点击Ok,点击Ok。4.设置成功。…

    2022年8月26日
  • C语言实现一个关机程序

    C语言实现一个关机程序#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>//system()#include<string.h>//strcmp()#include<windows.h>//shutdownintmain(){ charinput[20]={0}; //一个关机程序 //shutdown-s关机 //shutdown-s-t60设计关.

    2022年7月22日
  • JAVA多线程学习笔记

    JAVA多线程学习笔记

    2022年3月8日
  • LocationManager的简单使用

    LocationManager在Android中可以根据LocationManager来获取设备所在的地理信息根据需求可以将定位的代码移动到所需的地方或者可以稍加改动获取城市的信息MainActivity中:packagecom.example.myapplicationpp;importandroid.Manifest;importandroid.app.Activity;…

    2022年4月5日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号