2

我想使用 Cortex-M3 MPU 来保护内存免受意外访问。为此,我配置了 MPU。但我根本没有任何例外。BusFault、HardFault 等其他异常已被强制使用适当的“坏代码”。

当前的初始化是

MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk;       // disable MPU

MPU->RNR  = 0
MPU->RBAR = 0x20000000;
MPU->RASR = 0x03000019; // 0x03UL << (MPU_RASR_ATTRS_Pos+8) | (0x19UL << 0);

MPU->RNR  = 1;
MPU->RBAR = 0x8000000;  // read back as 0x8000001
MPU->RASR = 0x03000027; // 0x03UL << (MPU_RASR_ATTRS_Pos+8) | (0x27UL << 0); 

MPU->RNR  = 2;
MPU->RBAR = 0x40000000; // read back as 0x40000002
MPU->RASR = 0x13000039; // 0x13UL << (MPU_RASR_ATTRS_Pos+8) | (0x39UL << 0); 

SCB->SHCSR |= SCB_SHCSR_MEMFAULTENA_Msk;  // Enable the memory fault exception

MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk;   // Enable MPU

到目前为止,我可以访问所有内存。现在我添加一个区域来保护一个区域。

MPU->CTRL &= ~MPU_CTRL_ENABLE_Msk; // disable MPU

MPU->RNR = 3;
MPU->RBAR = 0x20002000;  // read back as 0x20002003
MPU->RASR = 0x00000009;  // 0x00UL << (MPU_RASR_ATTRS_Pos+8) | (0x09UL << 0);

MPU->CTRL |= MPU_CTRL_PRIVDEFENA_Msk | MPU_CTRL_ENABLE_Msk; // re-enable MPU

区域号 3 应隐藏所有其他 MPU 区域。现在 0x20002000 处的内存不应该是不可访问的,既不可读也不可写。但是我仍然可以在这个地址读取甚至写入内存。

什么会抑制 NXP LPC1788 CPU 中的内存保护?

4

0 回答 0