Memory Protection Unit

Dependencies:   mbed

この行を変えて色々試してみてください。

    mpu_config(リージョン番号, 先頭アドレス, サイズ, 読出許可, 書込許可, 実行許可, サブリージョン);
  • リージョン番号:0~7
  • 先頭アドレス:サイズ単位でアラインしておくこと
  • サイズ:32以上、2の累乗数単位
  • サブリージョン:リージョンを8分割したものを8bitで指定、ビットが立ってるサブリージョンは無視される(サイズ128以下では0固定)

main.cpp

Committer:
okini3939
Date:
2014-10-02
Revision:
0:b77812004bbd

File content as of revision 0:b77812004bbd:

/*
 * MPU (Memory Protection Unit)
 *
 * Reference:
 *   http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0337gj/BIHHGADD.html
 *   http://www.phoenix-c.or.jp/~olfa/lpcxpresso/27_mpu.html
 */

#include "mbed.h"

DigitalOut myled(LED1);
Serial pc(USBTX, USBRX);

int mpu_config (int region, void *addr, int size, bool readable, bool writable, bool executable, int sub) {
    int a, s, ap, xn;

    for (s = 4; s < 0x20; s ++) {
        if (size == (1<<(s + 1))) break;
    }
    if (s == 0x20) error("Invalid size");

    a = (int)addr & (0xffffffff<<(s + 1));
    if (a != (int)addr) error("Invalid addr");

    if (size <= 128) {
        sub = 0;
    }

    ap = 0;
    if (readable) {
        ap = writable ? 0x03 : 0x07;
    }
    xn = executable ? 0 : 1;

    MPU->CTRL = (1<<2)|(1<<0);
    MPU->RBAR = a|(1<<4)|(region & 0x0f);
    MPU->RASR = (xn<<28)|(ap<<24)|(0x1<<19)|((sub & 0xff)<<8)|(s<<1)|(1<<0);
    return 0;
}


extern "C" {
void HardFault_Handler () {
    error(" *** HardFault\r\n");
}
void MemManage_Handler () {
    error(" *** MemManage\r\n");
}
}

int main() {
    char *buf1 = (char*)0x2007c000;
    char *buf2 = (char*)0x20080000;
    int i;
    volatile int c;

    pc.baud(115200);
    pc.printf("--- mem test\r\n");

    if (mpu_config(0, buf1, 0x4000, true, false, false, 0x01)) return -1;
    if (mpu_config(1, buf2, 0x4000, false, false, false, 0x03)) return -1;
    SCB->SHCSR |= (1<<16); // Enable Memory Management Fault

    pc.printf("\r\nwrite 1\r\n");
    for (i = 0; i < 0x4000; i += 1024) {
        pc.printf(" %d", i);
        c = buf1[i];
    }

    pc.printf("\r\nread 1\r\n");
    for (i = 0; i < 0x4000; i += 1024) {
        pc.printf(" %d", i);
        buf1[i] = c;
    }

    pc.printf("\r\nwrite 2\r\n");
    for (i = 0; i < 0x4000; i += 1024) {
        pc.printf(" %d", i);
        c = buf2[i];
    }

    pc.printf("\r\nread 2\r\n");
    for (i = 0; i < 0x4000; i += 1024) {
        pc.printf(" %d", i);
        buf2[i] = c;
    }
}