![](/img/trans.png)
[英]LDMIA instruction not working correctly on external SRAM in cortex M4
[英]MPU not triggering faults in cortex M4
我想保護內存區域不被寫入。 我已經配置了 MPU,但它沒有產生任何故障。 我要保護的區域的基地址是 0x20000000。 區域大小為 64 字節。
這是一個演示該問題的編譯代碼。
#define MPU_CTRL (*((volatile unsigned long*) 0xE000ED94))
#define MPU_RNR (*((volatile unsigned long*) 0xE000ED98))
#define MPU_RBAR (*((volatile unsigned long*) 0xE000ED9C))
#define MPU_RASR (*((volatile unsigned long*) 0xE000EDA0))
#define SCB_SHCSR (*((volatile unsigned long*) 0xE000ED24))
void Registers_Init(void)
{
MPU_RNR = 0x00000000; // using region 0
MPU_RBAR = 0x20000000; // base address is 0x20000000
MPU_RASR = 0x0700110B; // Size is 64 bytes, no sub-regions, permission=7(ro,ro), s=b=c= 0, tex=0
MPU_CTRL = 0x00000001; // enable MPU
SCB_SHCSR = 0x00010000; // enable MemManage Fault
}
void MemManage_Handler(void)
{
__asm(
"MOV R4, 0x77777777\n\t"
"MOV R5, 0x77777777\n\t"
);
}
int main(void)
{
Registers_Init();
__asm(
"LDR R0, =0x20000000\n\t"
"MOV R1, 0x77777777\n\t"
"STR R1, [R0,#0]"
);
return (1);
}
void SystemInit(void)
{
}
因此,在主函數中,我在受限區域(即 0x20000000)寫入,但 MPU 沒有產生任何故障,而是調用 MemManage_Handler(),它寫入成功。
這對我來說看起來不錯。 確保您的硬件具有 MPU。 MPU 有一個稱為 MPU_TYPE 寄存器的寄存器。 這是一個只讀寄存器,告訴您是否有 MPU。 如果 MPU_TYPE 寄存器中的位 15:8 讀為 0,則沒有 MPU。
在處理寄存器時永遠不要使用數字。 這使您和其他人很難閱讀您的代碼。 相反,定義一些位掩碼。 請參閱有關如何執行此操作的教程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.