メモリー 256

メモリー

メモリーモデル

32KB以上のRAM確保

mbed LPC1768のRAMは64KBあるが、32KBはユーザー用、あとの2つの16KBブロックはUSBとEthernet用に予約されている。

このエリアを使うには以下のように宣言する。

LPC1768

char buf1[0x4000]; // 通常エリア
char buf2[0x4000] __attribute__((section("AHBSRAM0"))); // Ethernet用エリア (0x2007c000)
char buf3[0x4000] __attribute__((section("AHBSRAM1"))); // USB用エリア (0x20080000)

RTOS対応のEthernetInterfaceだと0も1も使ってるぽい。

CAN用のRAMも使えるが、ペリフェラルを有効にする必要がある。

LPC1768

LPC_SC->PCONP |= (1<<13);
char buf4[0x800] __attribute__((section("CANRAM"))); // CAN用エリア (0x40038000)

LPC11U24も10KBのうち、8KBはユーザー用、あとの2KBはUSB用に予約されている。

LPC11U24

char buf1[0x0800]; // 通常エリア
char buf2[0x0800] __attribute__((at(0x20004000))); // USB用エリア

アドレスを直接指定してもよい。

char *buf = (char*)0x2007c000;

メモ

EthernetInterface/lwip/code/mem.c

#if defined(TARGET_LPC4088)
#  if defined (__ICCARM__)
#     define ETHMEM_SECTION
#  elif defined(TOOLCHAIN_GCC_CR)
#     define ETHMEM_SECTION __attribute__((section(".data.$RamPeriph32")))
#  else
#     define ETHMEM_SECTION __attribute__((section("AHBSRAM1"),aligned))
#  endif
#elif defined(TARGET_LPC1768)
#   define ETHMEM_SECTION __attribute((section("AHBSRAM0")))
#else
#		define ETHMEM_SECTION
#endif

USBHost/USBHALHost.cpp

static volatile uint8_t usb_buf[TOTAL_SIZE] __attribute((section("AHBSRAM1"),aligned(256)));  //256 bytes aligned!

メモリー保護ユニット

MPU (Memory Protection Unit) を使えば、メモリーのデータをアクセス(読み出し・書き込み・実行)した際に、Faultを発生させることができる。

スタックあふれの検出や、データエリア等の誤実行などから保護するのに使える。

Import programMPU_test

Memory Protection Unit

メモリーあふれを検出

malloc() でメモリ確保する場合、失敗(メモリ不足)すると NULL が返るのでわかる。

new 演算子でメモリ確保する場合、例外をスローするが try ~ catch はコンパイラで disable にされているため set_new_handler() を使わないといけない。

set_new_handler()でメモリあふれの検出(強制終了)

#include "mbed.h"
#include <new>

void no_memory () {
    printf("panic: can't allocate to memory!\r\n");
    exit(-1);
}

int main() {
    set_new_handler(no_memory); // new handler function

    :

メモリーあふれから復帰できるか

setjmp() longjmp() で復帰できた。
致命的エラーの後処理できるかも。

Import programmalloc_test

http://mbed.org/users/okini3939/notebook/mbed256_memory/

メモリーあふれから復帰

#include "mbed.h"
#include <new>
#include <setjmp.h>

jmp_buf jbuf;

void no_memory () {
    // メモリーあふれ時に呼び出される
    longjmp(jbuf, 1);
}

int main () {
    classSample *hogehoge;

    set_new_handler(no_memory); // newのメモリーあふれ時のハンドラ定義

    if (setjmp(jbuf) == 0) {

        hogehoge = new classSample(); // class等のメモリー確保と初期化(この中でメモリーが不足する)
          :
        // 通常の処理

    } else {
        // メモリーあふれ時の処理(longjmpから飛んでくる)

        delete hogehoge; // 後片付け等
          :

    }
}

ただし、setjmp/longjmp の使用は 宗派によっては邪道かも。


戻る (back)


Please log in to post comments.