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

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_RASRuint8_t			Number; 				/* 区域编号 */ 	    MPU_RBAR/RNRuint32_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.mzph.cn/diannao/26904.shtml

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

相关文章

STL入门指南:从容器到算法的完美结合

目录 ​编辑 一、什么是STL 二、STL的版本 三、STL的六大组件 1. 容器(Containers): 2. 算法(Algorithms): 3. 迭代器(Iterators): 4. 仿函数(Functo…

安鸾学院靶场——安全基础

文章目录 1、Burp抓包2、指纹识别3、压缩包解密4、Nginx整数溢出漏洞5、PHP代码基础6、linux基础命令7、Mysql数据库基础8、目录扫描9、端口扫描10、docker容器基础11、文件类型 1、Burp抓包 抓取http://47.100.220.113:8007/的返回包,可以拿到包含flag的txt文件。…

天降流量于雀巢?元老品牌如何创新营销策略焕新生

大家最近有看到“南京阿姨手冲咖啡”的视频吗?三条雀巢速溶咖啡入杯,当面加水手冲,十元一份售出,如此朴实的售卖方式迅速在网络上走红。而面对这一波天降的热度,雀巢咖啡迅速做出了回应,品牌组特地去到了阿…

计算机SCI期刊,中科院3区,IF=5.6,审稿速度非常快

一、期刊名称 International Journal of Machine Learning and Cybernetics 二、期刊简介概况 期刊类型:SCI 学科领域:计算机科学 影响因子:5.6 中科院分区:3区 三、期刊征稿范围 控制论关注的是描述我们日常生活中无处不在…

迅狐跨境商城系统|全平台兼容|前端采用uni-app跨端框架,后端采用ThinkPHP5框架

高效实现全平台兼容的迅狐跨境商城系统 迅狐跨境商城系统是一款专为跨境电商企业设计的全平台兼容系统。其前端采用uni-app跨端框架,后端采用ThinkPHP5框架,旨在实现高效的开发和运营管理。 1. 全平台兼容的前端设计 迅狐跨境商城系统的前端采用uni-a…

STM32开发过程中碰到的问题总结 - 1

文章目录 前言1. 怎么生成keil下可以使用的文件和gcc下编译使用的makefile2. STM32的时钟树3.怎么查看keil5下的编译工具链用的是哪个4. Arm编译工具链和GCC编译工具链有什么区别吗?5. 怎么查看Linux虚拟机是x86的还是aarch646. 怎么下载gcc-arm的编译工具链7.怎么修…

PlugLink:让数据分析与工作流无缝连接(附源码)

PlugLink:让数据分析与工作流无缝连接 引言 数据分析和自动化工作流已成为各个企业和个人提高效率的关键手段。今天,我要介绍一款名为PlugLink的工具,它不仅能帮助你轻松进行数据分析,还能将这些分析结果无缝连接到你的工作流中&…

基于 Python 解析 XML 文件并将数据存储到 MongoDB 数据库

1. 问题背景 在软件开发中,我们经常需要处理各种格式的数据。XML 是一种常用的数据交换格式,它可以存储和传输结构化数据。很多网站会提供 XML 格式的数据接口,以便其他系统可以方便地获取数据。 我们有这样一个需求:我们需要从…

Vue30-自定义指令:对象式

一、需求:创建fbind指定 要用js代码实现自动获取焦点的功能! 二、实现 2-1、步骤一:绑定元素 2-2、步骤二:input元素获取焦点 此时,页面初始化的时候,input元素并没有获取焦点,点击按钮&…

NestJS学习笔记

一、安装NestJS CLI工具 环境检查 //查看node版本 node -v//查看npm版本 npm -v 安装nest/cli 使用npm全局安装nestjs/cli npm i -g nestjs/cli 查看nest版本 nest -v 结果如图: 创建nest项目 //命令行创建nest项目 nest new 【项目名】 VScode扩展下载 1、…

远程登录新建会话

在做远程登录会话建立的时候有时候会忘记顺便就记录了,方便后期回顾

没有登录微信就不会截图了?这个方法你一定要学会

前言 前段时间小白在指导小伙伴的时候,发现他在电脑没有登录微信的时候就不会截图了。 这个可就难倒他了…… 所以他登录了个微信,然后截了张图,接着把微信退出了。这人可真是谨慎啊~ 所以,小伙伴在使用电脑的时候…

JWT工具【工具类】

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

科技赋能,避震婴儿车或成为行业硬通货

全球知识经济发展发展到今天,消费者对于品质、服务、体验的要求越来越高,与之对应的产品也就越来越科技化、智能化、个性化,品牌化和差异化逐步成为产品的竞争核心。 婴儿推车作为关系婴幼儿出行安全的支柱性产业之一,从车架结构…

graalvm编译springboot3 native应用

云原生时代容器先行,为了更好的拥抱云原生,spring boot3之后,推出了graalvm编译boot项目,利用jvm的AOT( Ahead Of Time )运行前编译技术,可以将javay源码直接构建成机器码二进制的文件&#xff…

泰坦尼克号数据集机器学习实战教程

泰坦尼克号数据集是一个公开可获取的数据集,源自1912年沉没的RMS泰坦尼克号事件。这个数据集被广泛用于教育和研究,特别是作为机器学习和数据分析的经典案例。数据集记录了船上乘客的一些信息,以及他们是否在灾难中幸存下来。以下是数据集中主…

嵌入式实训day3

1、 planet_list["水星","金星","火星","木星"] print(planet_list)planet_list.insert(2,"地球") print(planet_list)planet_list.append("土星") planet_list.append("天王星") planet_list.append(&…

MultiTrust:首个综合统一的多模态信任度基准(上)

随着我们迈向人工通用智能(AGI)的时代,出现了开创性的大语言模型(LLMs)。凭借它们强大的语言理解和推理能力,已经无缝地将其他模态(例如视觉)整合到LLMs中,以理解不同的输…

SSRF学习,刷题

[HNCTF 2022 WEEK2]ez_ssrf 给了一个Apache2的界面,翻译一下 就是一个默认的界面,目录扫描 可以看到flag.php,肯定是不能直接访问得到的,还有index.php,访问这个 可以看到三个参数data,host,port 还有fsockopen() 函数是 PHP 中用于打开一个…

排名前五的 Android 数据恢复软件

正在寻找数据恢复软件来从 Android 设备恢复数据?本指南将为您提供 5 款最佳 Android 数据恢复软件。浏览这些软件,然后选择您喜欢的一款来恢复 Android 数据。 ndroid 设备上的数据丢失可能是一种令人沮丧的经历,无论是由于意外删除、系统崩…