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_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);

编程实战

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++ | Leetcode C++题解之第149题直线上最多的点数

题目&#xff1a; 题解&#xff1a; class Solution { public:int gcd(int a, int b) {return b ? gcd(b, a % b) : a;}int maxPoints(vector<vector<int>>& points) {int n points.size();if (n < 2) {return n;}int ret 0;for (int i 0; i < n; i…

阿里云运维第一步(监控):开箱即用的监控

作者&#xff1a;仲阳 这是云的时代&#xff0c;现在云计算已经在各行各业广泛的应用。但是上云对于大多数客户来说&#xff0c;依然有很大的学习成本&#xff0c;如下图仅是阿里云都有几百款产品&#xff0c;怎么选择&#xff1f;怎么用&#xff1f;对于客户来说都是问题。“…

高温车间降温通风方案

高温车间降温&#xff0c;解决厂房高温闷热必须做到以下两点才能实现&#xff0c;否则即使安装中央空调也没用&#xff1a;一、解决厂房内部热量 通过通排风负压风机、环保空调、工业大风扇等常用排热降温设备&#xff0c;降低室内温度&#xff1b;二、屏蔽外部太阳热源 …

5.0 Python 函数简介

1.函数 1.1 基本定义 定义: 将一组语句的集合通过函数进行封装, 简单来说是具有一定功能的代码容器, 想要执行这些语句, 只需要调用函数的名称即可. 特性: * 1. 可重复使用, 减少代码冗余. * 2. 组织结构清晰, 可读性增强. * 3. 可扩展性提高, 便于维护. 1.2 使用规则 函…

OpenCV学习(4.13) 霍夫变换

1.霍夫变换 霍夫变换&#xff08;Hough Transform&#xff09;是图像处理中的一种技术&#xff0c;主要用于检测图像中的直线、圆或其他形状。它通过将图像空间中的点映射到参数空间来实现&#xff0c;这样&#xff0c;图像空间中在同一直线上的点在参数空间中会形成一条曲线&…

CentOS系统自带Python2无法使用pip命令

Linux运维工具-ywtool 目录 一. 系统环境二.解决三.验证四.备注(1)输入"yum install -y python-pip",提示没有可用 python-pip包(2)安装完pip后进行升级 一. 系统环境 centos7系统自带的python2.7无法使用pip命令 二.解决 yum install python-pip -y三.验证 pip…

用PlayCanvas打造一个3D模型

本文由ScriptEcho平台提供技术支持 项目地址&#xff1a;传送门 基于 PlayCanvas 的 3D 物理场景开发 应用场景介绍 PlayCanvas 是一款功能强大的 3D 引擎&#xff0c;可用于创建各种类型的 3D 体验&#xff0c;包括游戏、模拟和交互式可视化。本技术博客将介绍如何使用 Pl…

【ARM Cache 及 MMU 系列文章 6.2 -- ARMv8/v9 如何读取 Cache 内部数据并对其进行解析?】

请阅读【ARM Cache 及 MMU/MPU 系列文章专栏导读】 及【嵌入式开发学习必备专栏】 文章目录 Direct access to internal memoryL1 cache encodingsL1 Cache Data 寄存器Cache 数据读取代码实现测试结果Direct access to internal memory 在ARMv8架构中,缓存(Cache)是用来加…

企业中的绩效管理

背景 企业中为何需要绩效管理&#xff0c;企业绩效管理为何比较难&#xff0c;这在企业管理中是非常难&#xff0c;同样也是非常有价值的命题&#xff0c;那么首先应该对这个命题有清晰的认知&#xff0c;特别是要想明白为何企业需要绩效管理&#xff0c;应该先明白企业。 企…

2024 年 19 种最佳大型语言模型

大型语言模型是 2023 年生成式人工智能热潮背后的推动力。然而&#xff0c;它们已经存在了一段时间了。 LLM是黑盒 AI 系统&#xff0c;它使用深度学习对超大数据集进行处理&#xff0c;以理解和生成新文本。现代 LLM 开始成型于 2014 年&#xff0c;当时一篇题为“通过联合学…

妙用OSGraph:发掘GitHub知识图谱上的开源故事

作者&#xff1a;范志东 1. 何为OSGraph&#xff1f; OSGraph (Open Source Graph) 是一个开源图谱关系洞察工具&#xff0c;基于GitHub开源数据全域图谱&#xff0c;实现开发者行为、项目社区生态的分析洞察。可以为开发者、项目Owner、开源布道师、社区运营等提供简洁直观的…

手机如何扫描拍照?方法分享

手机如何扫描拍照&#xff1f;在数字化时代&#xff0c;手机扫描拍照软件已经成为我们日常生活和工作中不可或缺的工具。无论是快速识别纸质文档&#xff0c;还是将照片中的文字转化为可编辑的文本&#xff0c;这些软件都为我们提供了极大的便利。然而&#xff0c;市面上的手机…

msvcp110.dll有什么解决方案,msvcp110.dll几种方法详细步骤教程

本文旨在探讨如何应对电脑出现 vcruntime140_1.dll 无法继续执行代码错误提示的问题。同时&#xff0c;将阐释该文件的作用&#xff0c;列举常见的错误问题&#xff0c;并提供一些在修复 vcruntime140_1.dll 时的注意事项&#xff0c;以避免在解决过程中引发其他问题。接下来&a…

【网络安全】【深度学习】【入侵检测】SDN模拟网络入侵攻击并检测,实时检测,深度学习【一】

文章目录 1. 前言2. Mininet 和 Ryu 的区别2.1 Mininet2.2 Ryu2.3 总结 3. 模拟攻击3.1 环境准备3.2 创建 Mininet 网络拓扑3.2 启动 Ryu 控制器3.3 模拟网络攻击3.4 捕获流量 4. 实时异常检测4.1 在 Ryu 控制器中4.2 在 h2 机器上的实验结果4.3 深度学习模型部署上h2机器 帮助…

如何获知lib cell的用途

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 除了databook可以查询cell的用途外&#xff0c;还可以通过在pr工具中获取lib cell属性的方法知晓其用途。 ICC2: report_attribute -app -class lib_cell SDFFXXX 通过看is_…

【大数据】计算引擎:Spark核心概念

目录 前言 1.什么是Spark 2.核心概念 2.1.Spark如何拉高计算性能 2.2.RDD 2.3.Stage 3.运行流程 前言 本文是作者大数据系列中的一文&#xff0c;专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12631789.html?spm1001.2014.3001.5482 该系列会成体…

【递归、搜索与回溯】综合练习一

综合练习一 1.找出所有子集的异或总和再求和2.全排列 II3.电话号码的字母组合4.括号生成 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.找…

2024年【四川省安全员C证】免费试题及四川省安全员C证考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 四川省安全员C证免费试题是安全生产模拟考试一点通总题库中生成的一套四川省安全员C证考试技巧&#xff0c;安全生产模拟考试一点通上四川省安全员C证作业手机同步练习。2024年【四川省安全员C证】免费试题及四川省安…

linux搭建sftp服务

1. 添加用户及用户组 使用 groupadd sftpgroup 添加sftpgroup 用户组&#xff1b; 使用useradd -G sftpgroup -s /sbin/nologin cmssftp给sftpgroup 添加cmssftp用户&#xff1b; 使用passwd cmssftp给用户cmssftp进行设置密码(默认为:654321)。具体如下图所示&#xff1a; 2.…

云原生Kubernetes系列项目实战-k8s集群+高可用负载均衡层+防火墙

一、Kubernetes 区域可采用 Kubeadm 方式进行安装&#xff1a; 名称主机部署服务master192.168.91.10docker、kubeadm、kubelet、kubectl、flannelnode01192.168.91.11docker、kubeadm、kubelet、kubectl、flannelnode02192.168.91.20docker、kubeadm、kubelet、kubectl、flan…