STM32F4编程手册学习2_内存模型

1. 内存映射

MCU将资源映射到一段固定的4GB可寻址内存上,如下图所示。

内存映射将内存分为几块区域,每一块区域都有一个定义的内存类型,一些区域还有一些附加的内存类型。

内存类型有以下几种:

  • Normal
    处理器可以为了性能而对访问该区域的任务进行重排序。

  • Device
    处理器保证访问该内存的任务与其他访问Device或者Stronly-ordered内存的任务相对顺序不变。

  • Stronly-ordered
    处理器保证该访问该内存的任务与所有其他任务保持相对顺序。

  • Execute Never(XN)
    处理器避免对此的指令访问,任何试图从该区域预取指令的操作都将造成一个内存管理错误异常。

2. 内存访问顺序

对于大多数由显示内存指令访问指令所引起的内存访问而言,系统不会保证访问完成的顺序与程序中顺序一致。如果程序的执行依赖于两次内存完成的顺序,那么应该使用内存屏障指令,来保证内存访问按照程序代码中的顺序执行。

然而,内存系统可以保证,一些对Device 和Strongly-ordered内存的访问操作按顺序执行。如下表所示,其中A1、A2分别表示两次内存访问操作指令,“<” 表示A1先与A2执行,“-” 表示两者顺序不确定。

内存访问屏障有DMB, DSB, ISB三种,如下表所示

指令 描述
DMB Data Memory Barrier, 保证此指令之前的内存任务执行完毕,才会执行后续的内存任务。
DSB Data Synchronization Barrier, 保证此指令之前的内存任务执行完毕,之后才会执行后续指令。
DMB Instruction Synchronization Barrier, 保证所有已经完成的内存任务可以被后续指令识别。

下面是几个使用内存屏障的例子:

  • 向量表
    如果程序改变了向量表某一项的入口,之后使能了对应异常。那么在使能异常之前,需要使用DMB指令,以保证异常进入的是新的异常向量表。

  • Self-Modifying code
    如果程序包含Self-Modifying code代码,在代码修改后需要立即需要使用ISB指令,以保证后续指令使用了新的程序代码。

  • memory map switching
    如果系统支持内存映射变换机制,那么需要在内存映射变化后使用DSB,以保证后续程序使用更新后的内存映射。

  • 动态异常优先级更改
    如果在一个异常正在执行或者就绪状态时,该异常优先级更改了,应该使用DSB指令,以保证改变生效。

访问Strongly-ordered 内存不需要使用DMB指令。

3. 内存访问行为

内存地址 内存区域 内存类型 XN 描述
0x00000000-0x1FFFFFFF Code Normal - 程序代码的可执行区域,数据也可以放在这里
0x20000000-0x3FFFFFFF SRAM Normal - 数据的可执行区域 代码也可以放在这里, 该区域包括位带及位带别名区
0x40000000-0x5FFFFFFF Peripheral Device XN 外设区,该区域包括位带及位带别名区
0x60000000-0x9FFFFFFF External RAM Normal - 数据外部存储区
0xA0000000-0xDFFFFFFF External Device Device XN 外部设备区
0xED000000-0xED0FFFFF Private Peripheral BUS Stronly-ordered XN 此区域报刊NVIC、系统定时器、系统控制块
0xED100000-0xFFFFFFFF Memory mapped peripherals Device XN 这个区域包含STM32标准外设

Code, SRAM, exteral RAM都可以保存程序,建议程序指令保存在Code区域。

3.1 bit-band 位带

位带是指将位带别名区的一个字映射到位带区域的一个位上,如下图所示。位带区域占据SRAM和外设区的最低1M字节的地方。

向别名区写一个字更新了位带区的一个对应的位。别名区一个字的bit[0]决定了对应位的值, 而其他位bit[31;1]则对位带区没有什么影响。所以写0xFF跟写0x01对位带区的影响是一样的。

本文图表引用自《PM0214: STM32F3, STM32F4 and STM32L4 Series Cortex®-M4 programming manual》

本文参考ST官方文档《PM0214: STM32F3, STM32F4 and STM32L4 Series Cortex®-M4 programming manual》

STM32F4编程手册学习2_内存模型的更多相关文章

  1. STM32F4 编程手册学习1_编程模型

    STM32F4 programming manual_1 1. 处理器模式与特权等级 处理器模式分为以下两种: 线程模式: 用来执行应用软件: 处理器从reset出来时,进入线程模式: CONTROL ...

  2. 《深入理解 Java 虚拟机》学习 -- Java 内存模型

    <深入理解 Java 虚拟机>学习 -- Java 内存模型 1. 区别 这里要和 JVM 内存模型区分开来: JVM 内存模型是指 JVM 内存分区 Java 内存模型(JMM)是指一种 ...

  3. JVM学习笔记——内存模型篇

    JVM学习笔记--内存模型篇 在本系列内容中我们会对JVM做一个系统的学习,本片将会介绍JVM的内存模型部分 我们会分为以下几部分进行介绍: 内存模型 乐观锁与悲观锁 synchronized优化 内 ...

  4. Java并发编程:JMM(Java内存模型)和volatile

    1. 并发编程的3个概念 并发编程时,要想并发程序正确地执行,必须要保证原子性.可见性和有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 1.1. 原子性 原子性:即一个或多个操作要么全部 ...

  5. Java并发编程:JMM (Java内存模型) 以及与volatile关键字详解

    目录 计算机系统的一致性 Java内存模型 内存模型的3个重要特征 原子性 可见性 有序性 指令重排序 volatile关键字 保证可见性和防止指令重排 不能保证原子性 计算机系统的一致性 在现代计算 ...

  6. JAVA并发编程的艺术 JMM内存模型

    锁的升级和对比 java1.6为了减少获得锁和释放锁带来的性能消耗,引入了"偏向锁"和"轻量级锁". 偏向锁 偏向锁为了解决大部分情况下只有一个线程持有锁的情况 ...

  7. Java虚拟机学习 - 体系结构 内存模型

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆”, 它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB,最 ...

  8. Java虚拟机学习 - 体系结构 内存模型(1)

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代" ."非堆",  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内 ...

  9. JVM学习--(二)内存模型、可见性、指令重排序

    我们将根据JVM的内存模型探索java当中变量的可见性以及不同的java指令在并发时可能发生的指令重排序的情况. 内存模型 首先我们思考一下一个java线程要向另外一个线程进行通信,应该怎么做,我们再 ...

随机推荐

  1. js 变速动画函数

    //获取任意一个元素的任意一个属性的当前的值---当前属性的位置值 function getStyle(element, attr) { return window.getComputedStyle ...

  2. GitHub Desktop 拉取 GitHub上 Tag 版本代码

    一直在使用 GitHub Desktop 图形化 git 管理工具,统一项目框架版本时需要切换到ThinkPHP Tag 分支版本,步骤如下, 1,先在 GitHub 中找到需要的版本,点进去 2,点 ...

  3. LogViewer超大文本浏览工具

    官方下载 LogViewer 是一款简单好用的log日志文件查看工具.您想要查看log日志吗?那么不妨来看看这款LogViewer .该款工具可以在短短数秒内打开上G的LOG文件,支持高亮某行文字(例 ...

  4. zabbix基本监控各指标简解

    监控项目及使用模板 监控http和https: Template App HTTP Service     Template App HTTPS Service 监控cpu,内存,网络等: Templ ...

  5. 缓存反向代理-Varnish

    简介 Varnish是一款高性能.开源的缓存反向代理服务器.它从客户端接受请求,并尝试从缓存中响应请求,如果无法从缓存中提供响应,Varnish 向后端服务器发起请求,获取响应,将响应存储在缓存中,然 ...

  6. IO流,字符流

    import java.io.FileReader; public class FileReaderDemo { public static void main(String[] args) thro ...

  7. 课时133.margintop失效原因(理解)

    我们之前讲过如果只有子元素设置了margin top而父元素没有边框则会跟着被顶下来的. 而我们怎么解决这个问题呢? 就是给父元素设置一个边框 而为什么我们在第二个浮动的盒子设置边框没有用呢?应为第一 ...

  8. arping命令用法

    arping命令使用说明 BusyBox v1.17.3 (2011-07-20 17:01:30 CST) multi-call binary. Usage: arping [-fqbDUA] [- ...

  9. 立个Flag (20180617-20181231)

    入行7年,今年年初正式接触Java,前面6年一直在做C++相关的工作,去年年中跳槽,语言从C++转向了C#,半年之后又转向了Java. 虽说语言有相似性,但每种语言都有自己独有的知识体系,想要游刃有余 ...

  10. vuetify.js框架 下拉框数据改变DOM原数据未清除

    今天遇到一个奇怪的bug 需求很简单,就是将“引擎能力”下拉框选中的值作为筛选条件传入到“样本类型”下拉框中,默认“样本类型”下拉框显示所有样本类型 看图: 如图所示,功能很简单. 其实还是对vuet ...