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

2024-06-13 19:28
文章标签 实验 hal mpu 内存保护

本文主要是介绍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);

编程实战

这篇关于HAL库--内存保护(MPU)实验的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1058204

相关文章

STM32(十一):ADC数模转换器实验

AD单通道: 1.RCC开启GPIO和ADC时钟。配置ADCCLK分频器。 2.配置GPIO,把GPIO配置成模拟输入的模式。 3.配置多路开关,把左面通道接入到右面规则组列表里。 4.配置ADC转换器, 包括AD转换器和AD数据寄存器。单次转换,连续转换;扫描、非扫描;有几个通道,触发源是什么,数据对齐是左对齐还是右对齐。 5.ADC_CMD 开启ADC。 void RCC_AD

HNU-2023电路与电子学-实验3

写在前面: 一、实验目的 1.了解简易模型机的内部结构和工作原理。 2.分析模型机的功能,设计 8 重 3-1 多路复用器。 3.分析模型机的功能,设计 8 重 2-1 多路复用器。 4.分析模型机的工作原理,设计模型机控制信号产生逻辑。 二、实验内容 1.用 VERILOG 语言设计模型机的 8 重 3-1 多路复用器; 2.用 VERILOG 语言设计模型机的 8 重 2-1 多

STM32CubeMX和HAL库-新建项目

目录 新建项目 选择开发板  MCU图形化配置界面总览 MCU配置 新建项目 新建项目包含选择MCU创建项目、选择开发板新建项目和交叉选择MCU新建项目三部分。 1. 选择MCU创建项目 单击主菜单项File→New Project,或Home视图上的ACCESS TO MCU SELECTOR 按钮,都可以打开的New Project from a MCU/MPU对话框。

STM32 HAL CAN通讯 实操

1、简介 相比于串口通讯,对于刚接触CAN通讯的小白来说,CAN通讯相对复杂,看各种视频、帖子理论,总是一知半解。本次通过傻瓜式操作,先实现CAN通讯的交互,以提高小白的信心,也便于自己复习观看。本次以STM32CubeMX进行初始化配置,通过Keil 5软件进行软件设计,通过CAN盒实现进行数据的交互。该流程实际以STM32F0、F1、F3、F4、F7实测好用(理论上都适用),这三种型号单片机

我在高职教STM32——准备HAL库工程模板(1)

新学期开学在即,又要给学生上 STM32 嵌入式课程了。这课上了多年了,一直用的都是标准库来开发,已经驾轻就熟了。人就是这样,有了自己熟悉的舒适圈,就很难做出改变,老师上课也是如此,排斥新课和不熟悉的内容。显然,STM32 的开发,HAL 库已是主流,自己其实也在使用,只不过更换库就意味着教学内容有很大变化,自己也就迟迟没有迈出调整这一步。现在,是时候做出变化了,笔者计划保持教学项

61.以太网数据回环实验(4)以太网数据收发器发送模块

(1)状态转移图: (2)IP数据包格式: (3)UDP数据包格式: (4)以太网发送模块代码: module udp_tx(input wire gmii_txc ,input wire reset_n ,input wire tx_start_en , //以太网开始发送信

LTspice模拟CCM和DCM模式的BUCK电路实验及参数计算

关于BUCK电路的原理可以参考硬件工程师炼成之路写的《 手撕Buck!Buck公式推导过程》.实验内容是将12V~5V的Buck电路仿真,要求纹波电压小于15mv. CCM和DCM的区别: CCM:在一个开关周期内,电感电流从不会到0. DCM:在开关周期内,电感电流总会到0. CCM模式Buck电路仿真: 在用LTspice模拟CCM电路时,MOS管驱动信号频率为100Khz,负载为10R(可自

HCIA--实验十:路由的递归特性

递归路由的理解 一、实验内容 1.需求/要求: 使用4台路由器,在AR1和AR4上分别配置一个LOOPBACK接口,根据路由的递归特性,写一系列的静态路由实现让1.1.1.1和4.4.4.4的双向通信。 二、实验过程 1.拓扑图: 2.步骤: (下列命令行可以直接复制在ensp) 1.如拓扑图所示,配置各路由器的基本信息: 各接口的ip地址及子网掩码,给AR1和AR4分别配置

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

pta-2024年秋面向对象程序设计实验一-java

文章申明:作者也为初学者,解答仅供参考,不一定是最优解; 一:7-1 sdut-sel-2 汽车超速罚款(选择结构) 答案: import java.util.Scanner;         public class Main { public static void main(String[] arg){         Scanner sc=new Scanner(System