2017-11-12 29 views
2

0x20000000부터 시작하여 메모리 영역에 보호 기능을 추가하고 싶습니다. 영역의 크기는 64 바이트입니다. 사용 권한은 읽기 전용이며 xn을 제외한 플래그는 설정되지 않습니다. 어떻게 생각해야합니까?cortex m4에서 MPU 레지스터를 어떻게 구성합니까?

#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; 
} 

이 내용이 정확합니까? 내가 잘못하고 있니? 안내해주십시오.

+2

레지스터를 다룰 때는 절대로 "마법 번호"를 사용하지 마십시오. 자신을 포함하여 아무도 그 번호가 의미하는 바를 모릅니다. 당신은 당신의 코드를 읽는 사람들에게 1) 16 진수를 2 진수로 바꿔서 비트를 설정하고 2) 매뉴얼을 항상 열어 놓도록 강요하십시오. 대신, 비트 마스크의 수를 정의하십시오. 올바른 C 코드는'MPU_XYZ = MPU_THIS | MPU_THAT;''MPU_THIS' 등은 비트 마스크입니다. – Lundin

답변

1

예 지역을 구성하려면 올바르게 표시됩니다. 그러나 모든 하위 영역을 사용 중지 했으므로이 메모리 블록에 액세스 할 수 없습니다. 하위 영역 비활성화 비트는 0 (활성화)이어야합니다. 또한 권한이 있고 권한이없는 읽기 전용을 설정했습니다.

RBAR 레지스터의 유효성 및 지역 필드를 대신 사용할 수 있으므로 RNR 레지스터를 사용할 필요가 없습니다.

비 특권 모드로 변경하면 코드 또는 데이터 메모리 (해당 지역에 정의 된 것 이외의)에 대한 액세스 권한이 없으므로 MPU 오류가 발생합니다. 아직 MPU 오류 처리기를 추가하는 것이 좋습니다 (이미 배경 영역을 통해 권한있는 액세스 권한이 있지만 모든 플래시에 대한 액세스를 허용하는 읽기 전용 영역을 정의하지 않은 경우).