Как настроить регистры MPU в cortex m4?

Я хочу добавить защиту на область памяти, начиная с 0x20000000. Размер области 64 байта. Разрешение только на чтение, флаг не установлен, кроме xn. Вот как я думаю, это должно быть,

#define MPU_CTRL         (*((volatile unsigned long*) 0xE000ED94))    // MPU Control register
#define MPU_RNR          (*((volatile unsigned long*) 0xE000ED98))    // MPU Region Number register
#define MPU_RBAR         (*((volatile unsigned long*) 0xE000ED9C))    // MPU Region Base Address Register
#define MPU_RASR         (*((volatile unsigned long*) 0xE000EDA0))    // MPU Region attributes and size register

void Registers_Init(void)
{       
    //MPU Configuring
    MPU_RNR = 0x00000000;                       // use region 0
    MPU_RBAR = 0x20000000;                      // base address is 0x20000000
    MPU_RASR = 0x1608FF0B;                      // enable bit=1, 64 bytes,not subregions, s=c=b=0, xn=1, permission= ro/ro.
    MPU_CTRL = 0x00000005;                      // enable memory protection unit,guaranteeing default priviliged access
}

int main()
{
    Registers_Init();
    return 0;
}

Это верно? Я делаю это неправильно? Пожалуйста, направляйте.


person Muzahir Hussain    schedule 12.11.2017    source источник
comment
При работе с регистрами никогда не используйте магические числа. Никто, включая вас самих, понятия не имеет, что означает это число. Вы заставляете людей, читающих ваш код, 1) преобразовывать шестнадцатеричный код в двоичный в своей голове, чтобы выяснить, какие биты установлены, и 2) постоянно сидеть с открытым руководством. Вместо этого определите несколько битовых масок. Правильный код C будет выглядеть как MPU_XYZ = MPU_THIS | MPU_THAT;, где MPU_THIS и т. д. — это битовая маска.   -  person Lundin    schedule 14.11.2017


Ответы (1)


Да, это выглядит правильно для настройки региона. Однако вы отключили все субрегионы, что означает, что у вас не будет доступа к этому блоку памяти. Биты отключения субрегиона должны быть равны 0 (включено). Вы также установили привилегированные и непривилегированные только для чтения.

Вам не нужно использовать регистр RNR, поскольку вместо этого вы можете использовать поля VALID и REGION в регистре RBAR.

Если в какой-то момент вы перейдете в непривилегированный режим, у вас не будет никакого доступа к вашему коду или памяти данных (кроме того, что определено в регионе), поэтому вы получите ошибку MPU. Я бы предложил добавить обработчик ошибок MPU, если вы еще этого не сделали, и, возможно, определить регион только для чтения, чтобы разрешить доступ ко всей флэш-памяти (хотя у вас уже есть привилегированный доступ через фоновый регион).

person Realtime Rik    schedule 14.11.2017