cortex-m3权威指南_core M3

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

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)
上一篇 2022年10月13日 下午2:36
下一篇 2022年10月13日 下午2:36


相关推荐

  • 史上最详细的Hadoop环境搭建

    史上最详细的Hadoop环境搭建GitChat作者:鸣宇淳原文:史上最详细的Hadoop环境搭建关注公众号:GitChat技术杂谈,一本正经的讲技术【不要错过文末活动哦】前言Hadoop在大数据技术体系中的地位至关重要,Hadoop是大数据技术的基础,对Hadoop基础知识的掌握的扎实程度,会决定在大数据技术道路上走多远。这是一篇入门文章,Hadoop的学习方法很多,网上也有很多学习路线图。本文的思路是:以安装部署A

    2022年4月28日
    35
  • HP电脑win10系统蓝牙不可用解决办法实例[通俗易懂]

    HP电脑win10系统蓝牙不可用解决办法实例[通俗易懂]以win10系统为例子:Cortana里搜蓝牙,打开蓝牙和其他设备设置页面:当时遇到的情况是没有蓝牙那一块儿先检查了蓝牙服务都是正常的:又检查了设备管理器,问题来了,发现没有蓝牙这个项:先用电脑管家一通诊断修复,没用,然后用驱动精灵一通修复诊断还是没用。去网上看了下,说什么的都要,有些说蓝牙硬件坏了,需要重新买个替换掉。但是看…

    2022年8月13日
    10
  • @RequestParam注解使用

    @RequestParam注解使用1、作用:@RequestParam:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解)2、语法:语法:@RequestParam(value=”参数名”,required=”true/false”,defaultValue=””)value:参数名required:是否包含该参数,默认为true,表示该请求路径中必须包含该参数,如果不包含就报…

    2022年6月30日
    47
  • css中什么是伪元素,CSS伪元素是什么?

    css中什么是伪元素,CSS伪元素是什么?什么 伪元素 之前不是说了伪类吗 怎么又跑出来一个伪元素吗 它们不是一样的吗 呵呵 其实伪类和伪元素是两个不同的概念 今天小编就为大家介绍一下伪元素 一 什么是伪元素 css 伪元素代表了某个元素的子元素 这个子元素虽然在逻辑上存在 但却并不实际存在于文档树中 二 语法伪元素的语法 selector pseudo element property value 标签 伪元素 性质 值 CSS 类也可以

    2026年3月18日
    1
  • unit 5 Communicating with other users

    unit 5 Communicating with other users
    unit5Communicatingwithotherusers
     
    在命令下还有一些关于通讯的命令。有些还允许实时的通信,提供功能性的chat,当其他人允许你给他发送邮件。

    Real-TimeCommunica

    2022年4月30日
    44
  • Windows Phone 奇怪现象之ListBox在WP8能载入数据在WP7.x不能

    Windows Phone 奇怪现象之ListBox在WP8能载入数据在WP7.x不能

    2021年8月22日
    66

发表回复

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

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