Cortex-M0存储器系统
目录
- 1.概述
- 2.存储器映射
- 3.程序存储器、Boot Loader和存储器重映射
- 4.数据存储器
- 5.支持小端和大端
- 数据类型
- 数据对齐
- 访问非法地址
- 多寄存器加载和存储指令的使用
- 6.存储器属性
1.概述
Cortex-M0处理器具有32位系统总线接口,以及32位地址线(4GB的地址空间)。系统总线基于AHB_Lite总线协议,外设总线一般采用APB协议。APB协议通过一个总线桥连接到AHB_Lite上,并且运行的时钟频率和AHB总线不同。APB的数据链路也是32位的,但由于外设的地址区域往往较小,因此地址线一般要少于32位。
由于主总线系统和外设总线是相互分离的,而且有些情况下时钟频率控制也是不同的,应用程序在访问外设前可能需要初始化微控制器的时钟控制硬件。有些情况下,一个微控制器可能有多个外设总线段,并且每个段运行在不同的时钟频率下。除了可以让系统的某些部分运行在较低频率下以外,独立的总线段还可以停止某些外设系统的时钟,这样也就可以降低功耗了。
2.存储器映射
Cortex-M0处理器的4GB存储器空间从架构上被分为多个区域,每个区域对应一种推荐的用途,而且各区域的操作方法也可能会有所不同。
尽管存储器映射已经被架构预先定义,存储器映射的实际用法却可以非常灵活,使用中的限制也不多。
每个区域的用途如下:
- 代码区域(0x00000000~0x1FFFFFFF)
代码区域的大小为512MB,主要用于存储代码,这其中也包括作为程序映像一部分的向量表,另外也可用作数据存储器(连接到RAM)。 - SRAM区域(0x20000000~0x3FFFFFFF)
SRAM区域位于存储器映射的第二个512MB,其主要用于数据存储,这其中也包括栈,还可以用于程序代码存储。 - 外设区域(0x40000000~0x5FFFFFFF)
外设区域的大小也为512MB,它主要用于外设以及数据存储。不过,外设区域中不允许执行程序。连接到该存储器区域的外设可以是AHB_Lite外设,也可以是APB外设(通过总线桥)。 - RAM区域(0x60000000~0x9FFFFFFF)
RAM区域包括两个512MB的块,这样就得到了一个总共1GB的区域。这两个512MB存储器块主要用于数据存储,而且多数情况下RAM区域可使用1GB的连续存储器空间。RAM区域中还可以执行程序代码,这两个区域的唯一差异在于它们的存储器属性不同。如果设计中存在一个系统级的缓存(level-2缓存),这个差异就会带来缓存行为的差异。 - 设备区域(0xA0000000~0xDFFFFFFF)
外部设备区域包括两个512MB的存储器块,这样就能总共得到1GB空间。两个512MB块主要用于外设和I/O,设备区域不允许程序执行,但可用作通用数据存储。同RAM区域类似,设备区域的两部分也有不同的存储器属性。 - 内部私有外设总线(PPB)(0xE0000000~0xE00FFFFF)
内部PPB存储器空间用于处理器内部的外设,包括中断控制器、NVIC和调试部件等。内部PPB存储器空间的大小为1MB,且这个区域内不允许执行程序。
在PPB存储区域中,有一段特殊的存储器区域被定义为系统控制空间(SCS),其地址范围为0xE000E000~0xE000EFFF。该区域内包括中断控制寄存器、系统控制寄存器和调试控制寄存器等,NVIC寄存器也是SCS存储器空间的一部分。 - 保留存储器空间(0xE0100000~0xFFFFFFFF)
存储器映射的最后511MB为保留存储器空间,这段空间在某些微控制器中预留为供应商特定的用途。
尽管Cortex-M0处理器的存储器映射是固定的,存储器的用法却可以非常灵活。例如,处理器可以在SRAM区域包含多个SRAM存储器块,CODE区域也是一样,而且外部RAM区域也可以执行程序。
在一个实际系统的存储器映射中,对于一个典型的Cortex-M0微控制器,通常可以在其中找到以下部分:
- Flash存储器(用于程序代码)
- 内部SRAM(用于数据)
- 内部外设
- 外部存储器接口(用于外部存储器和外部外设,可选)
- 其他外部外设的接口(可选)
将这些部件放到一起,就可以得到如下图所示的微控制器实例:
3.程序存储器、Boot Loader和存储器重映射
-
Cortex-M0的程序存储器一般使用片上Flash存储器,不过,程序也可以存储在外部或者使用其他类型的存储器设备(如EEPROM)。
当Cortex-M0处理器从复位中启动时,它会首先访问0地址的向量表,从而取得MSP的初始值和复位向量,然后它就可以从复位向量开始执行程序。要保证系统正常工作,系统中需要有合法的向量表和合法的程序存储器,这样处理器才不会执行恶意软件代码。 -
要实现这个目的,Flash存储器一般是从地址0开始的。不过,在用户编程以前,有些微控制器的Flash存储器中可能没有任何程序。为了保证处理器可以正确地启动,有些基于Cortex-M0的微控制器含有一个Boot loader,这是个位于微控制器芯片上的一小段程序,它会在处理器上电后执行并跳转,而且如果Flash存储器已编程的话,它会跳转到Flash中的用户程序执行。Boot loader由芯片供应商预先编程,有时它位于片上Flash存储器并且与用户程序是分离的(这样用户更新程序也不会影响到Boot loader),而其他情况下Boot loader则会位于和可编程程序存储器分离的非易失性存储器中(防止用户意外擦除Boot loader)。
-
当Boot loader存在时,微控制器通常会在系统总线上使用一种存储器映射切换特性,也就是重映射(remap)。存储器映射的切换由硬件寄存器控制,Boot loader执行时会重置这些寄存器。系统可以使用多种重映射方案,一种常见的处理是,Boot loader将会在上电阶段通过地址别名重映射到存储器的开头,如下图:
-
ARM微控制器使用的另外一种重映射特性为,SRAM块可以重映射到地址0上。微控制器使用的非易失性存储器如Flash等要比SRAM慢,如果微控制器运行在较高的时钟频率下,Flash存储器中的程序在执行时就会需要插入等待状态。而将SRAM重映射到地址0后,程序就可以被复制到SRAM并以最快速度执行,这样会避免取向量表时出现等待,否则会增加中断等待的时间。
4.数据存储器
Cortex-M0处理器的数据存储器用于软件变量、栈存储,而且有些情况下还用于堆存储。应用程序使用需要动态内存分配的C函数时,堆存储就可以用上。
如果嵌入式应用中没有操作系统(OS),那么它只会使用一个栈(只需主栈)。在这种情况下,数据存储器的分配如下所示:
由于栈操作基于满减小的栈分配,而堆存储在分配时是增加的。为了使存储分配最具效率,通常将栈放在存储器块的尾部,而堆存储则紧跟在普通存储的后面。
而对于使用了嵌入式OS的嵌入式应用程序来说,每个任务可能都会有自己的栈存储区域。每个任务都可以有自己分配的存储器块,每个存储器块都可以包含有栈、堆和数据。
5.支持小端和大端
- Cortex-M0处理器可以支持小端的存储器格式,也可以支持大端的。大小端在系统设计时由微控制器供应商选择,而软件不能修改。使用小端配置时,字数据的最低字节存储在字的位0到位7;而若采用大端配置,字数据的最低字节则会存储在位24到位31,如下所示。
这两种配置都支持不同大小的数据处理,Cortex-M0处理器可以产生字节、半字以及字传输。在访问存储器时,存储器接口会根据传输大小和地址的最低两位选择数据链路,如下所示:
应该注意大端配置有两种例外:取值总是小端的,且对私有外设总线(PPB)的访问总是小端的。
数据类型
Cortex-M0处理器支持各种不同的数据大小,提供了用于不同大小传输的各种存储器访问指令,而且还具有一个32位AHB_Lite接口,该接口支持32位、16位和8位传输。例如,C语言开发中常用到的数据类型如下所示:
如果使用了其他宽度更大的数据类型,C编译器会自动将这些数据传输转换为存储器访问指令。应该注意的是,对于外设寄存器访问,使用的数据类型应该同硬件寄存器大小相匹配。要不外设可能会忽略此次传输,或者运行结果同预想的不一致。
多数情况下,连接到APB的外设应该使用字传输来访问。这是因为APB协议没有定义传输宽度信号,所有的传输也就都被认为是字大小的。因此,通过APB访问的外设寄存器通常被声明为“volatile unsigned integer”。
数据对齐
Cortex-M0处理器支持的Thumb指令只能产生对齐访问。这就意味着传输地址只能是传输大小的整数倍。例如,字传输只能访问0x0、0x4、0x8和0xC之类的地址,与之类似,半字访问只能访问0x0、0x2、0x4等地址,所有的字节访问则都是对齐的。
如果程序试图进行一次非对齐访问,错误异常就会产生并且引发硬件错误处理的执行。
访问非法地址
在连接到Cortex-M0处理器的AHB系统中,地址解析逻辑会探测正在访问的地址,如果访问的是一个非法位置,总线系统就会回应一个错误信号,取值或数据访问都可以引起总线错误。
跳转影子指令的取值则是这种操作的一个例外,由于Cortex-M0处理器的流水线本性,指令会被提前取出。因此,如果程序执行到合法存储器区域的尾部,并且执行了一个跳转指令,这种情况下,处理器可能会预取一个合法指令存储器区域之外的地址,这就会导致AHB系统的总线错误。不过,如果由于跳转,错误指令没有得到执行,总线错误就会被忽略掉。
多寄存器加载和存储指令的使用
Cortex-M0处理器支持多寄存器加载和存储指令,如果使用正确的话,系统性能可以得到很大的提升。例如,它可以用于加快数据传输过程或者作为一种自动调整指针的方法。
6.存储器属性
Cortex-M0处理器可以使用多种存储器系统和设备,要使不同设备的软件移植更加容易,可以对存储器映射中的每个区域设置相应的存储器属性。存储器属性是存储器访问的特征,它们能够影响对存储器的数据和指令访问,对外设的访问也是一样。
在ARMv6-M架构中,不同的存储器区域可以定义多种存储器访问属性:
- 可执行(executable):这是个公用属性,它定义了程序是否允许在存储器区域中执行。根据ARM文档,如果一个存储器区域是不可执行的,它就会被标记为eXecuteNever(XN,永不执行)。
- 可缓冲(bufferable):在一个可缓冲存储器区域上执行数据写操作,写传输可能会被缓存起来,这就意味着处理器不必等待当前的写传输完成,就可以继续执行下一条指令。
- 可缓存(cacheable):如果系统中含有缓存设备,它可以在本地备份当前传输的数据,并可以下次在访问相同的存储器位置时重新使用,这样可以加速系统执行。缓存设备可以是一个缓存存储器单元,也可以是存储器控制器中的一个小的缓存。
- 可共享(shareable):可共享属性定义了多个处理器是否可以访问公用存储器区域,如果一块存储器区域是可共享的,存储器系统需要确保多个处理器访问这一区域时的一致性。
基于这些存储器属性,处理器架构上定义了多种类型的存储器,以及每个存储器区域可以使用哪种类型的设备:
- 普通存储器:可以是共享也可以是不共享的,可以是缓存的也可以是不缓存的。对于可缓存的存储器,缓存行为可以分为写通(WT)以及写回写分配(WBWT)。
- 设备存储器:设备存储器为不可缓存的,可以是共享的,也可以是不共享的。
- 强序存储器:这种存储器是不可缓存以及不可缓冲的,对强序区域的读写操作会立即起作用。另外,在这种存储器接口的传输顺序必须和相应的存储器访问指令的顺序一致。强序存储器区域总是可共享的。
Cortex-M0处理器中每个存储器区域的属性由这些存储器类型定义来决定,在存储器访问中,属性通过AHB系统从处理器中输出。
PPB存储器区域被定义为强序属性(SO),这就意味着存储器是不可缓存和不可缓冲的。对于Cortex-M0,在强序区域访问结束之前,后面的操作不会执行。这种处理适用于修改系统控制空间(SCS)的寄存器,此时一般希望在下一条指令执行前,对寄存器的修改操作就会立即执行。
相关文章:
Cortex-M0存储器系统
目录1.概述2.存储器映射3.程序存储器、Boot Loader和存储器重映射4.数据存储器5.支持小端和大端数据类型数据对齐访问非法地址多寄存器加载和存储指令的使用6.存储器属性1.概述 Cortex-M0处理器具有32位系统总线接口,以及32位地址线(4GB的地址空间&…...
软件测试——测试用例之场景法
一、场景法的应用场合 场景法主要用于测试软件的业务流程和业务逻辑。场景法是基于软件业务的测试方法。在场景法中测试人员把自己当成最终用户,尽可能真实的模拟用户在使用此软件的操作情景: 重点模拟两类操作: 1)模拟用户正确…...
英文写作中的常用的衔接词
1. 增补 (Addition) in addition, furthermore, again, also, besides, moreover, whats more, similarly, next, finally 2.比较(Comparision) in the same way, similarly, equally, in comparison, just as 3. 对照 (Contrast) in contrast, on …...
新库上线 | CnOpenData中国地方政府债券信息数据
中国地方政府债券信息数据 一、数据简介 地方政府债券 指某一国家中有财政收入的地方政府地方公共机构发行的债券。地方政府债券一般用于交通、通讯、住宅、教育、医院和污水处理系统等地方性公共设施的建设。地方政府债券一般也是以当地政府的税收能力作为还本付息的担保。地…...
Python 条件语句
Python条件语句是通过一条或多条语句的执行结果(True或者False)来决定执行的代码块。 可以通过下图来简单了解条件语句的执行过程: Python程序语言指定任何非0和非空(null)值为true,0 或者 null为false。 Python 编…...
C语言思维导图大总结 可用于期末考试 C语言期末考试题库
目录 一.C语言思维导图 二.C语言期末考试题库 一.C语言思维导图 导出的图可能有点糊,或者查看链接:https://share.weiyun.com/uhf1y2mp 其实原图是彩色的不知道为什么导出时颜色就没了 部分原图: 也可私信我要全图哦。 图里的链接可能点不…...
从零实现深度学习框架——再探多层双向RNN的实现
来源:投稿 作者:175 编辑:学姐 往期内容: 从零实现深度学习框架1:RNN从理论到实战(理论篇) 从零实现深度学习框架2:RNN从理论到实战(实战篇) 从零实现深度…...
Flink 连接流详解
连接流 1 Union 最简单的合流操作,就是直接将多条流合在一起,叫作流的“联合”(union)。联合操作要求必须流中的数据类型必须相同,合并之后的新流会包括所有流中的元素,数据类型不变。这种合流方式非常简…...
分享112个HTML电子商务模板,总有一款适合您
分享112个HTML电子商务模板,总有一款适合您 112个HTML电子商务模板下载链接:https://pan.baidu.com/s/13wf9C9NtaJz67ZqwQyo74w?pwdzt4a 提取码:zt4a Python采集代码下载链接:采集代码.zip - 蓝奏云 有机蔬菜水果食品商城网…...
2023备战金三银四,Python自动化软件测试面试宝典合集(八)
马上就又到了程序员们躁动不安,蠢蠢欲动的季节~这不,金三银四已然到了家门口,元宵节一过后台就有不少人问我:现在外边大厂面试都问啥想去大厂又怕面试挂面试应该怎么准备测试开发前景如何面试,一个程序员成长之路永恒绕…...
J-Link RTT Viewer使用教程(附代码)
目录 RTT(Real Time Transfer)简介 使用教程 常用API介绍 RTT缓冲大小修改 使用printf重定向 官方例程 RTT(Real Time Transfer)简介 平常调试代码中使用串口打印log,往往需要接出串口引脚,比较麻烦,并且串口打印速度较慢,串…...
C语言——指针、数组的经典笔试题目
文章目录前言1.一维数组2.字符数组3.二维数组4.经典指针试题前言 1、数组名通常表示首元素地址,sizeof(数组名)和&数组名两种情况下,数组名表示整个数组。 2、地址在内存中唯一标识一块空间,大小是4/8字节。32位平台4字节,64位…...
【C语言】程序环境和预处理|预处理详解|定义宏(上)
主页:114514的代码大冒险 qq:2188956112(欢迎小伙伴呀hi✿(。◕ᴗ◕。)✿ ) Gitee:庄嘉豪 (zhuang-jiahaoxxx) - Gitee.com 文章目录 目录 文章目录 前言 一、程序的翻译环境和执行环境 二、详解编译和链接 1.翻译环境 2.编…...
上海霄腾自动化装备盛装亮相2023生物发酵展
上海霄腾自动化携液体膏体粉剂颗粒等灌装生产线解决方案亮相2023生物发酵展BIO CHINA2023生物发酵展,作为生物发酵产业一年一度行业盛会,由中国生物发酵产业协会主办,上海信世展览服务有限公司承办,2023第10届国际生物发酵产品与技…...
python+flask开发mock服务
目录 什么是mock? 什么时候需要用到mock? 如何实现? pythonflask自定义mock服务的步骤 一、环境搭建 1、安装flask插件 2、验证插件 二、mock案例 1、模拟 返回结果 2、模拟 异常响应状态码 3、模拟登录,从jmeter中获取…...
数据库(三)
第三章 MySQL库表操作 3.1 SQL语句基础 3.1.1 SQL简介 SQL:结构化查询语言(Structured Query Language),在关系型数据库上执行数据操作、数据检索以及数据维护的标准语言。使用SQL语句,程序员和数据库管理员可以完成如下的任务。 改变数据…...
2023软考纸质证书领取通知来了!
不少同学都在关注2022下半年软考证书领取时间,截止至目前,上海、湖北、江苏、南京、安徽、山东、浙江、宁波、江西、贵州、云南、辽宁、大连、吉林、广西地区的纸质证书可以领取了。将持续更新2022下半年软考纸质证书领取时间,请同学们在证书…...
Python requests模块
一、requests模块简介 requests模块是一个第三方模块,需要在python环境中安装: pip install requests 该模块主要用来发送 HTTP 请求,requests 模块比 urllib 模块更简洁。 requests模块支持: 自动处理url编码自动处理post请求…...
工业智能网关解决方案:物联网仓储环境监测系统
仓储是连接生产、供应和销售的中转系统,对于促进生产、提高效率有着重要的辅助作用。对于很多大型工厂或食品厂来说,需要对仓储环境进行严控的控制,以确保产品或食品的质量,避免不必要的产品损耗,提高产品存管的水平。…...
Linux进程线程管理
目录 存储管理 linux内存管理基本框架 系统空间管理和用户空间管理 进程与进程调度 进程四要素 用户堆栈的扩展 进程三部曲:创建,执行,消亡 系统调用exit(),wait() 内核中的互斥操作 存储管理 linux内存管理基本框架 系统空间管理…...
分享111个HTML电子商务模板,总有一款适合您
分享111个HTML电子商务模板,总有一款适合您 111个HTML电子商务模板下载链接:https://pan.baidu.com/s/1e8Wp1Rl9RaFrcW0bilIatg?pwdc97h 提取码:c97h Python采集代码下载链接:采集代码.zip - 蓝奏云 HTML5家居家具电子商务网…...
百度前端必会手写面试题整理
请实现一个 add 函数,满足以下功能 add(1); // 1 add(1)(2); // 3 add(1)(2)(3);// 6 add(1)(2, 3); // 6 add(1, 2)(3); // 6 add(1, 2, 3); // 6function add(...args) {// 在内部声明一个函数,利用闭包的特性保存并收集…...
ubuntu 安装支持GPU的Docker详细步骤
安装依赖项 sudo apt-get update sudo apt-get install -y apt-transport-https ca-certificates curl gnupg-agent software-properties-common 添加 Docker GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo apt-key fingerpr…...
usbmon+tcpdump+wireshark USB抓包
文章目录usbmon抓包及配合wireshark解析usbmon抓包及配合wireshark解析 usbmon首先编译为内核模块,然后通过modprobe usbmon加载到linux sys文件系统中 rootroot-PC:~# modprobe usbmon 而后 linux系统下安装 tcpdump rootroot-PC:~# apt-get install tcpdump…...
【LeetCode】剑指 Offer 04. 二维数组中的查找 p44 -- Java Version
题目链接: https://leetcode.cn/problems/er-wei-shu-zu-zhong-de-cha-zhao-lcof/ 1. 题目介绍(04. 二维数组中的查找) 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递…...
TDengine 3.0.2.5 查询再优化!揭秘索引文件的工作原理
TDengine 3.0 虽然对底层做了大规模的优化重构,但是相对于数据文件的工作逻辑和 2.0 相比是整体保持不变的。本系列文章的主旨在于帮助用户深入理解产品,并且拥有基本的性能调试思路,从而获得更好的产品体验。本期文章会在讲解 TDengine 时序…...
蓝牙耳机哪个品牌性价比高?性价比高的无线蓝牙耳机
现如今耳机已经十分普及,大多数人会随身佩戴蓝牙耳机,相较于传统耳机,无线耳机不仅携带方便,舒适度上也更加出色。不过市面上的无线耳机种类繁多,很多朋友不知道该如何挑选,所以小编特意整理了一期性价比高…...
python的disutils创建分发包
python中的distutils包主要用创建共享包,安装包,在平时安装python模块的时候,使用的命令如下: python setup.py install 其实以上代码就是distuitls包提供的功能,直接使用setup.py来进行安装一个包,在用这种…...
【洛谷】P1195 口袋的天空
明显看出为最小生成树,那么:难点在哪里呢?if(cntn-k)//******{flag1;break;}为什么是cntn-k呢而不是k呢?!!!解释:(如果每个已经连在一起了就不能分开,不管多少…...
JavaScript高级程序设计读书分享之3章——3.5操作符
JavaScript高级程序设计(第4版)读书分享笔记记录 适用于刚入门前端的同志 目录 操作符 一元操作符 递增/递减操作符 一元加和减 布尔操作符 逻辑非 逻辑与 逻辑或 乘性操作符 乘法操作符 除法操作符 取模操作符 加性操作符 加法操作符 减法操作符 关系操作符 相等操…...
电子商务网站建设前期/百度指数是免费的吗
文章预览前言RxJava的简单使用1、环境准备2、activity_main.xml3、MianActivity.java4、效果预览RxJava操作符1、创建操作符2、转换操作符3、 合并操作符4、功能操作符5、过滤操作符前言 官方的定义:一个在Java VM上使用可观测的序列,组成异步的、基于事…...
公司网站不续费能打开网页吗/宁波seo外包优化
近期博主在GitChat上举办了一场 彻底玩转Tampermonkey的Chat 欢迎各位前来捧场. 报名地址 使用 Tampermonkey 编写高级跨网站自动化任务脚本 在Tamermokeny中编辑脚本可以很容易地控制自己的网页 处理一般性的操作外,如更换问题,图片,注入样式和脚本外 如果我们要做更多 这就…...
网站怎样做注册窗口/软文模板
连续自适应平移(CAMShift)算法基本上一个改进版的meanshift算法,可构建一个了解所选对象特征并自动跟踪它的对象跟踪器。meanshift算法理解,选择一个感兴趣区域,希望对象跟踪器跟踪该对象。在这个区域中,根…...
上海网站设计制作公司/浏览器观看b站视频的最佳设置
抄书 (二分查找贪心) 提示:二分查找一般写成非递归形式 时间复杂度:O(logn) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid85904#problem/B Description Co…...
wordpress 更换模板/推广普通话奋进新征程手抄报
首先证明欧几里德算法(即最大公约数算法) 设有a,b两个数; ak*br,ra%b; 假设d是a,b的一个公约数,a%d0,b%d0;ra-k*b,因此r%d0; 即所有a,b的公约数都是b,a%b的公约数,那么gcd(a,b)gcd(b,a%b); 所以当a%b0时,即…...
东莞网站建设服务有什么用/seo搜索引擎优化总结报告
转载自: http://blog.csdn.net/u014610226/article/details/47679323 以下是对C中不能重载为友元函数的四个运算符进行了详细的分析介绍,需要的朋友可以过来参考下 C规定有四个运算符 , ->, [], ()不可以是全局域中的重载(即不能重载为友员函数)&…...