一段有关MPU配置代码的几个小疑问

news2024/11/19 5:55:54

fdf442be17fc5375d4bef262015ed24a.jpeg

当我们阅读一些STM32F7STM32H7系列芯片例程,或者基于这两类芯片通过cubeMx进行配置并用到MPU功能时,往往会在代码里看到下面这段MPU配置。

d0bbd56bae52eb19eb49721911eb274d.png

对这段代码可能有人有些疑问,这里重点一起聊聊其中的3个,供参考。

第一个疑问,那行做赋值0x87的代码是什么意思?

第二个疑问,这段代码的注释【绿色】是说将未定义的区域配置为Strongly Ordered存储属性,这个未定义到底如何理解?从代码看,这里清晰地对从0开始的整个4G空间做了配置,未定义区域到底指的哪里?

第三个疑问,这段代码往往并不是开发者自己配置的。如果使用CubeMx进行配置它会自动给我们加上这段,为什么要加这段?很多时候经测试,即使没这段代码似乎也没有什么问题。

这几个问题,涉及到MPU和Cortex M7内核芯片试探性访问的知识。我尽量通俗地加以介绍,知晓怎么回事即可。

我们知道,通过MPU可以配置特定地址空间的存储属性,给CPU约定访问权限。我们在对某块地址空间做MPU配置时,通常需要设置起始地址、空间大小、CacheableBufferableShareable子区属性、区块编号等。这里的地址空间,英文用Region来特指,后面都使用该词。

实际应用中我们往往会针对不同的RegionMPU配置,在做不同Region的MPU设置时,可能出现地址空间重叠的情况。比方像下面64KB空间内做了3个不同RegionMPU配置,而且发生了不同Region的地址重叠。

c63ef351232cf8b468d17e2270c97f3b.png

这个时候,对于地址重叠空间的MPU属性由Region编号大的决定。结合上图,N+2编号RegionMPU属性优先级最高,Region N的最低。

刚才我在前面提到了子区,它是什么意思呢?

子区也是个特定概念,英文用SubRegion。所谓Subregion,当我们对某地址空间不小于256B的Region进行MPU配置时,可以把该Region等分为8个子区【Subregion】,并把当前Region的MPU属性针对部分子区进行排除性或说例外性设置。啥意思呢?比方说,本来当前Region经MPU配置后为WriteThough支持共享的存储属性,同时呢,又将其中的2个子区做排除性设置,即这2个子区不适用当前的MPU配置。好比当前举国抗疫防新冠,要求全面强制核酸,但同时又可以做例外说明,那些基本足不出户的老人或小孩不适用该要求。

在MPU配置寄存器MPU_RASR里有个8位字段SRD专门用来配置子区的排除属性。每1位对应一个子区,高位对应高地址子区,低位对应低地址子区。某位为0表示该子区使用当前MPU配置,为1表示该子区不适用当前配置,即被排除在外。【更多细节可以参考下图】

8a2832f9da19da3d8aead94813a4ec9c.png

不妨举例说一下,假设我们选择了某64KB区域进行MPU设置,其中有2个SubRegion被做了MPU排除处理,即其中2个8KB空间不适用当前的MPU配置。如下图所示:

1f01cc007535ed9de7813005a429edb7.png

此时,对应到MPU配置寄存器MPU_RASR里的SRD字段的内容就是0x48。

聊到这里,我们就可以回答开篇的部分疑问了。

6a2eebf72d11da7c1d0382570bed5ad6.png

从上面这段代码不难看出,首先将从0开始的4GB空间做了MPU配置,Region编号为0,最终被配置为Strongly Ordered存储属性。那句赋值0x87的代码则是进一步针对当前Region里的SubRegion做属性排除设置。这里的0x87就是给前面提到的给SRD字段的赋值。【这里每个子区空间大小为512MB】

259431f57214ceefc635a73d84a699b1.png

也就是说,这4GB空间中有4个子区不适用目前配置的MPU属性,即下图中几个红色方框内区域。

21423117b08c077ccbcfb127e8c97fe0.png

换句话说,这里并没有真正针对整个4GB空间做MPU配置,实际上只对上图中的绿色区域做了Strongly Order的存储属性设置。然而,代码的注释又说是针对未定义区域做MPU配置,怎么理解未定义区域呢?

这里说的未定义区域到底是上图中红色区域还是绿色区域呢?

显然不是指红色区域,因为这里特意对红色区域做了MPU属性排除处理,即当前MPU配置根本就不适用它。那是指绿色区域?似乎也不对!因为绿色区域的MPU配置不是很清晰吗?Region编号、地址空间、访问属性等一应俱全。何来未定义呢?

。。。。。。

我们可以进一步了解到,上图中绿色区域对应的是外部存储设备的地址空间。如果我们需要用到外部存储设备的话,往往还会针对外扩的存储单元再做MPU配置。比方我们基于STM32H7芯片外扩了一个32MBSDRAM,然后做了如下的MPU配置。

337215dbfb483292353060c5fec03164.png

照样,先对整个4GB空间做了MPU初始配置,即前面一直在解说的内容。然后针对外扩的32MBSDRAM做了特定MPU配置,此时的Region标号为1,访问属性为Write Through。此块Region空间属于前面初始配置中外部存储空间的一部分,即出现不同Region地址重叠所以这块SDRAM所在RegionMPU访问属性就是Write Through,而不再是一开始配置的Strongly Ordered属性了。见下图中绿色区域中那部分黄色方块。

42eb06e7d3b79a96436e1df76e38f4ac.png

当然,如果说你还外扩了其它的存储单元,比方扩个QSPI什么的,如果MPU属性依然不同于Strongly Ordered、且Region编号大于0,更多绿色区域将被新的黄色区域替换。比方变成下面图示的样子。

1387dd52f238f0ab6d7068af5d389ef0.png

也就是说,注释代码里提到的未定义区域,是指初始定义出来的绿色区域中没有被用户的实际外部存储器所占用的剩余空间。即上面图中抠除黄色区域以后剩下的绿色区域。

这里又衍生个问题,为什么要这样做呢?

这个问题又涉及到M7内核芯片的试探性访问特性。试探性访问可以提升芯片的性能,但有时可能也会导致些问题。比方,由于试探性访问,在CPU访问外部存储器时,可能发生越界访问。如果说它访问到一个本不存在存储设备的地址时,可能发生锁死异常。结合上面图形,黄色地址区域是实实在在的外部存储器件所占用的空间,如果因为试探性访问可能越界访问不存在物理存储单元的绿色区域而导致麻烦。

不过,由于CPU不会针对配置为Device Strongly Ordered存储属性的地址空间进行试探性访问。为了防止上面提到的问题,于是就有了前面谈到的一上来就把所有用于外部访问的存储空间配置为Strongly Ordered属性,显然这个配置是个粗框架性的。用户具体使用时根据实际存储器的特性、容量等再配置特定的MPU属性并覆盖原来初始设置,其它未用区域依然保持Strongly Ordered属性,正是为了防止在没有放置实际存储器的地方发生试探性访问。

最后一个问题,有人发现即使不要那段针对4GB空间的MPU初始代码,似乎也没遇到啥问题。

这也正常。因为你即使外扩了存储单元,并非一定会因为试探性访问导致异常。比方你外扩了32MB的存储单元,未必就一定会要用到最后一个位置,说不定还剩余很多,远不至于读到最后边界而让CPU试探到不存在存储器的空间。但是事先做那段初始配置,对系统是一个很好的未雨绸缪。就好像河边安置防护栏一样,没有,也不至于天天怎么样;有,肯定要安全保险得多。

几个小疑问,本以为可以很快写完,不禁啰嗦了这么久,就此打住。祝君好运!

**********************************

往期话题阅读链接:

1、开启Cache后UART无法发送新数据

2、STM32定时器更新事件可以暂停否?

3、为何STM32H7的ADC数据不变?

4、如何让CDC设备批量接收64字节以上数据

5、两份基于STM32作FDCAN开发的资料

848ac5f999a78d70c12c855140cdfdeb.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62900.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【AI工程论文解读】04-通过Ease.ML/CI实现机器学习模型的持续集成(上)

作者:王磊 更多精彩分享,欢迎访问和关注:https://www.zhihu.com/people/wldandan 持续集成是一种软件开发实践,即团队开发成员经常集成他们的工作,通常每个成员每天至少集成一次,也就意味着每天可能会发生多…

机器人xacro设计+gazebo/rviz启动

机器人xacro设计gazebo/rviz启动项目需求方案机器人的本体设计机器人本体集成car_gazebo.xacroinertial惯性矩阵 head.xacro小车底盘base.xacro摄像头camera.xacro雷达laser.xacro机器joint关节控制器传感器sensor设计机器人joint关节控制器move.xacro摄像头传感器camera_senso…

Metabase学习教程:系统管理-7

使用MetabaseAPI MetabaseAPI简介。 本文介绍如何使用Metabase的API。我们自己使用该API连接前端和后端,因此您可以编写Metabase几乎可以执行的所有操作。 警告:MetabaseAPI可能会更改 开始之前有两个注意事项: API可能会更改。API与前端…

软件测试要学会哪些东西才能拿2w+的工资?

软件开发人员的月薪达到2万还是比较轻松的,但是软件测试人员想要月薪过万的话,我认为可以从两个方面去考虑: 1. 一种就是项目的测试负责人:测试人员需要对软件的整体性能改进提出建设性方案,所以很多软件测试人员最终…

数据结构和算法之《栈》详解

标题:栈的思路及代码实现 作者:Ggggggtm 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 文章目录: 一、栈的概念及结构 1、1 栈的概念 1、2 栈的结构 二、栈的思路及代码实现详解…

电脑技巧:推荐5个非常实用的软件

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

uniapp 之使用 u-upload 组件来实现图片上传

uniapp 之使用 u-upload 组件来实现图片上传前言一、官方示例用法分析二、关闭自动上传,使用手动上传的方式,代码html 代码js 代码css 代码总结分析前言 在使用 uniapp 开发的微信小程序中使用了图片上传功能,使用了 uniapp 的图片上传组件 注意:我这里后端接口接收…

小程序开发平台

小程序开发平台顾名思义就是一个可以开发小程序的地方。 小程序开发平台:【电脑浏览器输入3M.FKW.COM了解详情】 适合群体:企业、机构、个体户 小程序开发方式: 自建——可以通过套用小程序模板,利用拖拽式小程序开发工具&…

某组态软件工程文件加密机制探究

某组态软件工程文件加密机制探究 前言 在工业自动化控制领域,组态软件是数据采集与过程控制的专用软件,是实现人机交互必不可少的工具。工程设计人员使用组态软件在PC机上进行工程画面组态的编辑,然后把编译后的组态逻辑通过以太网或串口下载…

HSRP协议(思科私有)/VRRP协议(公有)

数据来源 1、HSRP热备份路由协议(备份网关) 出现背景: 如下图一个公司拉两条网线一条用来备份网关是192.168.0.253,平时用的网关是254,如果网关是254的这条网线出问题了就可以使用备份不影响公司让人员上网&#xff…

2022最新版 Java 学习线路图

第 1 阶段 - 企业级开发 - java 基础 学习掌握本阶段的内容,可以实现诸如迅雷下载软件、QQ 聊天客户端、中小网站,例如:小型旅游网站、小型电商网站的开发 第 2 阶段 - 企业及开发 - 基础框架 学习掌握本阶段内容,可以快速、规范的…

CRC校验——以SHT4xA温湿度传感器为例

CRC校验——以SHT4xA温湿度传感器为例一、简介二、计算方法(一)步骤(二)参考代码(C语言)(三)检验:CRC(0xBEEF) 0x92三、参考一、简介 循环冗余校验码(CRC&am…

[附源码]计算机毕业设计JAVA疫情防控下高校教职工健康信息管理系统

[附源码]计算机毕业设计JAVA疫情防控下高校教职工健康信息管理系统 项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术&…

试剂盒和示踪剂—艾美捷FLIVO探针活体凋亡检测分析

针对FLIVO(FLuorescence in vIVO)探针的研究,本篇文章推荐艾美捷ImmunoChemistry(ICT)FLIVO探针系列的:天冬氨酸蛋白酶(Caspases)活性检测试剂盒,及 FLIVO示踪剂,主要用于细胞凋亡活体检测,助力…

大型分布式系统下缓存应该怎么玩,才能用得高效

大家好,今天我们来聊一聊在大型分布式系统中,缓存应该怎么玩,从毕业到现在也有三年多了,大大小小的系统也经历了几十个,今天就从各个角度来讨论一下,我们的不同的缓存应该怎么玩,才能用的高效。…

N皇后问题(分支限界法)

问题描述: 在 n * n 格的棋盘上放置彼此不受攻击的 n 个皇后。按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题等价于在 n * n 的棋盘上放置 n 个皇后,任何 2个皇后不放在同一行或同一列或同一斜线上…

Ansys Speos | 新型计算方法:使用 GPU 提升计算速率

前言 Speos 在2022R2版本中正式推出 GPU 计算功能,相比于 CPU 计算,相同HPC32配置,高性能显卡在仿真计算中将会更显计算优势,在仿真数据量大、材料属性复杂、光源种类多的条件下,Speos 视觉模拟会消耗更多仿真计算时间…

ARM异常处理(1):异常类型、优先级分组和异常向量表

本系列文章将以Cortex-M3内核为例,对ARM的异常(exception)进行分析。 文章目录1 异常类型2 优先级3 向量表1 异常类型 Cortex-M3提供了一个功能丰富的异常体系结构,它支持很多系统异常和外部中断。异常编号1-15表示系统异常,16及以上表示外部…

0116 查找算法 Day5

剑指 Offer 04. 二维数组中的查找 在一个 n * m 的二维数组中,每一行都按照从左到右 非递减 的顺序排序,每一列都按照从上到下 非递减 的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该…

2022快手电商短视频运营白皮书:Q2对比Q1GMV总值增长率达12%

1、2022快手电商短视频运营白皮书:Q2对比Q1GMV总值增长率达12%新榜讯 12月2日,快手电商发布《2022快手电商短视频运营白皮书》。白皮书数据显示,2022年4-6月,随着平台商家对短视频渠道的认知提升,挂车短视频生产量不断…