簡體   English   中英

MPU 未觸發 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM