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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • 魔百盒CM211-2系列(ZG/CH/YS)海思MV300H/310芯片-刷机固件及教程

    魔百盒CM211-2系列(ZG/CH/YS)海思MV300H/310芯片-刷机固件及教程魔百盒CM211-2系列(ZG/CH/YS)海思MV300H/310芯片-刷机固件及教程固件说明:1、魔百盒CM211-2-全系列-海思Hi3798MV300H/310-通用NAND和EMMC卡刷固件,支持红外蓝牙遥控,支持常见多种无线,同时支持RTL8822BS、RTL8822CS、MT7661、MT7663、MT7668等无线;2、解除官方屏蔽无线功能,有线和无线正常使用;3、代工标识说明:一般没标识是朝歌代工,带有ZG字母的就是朝歌代工,带有CH字母的就是长虹代工,带有YS或YST字

  • 启动docker镜像命令_什么是docker镜像

    启动docker镜像命令_什么是docker镜像docker启动//加载镜像文件dockerload-imec2.tar//查看是否有mec:v2镜像dockerimagels//rundockerrun-itdmec:v2//查看容器iddockerps//执行dockerexec-it镜像idbash将文件从宿主机拷贝到docker里在宿主机里面执:dockercp宿主机中要拷贝的文件名及其路径容器名:要拷贝到容器里面对应的路径从docker里面拷文件到宿主机在宿主机

  • 5500xt挖矿算力_rx470d etc算力

    5500xt挖矿算力_rx470d etc算力…每日平均收益为R$4。RX5700XT表现出色的其他加密货币包括:以太坊经典(ETC),拉文币(RVN),天堂协议XHV和Beam(BEAM)。可以用于采矿的同一系列图形卡中的其他型号是RX5700,RX5600XT和RX5500XT。但是,与RX5700XT相比,这些其他型号的利润率较低。NvidiaRTX2060超级频率:1470MHz至1670MHzV…

  • Elasticsearch索引迁移的四种方式

    Elasticsearch索引迁移的四种方式本文主要讲解Elasticsearch下实现索引迁移的几种方式。0、引言将ES中的索引拷贝到其他ES中,或者将ES整体迁移,研究发现有两个开源的工具:elaticserch-dump和Elasticsearch-Exporter。除此之外,logstash在索引同步、迁移方面的作用也很大。两工具及logstash实现迁移的介绍、安装、使用、验证效果等展示如下:1、el…

  • 随机数:真随机数和伪随机数一样吗_rdrand真随机数

    随机数:真随机数和伪随机数一样吗_rdrand真随机数说到随机这个词,相信各位肯定都深有体会了。生活中有太多的不确定因素从各方各面影响着我们,但也正是因为这样我们的人生更加多彩,具有了更多的可能性。可以说,随机是个非常有魅力的东西。而游戏开发者通常也会利用随机让游戏更加的吸引人。例如你正在玩的手机游戏里面的抽卡系统就是很好的例子。笔者曾经在阴阳师的抽符大坑中痛苦不堪。什么,你只玩王者荣耀?那里面的抽英雄抽符文,我想你应该也经历过绝望吧。

    2022年10月22日
  • Java常见官网

    Java常见官网Javahttps://www.oracle.com/java/technologies/OpenJDKhttps://openjdk.java.net/w3c(万维网联盟)https://www.w3.org/apache(开源项目非盈利组织)https://www.apache.org/Oraclehttps://www.oracle.com/index.htmlMySQLhttps://www.mysql.com/mongoDB(分布式文件存储的数据库)https://www.

发表回复

您的电子邮箱地址不会被公开。

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