0

メモリ領域を書き込みから保護したい。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() を呼び出す代わりに、正常に書き込みます。

4

1 に答える 1

0

これは私にはうまく見えます。ハードウェアに MPU があることを確認します。MPU には MPU_TYPE Register というレジスタがあります。これは、MPU があるかどうかを示す読み取り専用レジスタです。MPU_TYPE レジスタのビット 15:8 が 0 の場合、MPU はありません。

また、レジスタを扱うときは数字を使用しないでください。これにより、あなたや他の人があなたのコードを読むのが本当に難しくなります. 代わりに、多数のビット マスクを定義します。その方法については、チュートリアルを参照してください。

于 2017-11-19T11:57:12.990 に答える