メモリー 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 の使用は 宗派によっては邪道かも。
Please log in to post comments.