HAL库--内存保护(MPU)实验

news2025/1/2 3:11:27

MPU是内核外设,想获取相关资料只能从内核手册查找

MPU功能仅F7/H7系列具备

内存保护单元(MPU介绍)

MPU基本介绍

说白了MPU用来管理内存和外设存储区的访问权限

MPU可配置保护8/16个内存区域(看芯片型号),每个区域最小要求256字节,且每个区域还可配置为8个子区域(大小一样)。

可配置16个内存区域

MPU设置内存的访问权限

MPU设置内存访问权限

NO_ACCESS                          无访问

PRIV_RW                                特权读写

PRIV_RW_URO                      特权读写,禁止用户写访问               userReadOnly

FULL_ACCESS                       全访问,特权和用户都可访问

PRIV_RO                                仅支持特权读访问

PRIV_RO_URO                      只读

配置好MPU,不得访问定义外的地址空间,也不得访问未经授权的区域,否则属于非法访问。会触发MemManage异常

MPU配置内存区域的访问属性

三种内存类型:

        普通内存:ROM、FLASH、SRAM, CPU对普通内存的加载或存储的程序代码可优化

        外设内存:加载和存储严格次序进行

        强顺序内存:严格按照代码执行

三种内存类型对应的情景

Cache是高级缓存,它的速度和CPU主存的速度是一致的。SRAM的速度只有CPU主存的一半,通过Cache缓存做到无差别访问。

普通内存,ROM\SRAM\FLASH这些,从CPU主存读数据,放到高级缓存Cache里面,再经过Buffer缓冲(可选),最后读到内存

设备内存,从CPU读数据,经过缓冲Buffer,读到内存

强顺序内存,直接从CPU读

芯片的总线错综复杂, 每条总线上都有多个主机Master和从机Slave,且同一个Slave可以由多个Master进行访问。比如SRAM,CPU可以访问,DMA也可以访问。

假如现在CPU把数据存放到了Cache里面,但SRAM还没有同步,这时候DMA直接就把SRAM读出来了,就会出现数据不一致。因此出现了数据共享。但开启共享就意味着关闭Cache。开启共享会导致SRAM直接从主存读数据,性能变慢。

H7编程手册:不能访问属性的性能情况

C---Cache      B---Buffer      S---Share

Cache简介

Cache(高级缓存)是提升STM32性能的关键一步。

M7内核芯片做了一级Cache支持,Cache分为数据缓存D-Cache和指令缓存I-Cache

Cache支持4种基本操作:1,使能;2,禁止; 3,清空; 4,无效化

数据缓存D-Cache是解决CPU加速访问SRAM

这里主频480MHz是针对H7系列来讲的

 操作SRAM有三种方式,

  •         CPU直接读写SRAM、
  •         CPU操作Cache再读写SRAM、
  •         DMA读写SRAM

写操作:

CPU要写的SRAM区数据在Cache中已经开辟了对应的区域,这就叫写命中(Cache hit); 如果Cache里面没有开辟对应的区域怎么办,这就是所谓的写丢失(Cache Miss)

读操作:

CPU要读取的SRAM区数据在Cache中已经加载好,叫读命中(Cache hit);  如果Cache里面没有,这就是读丢失(Cache Miss)

保证cache有足够高的命中率,尽量少的cache miss,读/写速度会有比较大的提高。


读丢失Cache miss的两种处理情况

读命中Cache hit 时直接从cache中读出数据即可。

读丢失Cache miss时,有两种处理方式,

        一种是直接读 read through,略过Cache直接从内存SRAM读到CPU;

        另一种是分配读 read allocate,把数据从内存加载到Cache,再从Cache读取。

写命中Cache hit和写丢失Cache miss的两种处理情况

写命中 Cache hit 时有两种处理方式:

         一种是直接写 write through,直接写到内存SRAM并同时放到Cache 里;

        另一种是分配写 write back,数据写到Cache,只有被更改时才写到SRAM里。

 写丢失 Cache miss 时有两种处理方式:

         一种是分配写 write allocate,先把数据写到Cache,然后更新到SRAM

        另一种是不分配写 no write allocate,不经过Cache直接写到SRAM里。

数据不一致问题解决

1)设置共享属性

        Cache相当于没有开启,性能优势体现不出来

2)软件进行Cache维护

        调用Cache配置相关函数。

        Cache支持4种基本操作:1,使能;2,禁止; 3,清空; 4,无效化

        清空 Clean无效化 Invalidation 用于处理数据不一致情况

Clean 清空:Cache已变化,SRAM数据未更新。

DMA搬运数据前,将Cache相对应数据更新到SRAM。

Invalidate无效化:SRAM数据已变化,Cache未更新。

DMA搬运数据后,Cache数据无效,需从SRAM获取。

在操作数据前调用一下函数,做一下数据统一。 

ICache配置相关函数
DCache配置相关函数

MPU相关寄存器介绍

MPU相关寄存器

MPU类型寄存器  MPU_TYPE

MPU控制寄存器 MPU_CTRL

MPU区域编号寄存器 MPU_RNR

MPU基地址寄存器 MPU_RBAR

MPU区域属性和容量寄存器 MPU_RASR

 

TEX用来设置Cache策略

Non-cacheable

正常读写操作,无cache

Write through, read allocated , no write allocate

写操作命中,用到WT;不命中,用到NWA 读操作没有命中,用到RA

Write back, read allocated , no write allocate

写操作命中,用到WB;不命中,用到NWA 读操作没有命中,用到RA

Write back, read allocated , write allocate

写操作命中,用到WB;不命中,用到WA 读操作没有命中,用到RA

MPU相关HAL库驱动介绍

/*MPU HAL库相关结构体*/
typedef struct  { 
	uint8_t			Enable; 				/* 区域使能/禁止 */  MPU_RASR
	uint8_t			Number; 				/* 区域编号 */ 	    MPU_RBAR/RNR
	uint32_t		BaseAddress; 			/* 配置区域基地址 */ RBAR	
	uint8_t			Size; 				    /* 区域容量 */       RASR 下面都是
	uint8_t			SubRegionDisable; 		/* 子region失能位段设置 */ 	
	uint8_t			TypeExtField; 			/* 类型扩展级别*/ 
	uint8_t			AccessPermission; 		/* 设置访问权限 */ 
	uint8_t			DisableExec; 			/* 允许/禁止取指*/ 
	uint8_t			IsShareable; 			/* 禁止/允许共享 */
	uint8_t			IsCacheable; 			/* 禁止/允许缓存 */ 
	uint8_t			IsBufferable; 			/* 禁止/允许缓冲 */  
} MPU_Region_InitTypeDef;

void HAL_MPU_Enable (uint32_t MPU_Control);

设置MPU_CTRL寄存器:

        操作PRIVDEFENA位,该位为0,禁止背景区,访问任何未使能MPU区域均会造成内存异常MemFault ;该位为1,使能背景区,特权级下可以正常访问任何未使能MPU区域

        操作HFNMIENA位,该位为0,NMI不可屏蔽中断服务程序和硬件异常中断服务程序执行器件会强制关闭MPU ; 该位为1,会继续开启MPU

MPU基本配置步骤

1、禁止MPU                                                void HAL_MPU_Disable();

2、配置某个区域的MPU保护参数                通过调用HAL_MPU_ConfigRegion()函数去设置

3、使能MPU                                                void HAL_MPU_Enable();

4、编写MemManage中断服务函数             void MemManage_Handler(void);

编程实战

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

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

相关文章

【启明智显分享】个位数价格工业HMI芯片:720P@60fps,配备2D加速

我们生活在一个“屏”的时代,工业自动化、智能生活的实现都离不开屏幕的帮助,而对于消费者而言,最大的痛点就是显示屏的画质,一个优质的人机交互界面影响着用户体验,流畅清晰的图像呈现与屏幕的分辨率、刷新率都息息相…

Spring-Cloud-Gateway--源码分析及应用

文章目录 一、简介1.1 术语 1.3 特性1.4 Spring Cloud Gateway与Spring Cloud ZuulSpring Cloud ZuulWebflux模型 1.5 如何集成Gateway 二、工作原理2.2 Gateway类图 三、配置路由谓词工厂和网关过滤工厂3.1 两种不同的配置路由方式通过yml文件来配置通过Java Bean来配置 3.2 R…

vue生命周期及组件讲解(如何导入引用外部vue文件,以及注册全局变量,自定义标签效果)

生命周期钩子的理解与应用 函数说明onBeforeMount( )组件挂载前onMounted( )组件挂载后onBeforeUpdate( )组件更新前onUpdated( )组件中任意的DOM元素更新后onBeforeUnmount( )组件实例被销毁前onUnmounted( )组件实例被销毁后 生命周期在 各类应用以及网站中使用非常广泛&…

Running Gradle task ‘assembleDebug‘ Flutter项目

基于Android方面运行Flutter项目一直卡在 Launching lib\main.dart on Android SDK built for x86 in debug mode… Running Gradle task ‘assembleDebug’… 基础原因: 默认存放Gradle插件包的Maven仓库是国外(需VPN) 我的原因: 缺少JDK和缺少Androi…

Python 俄罗斯方块小游戏【含Python源码 MX_007期】

系统简介: 俄罗斯方块是一款经典的俄罗斯益智游戏,由苏联工程师阿列克谢帕基特诺夫(Alexey Pajitnov)于1984年创建。在游戏中,玩家需要操纵不同形状的方块,以水平移动和旋转的方式,使它们在屏幕…

【论文阅读】-- 时态合并树状图:时态标量数据的基于拓扑的静态可视化

时态合并树状图:时态标量数据的基于拓扑的静态可视化 摘要1 引言2 相关工作及背景介绍2.1 增广合并树2.2 (增强)合并树的可视化与跟踪2.3 特征跟踪2.4 数据线性化 3 时间合并树状图3.1 映射单个时间步长: R d → R R^d \rightarrow R Rd→R3.2 映射所有时…

Stable Diffusion: ControlNet 插件安装

前面介绍了一些通过代码实现ControlNet进行控制的案例。现在通过Stable Diffusion体验一下更便捷的操作。 Stable Diffusion插件安装办法大致相同。启动Stable Diffusion后,点击最右边的“扩展”,点击“可下载”,点击“加载扩展列表”。 视网…

开个技术外挂 | 数字孪生技术如何成为美洲杯帆船赛成功的关键?

若您对数据分析以及人工智能感兴趣,欢迎与我们一起站在全球视野关注人工智能的发展,与Forrester 、德勤、麦肯锡等全球知名企业共探AI如何加速工业变革,共享众多优秀行业案例,开启AI人工智能全球新视野!! …

【小白专用 已验证24.6.7】C# MySQL数据库访问操作封装类

一、底层库介绍 本文主要介绍数据库访问操作类,包含:SQL插入脚本、SQL查询脚本、数据库表是否存在判断、带参脚本执行、包含事务回滚脚本执行、存储过程脚本等等。 特殊说明 在使用之前,先安装 MySql.Data 插件 二、底层库源码 2.1 程序源…

如何合并pdf文件到一个pdf

在现代办公和学习中,PDF格式的文件因其跨平台兼容性和安全性得到了广泛应用。然而,有时我们需要将多个PDF文件合并成一个,以便于管理和分享。本文将详细介绍几种合并PDF的方法,帮助读者轻松完成PDF文件的合并工作。 首先通过浏览器…

JWT工具【工具类】

一、JWT JSON Web Token (JWT)是一个开放标准(RFC 7519),定义了一种紧凑且自包含的方式,以JSON对象的形式在各方之间安全地传输信息。这种信息可以被验证和信任,因为它是数字签名的。具体来说,JWT是一种用…

柏曼的台灯值得入手吗?书客、明基横向测评对比

据相关研究显示,我国青少年的近视问题尤为严峻,总体近视率已逼近53%,这一超过半数的数据令人触目惊心。随着孩子学龄的增长,学习负担不断加重,眼部的压力也随之剧增,从而导致近视率持续攀升。普通台灯可能发…

【方法】Word文档如何添加“打开密码”?

Word文档是很常用的办公文档,对于重要的文档,不想被他人随意查看,或者只有指定的人可以查看,我们可以给Word文档设置密码保护,这样只有知道密码的人才可以打开文档。 下面分享两种Word文档添加“打开密码”的方法&…

真的不再需要程序员了?

AI时代:程序员的终结还是新起点? ©作者|Ninja Geek 来源|神州问学 “基本上以后不会存在程序员这种职业了,所有人只要会说话,甚至连写字可能都不用,你就具备今天程序员所具备的能力,所以这个意义还是…

D咖饮品机入驻奇轩商贸,为DF101大规模入驻荆州拉开序幕

荆州,一座历史悠久的城市,如今正焕发着新的活力与魅力。而这股活力的源泉之一,正是奇轩商贸的一次创新尝试——D咖智能饮品机的入驻。这不仅仅是一次机器设备的更新,更是一场技术与美味的碰撞,为DF101大规模入驻荆州市…

8086汇编 add指令学习

ADD,是Intel x86平台的汇编加法指令,MEM代指操作数为内存或寄存器,REG代指操作数为寄存器,IMM代指立即数,SEG代指操作数为段寄存器。 形式和示例如下; ADD MEM8,REG8 ADD DS:[BXSI],AL ADD MEM16,R…

App推广效果分析,Xinstall助力精准优化

App推广效果分析:Xinstall助力精准优化 在App推广的激烈竞争中,如何确保每一次推广活动都能带来最佳效果,是每个运营者都关心的问题。Xinstall作为一款专业的App推广工具,不仅提供了全方位的推广支持,还能通过精准的数…

学会python——密码校验(python实例三)

目录 1、认识Python 2、环境与工具 2.1 python环境 2.2 pycharm编译 3、纠正密码输入的格式问题 3.1 代码构思 3.2 代码示例 3.3 运行结果 4、总结 1、认识Python Python 是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言。 Python 的设计具有很强的可…

鸿蒙轻内核A核源码分析系列七 进程管理 (2)

本文先熟悉下进程管理的文件kernel\base\core\los_process.c中的内部接口,读读代码,做些记录。 1、LiteOS-A内核进程全局变量 ⑴是进程池,存放各个进程控制块LosProcessCB的信息。⑵处开始的g_freeProcess是空闲进程链表,挂载各…

美业门店管理系统Java源码分享-【库存管理】的功能和作用

美业收银系统在美容行业中的作用和重要性体现在提高管理效率、提升客户满意度、降低成本、促进业务增长等方面。它为连锁美业提供了一个全面的管理工具,能够更好地应对市场挑战,提升竞争力。 美业系统中的【库存管理】在整个美容行业中起着非常重要的作…