【简介】
在之前的帖子中介绍了S32K3 的MPU默认配置属性(【S32K3XX】Memory 访问默认权限配置 ),在此基础上我们继续验证MPU 保护的功能,我们可以编写代码触发MPU 属性异常来验证MPU 保护功能。
【XN】权限异常验证
本地的MPU配置DPLASH 是XN = [y] 不具备代码执行的权限

本地编写如下代码触发DFLASH 上取指令操作触发MPU异常。
static int mpu_no_xn(void) {
int r;
int (*pF)(void);
pF = (int(*)(void))0x10000000;
r = pF();
005056F4 B508 PUSH {R3, LR}
005056F6 F04F 5380 MOV.W R3, #0x10000000
005056FA 4798 BLX R3
return r;
}上述代码执行后会进入hard fault 异常,异常地址显示为在0x10000000 跟本地触发异常的地址吻合。
查看异常状态寄存器可知发生可Memory Manage 的错误,取指令出发了Memory 访问异常。

对应错误异常状态寄存器说明如下

因为本地没有使能Memory Management Fault 的异常所以会上报成Hard fault,违反MPU设定的存储器访问规则 会触发Memory Management Fault 异常,本地添加以下代码使能Memory Management Fault。
本地添加以下代码使能MM Fault
void enable_mmfault(void)
{
/* Enable MemManage Fault */
SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;
}开启上述代码后,触发MPU的异常访问会进入到memory manager 的异常中。

【写权限异常验证】
本地的Pflash MPU 默认属性为read only 属性

本地添加如下代码触发Pflash 写入操作触发MPU异常。
static void mpu_no_write(void) {
volatile uint32_t *p = (uint32_t *)0x500000;
*p = 0x12345678;
}
上述代码运行后会触发MM fault,并从MM fault的异常寄存器地址查看到触发异常访问的地址。

我要赚赏金
