MPU主要解决了软件的隔离问题,防止不同任务或错误的代码访问或破坏关键数据区。特别是在多任务操作系统中,MPU通过定义不同的内存区域,为每个任务分配独立的内存区域,确保了操作系统的核心安全和数据的完整性。
MPU支持分成8个region,每个region又可以分成更小的子region,但是子reigion最少需要256字节的空间。我们通过内存分区,对每一个内存块赋予不同的权限来保护数据。当然手册中指出
也就是我们的中断和系统控制的内存是可以不受权限限制进行访问的
配置过程其实相当简单:只有配置相关寄存器以及使能。下面是一个小例子
LDR R0, =0xE000ED98 ; Region号寄存器
MOV R1, #0 ; 选择region 0
STR R1, [R0]
LDR R1, =0x00000000 ; 基址 = 0x00000000
STR R1, [R0, #4] ; MPU Region 基址寄存器
LDR R1, =0x0307002F ; R/W, TEX=0, S=1, C=1, B=1, 16MB, Enable=1
STR R1, [R0, #8] ; MPU Region 属性及容量寄存器
其中地址为0xE000ED98的是MPU的region寄存器(MPURNR),用于选定是哪一个region
R0+4的是基址寄存器,确定了这一块region的起始地址
R0+8则是真正意义上对region的属性进行配置,由于英文手册的配置过于琐碎杂乱,故展示中文手册的配置表
MOV R1, #1 ; 准备使能MPU
STR R1, [R0,#-4] ; 使能MPU(0xE000ED98-4=0xE000ED94)
最后置1使能MPU即可。这样我们就配置了一段0x0000 0000-0x00FF FFFF(16MB) 、全访问、可缓存的内存。当然如何配置以及配置多少还是要看项目实际需求