MPU не вызывает сбоев в коре головного мозга 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 () он пишет успешно.


person Hassaan Ahmad    schedule 10.11.2017    source источник


Ответы (1)


Мне это нравится. Убедитесь, что в вашем оборудовании есть MPU. MPU имеет регистр, называемый регистром MPU_TYPE. Это регистр только для чтения, который сообщает вам, есть ли у вас MPU или нет. Если биты 15: 8 в регистре MPU_TYPE читают 0, MPU нет.

И никогда не используйте числа при работе с регистрами. Это затрудняет чтение вашего кода вам и другим людям. Вместо этого определите несколько битовых масок. См. Руководства о том, как это сделать.

person Muzahir Hussain    schedule 19.11.2017
comment
Да вы правы, MPU нет. Регистр MPU_TYPE содержит все нули. Благодарить!!! - person Hassaan Ahmad; 19.11.2017