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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 基于Bootstrap的Metro风格模板

    基于Bootstrap的Metro风格模板这几天在看Bootstrap的一些书,这里整理一下书中的一些模板,方便以后使用。1.BootMetrohttp://www.guoxiaoming.com/bootmetro/2.Bootswatchhttp://bootswatch.com/3.MetroUICSS官网:http://metroui.org.ua/中文:http://www.bootcss.com/

    2025年7月3日
    3
  • 解决document.cookie无法获取到cookie问题

    解决document.cookie无法获取到cookie问题一、前言在进行前后端联调的时候,由于想实现一个登出操作,前端自动删除浏览器存储的cookie,想通过document.cookie来获取进而进行删除操作,但是发现浏览器有cookie;但是无法获取到情况遂记录二、场景复现首先登录后,浏览器中是有记录cookie的,如图然后我代码层执行documen.cookie发现获取不到,浏览器控制台也同样后面去研究了一下application中存放的cookies的属性内容,发现有个属性HttpOnly是选中状态,这个状态是由于后端设置cookie的时候

    2022年7月27日
    4
  • 什么是数据安全,为什么需要数据安全,怎么才能实现数据安全?

    什么是数据安全,为什么需要数据安全,怎么才能实现数据安全?WHAT何为数据安全?数据安全指的是用技术手段识别网络上的文件、数据库、帐户信息等各类数据集的相对重要性、敏感性、合规性等,并采取适当的安全控制措施对其实施保护等过程。与边界安全、文件安全、用户行为安全等其他安全问题相同,数据安全并非是唯一一种能提升信息系统安全性的技术手段,也不是一种能全面保障信息系统安全的技术手段。它就是一种能够合理评估及减少由数据存储所带来的安全风险的技术方式。数据安全…

    2022年5月22日
    33
  • 取得connectionStrings属性「建议收藏」

    取得connectionStrings属性「建议收藏」取得Webconfig文件连接数据库字符各个属性。代码 public string GetConnectionValue(string Keyword,string connectionString)        {            string[] aa = Keyword.Split(‘,’);                       string[] bb = co…

    2022年5月21日
    41
  • Rootkit演变

    Rootkit演变Rootkit 概述 nbsp nbsp nbsp nbsp nbsp nbsp nbsp nbsp 我第一次接触 rootkit 是在 2004 年 当时我还是一个 rookie 病毒分析师 具备一定的关于 UNIX 的 rootkit 病毒的相关知识 有一天我无意中发现 windows 系统中的一个可执行程序 在我登录这个程序的时候 windows 系统似乎没有做出任何反应 我觉得很有趣 并且准备进一步探究这个程序 然后我发现在载入模块列表中有个文件并没有出现在磁盘上 很显然

    2025年12月6日
    5
  • linux系统重启网卡命令_centos 7重启网卡命令

    linux系统重启网卡命令_centos 7重启网卡命令大家在实际工作中,经常会遇到Linux系统进行重启网卡的操作,那么具体如何进行重启呢?下面就由学习啦小编跟大家分享一下操作步骤吧,希望对大家有所帮助~linux系统重启网卡的方法一、servicenetworkrestart1、首先用CRT工具连接到Linux命令行界面。或者进入操作系统界面,选择终端输入。2、如果我们对所有的网卡进行重启操作。可以尝试输入:servicenetwork…

    2022年9月22日
    5

发表回复

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

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