メモリーモデル
メモリーモデル
FLASH: 512KB
RAM: 64KB (うち32KBはEthernet、USB、CAN用)
Cのメモリーモデル
Global/static変数と、ヒープ、スタックとしてメモリを使用します。
Global/static
プログラムの起動時に x はRAM上に確保され、5で初期化されます。
int x = 5; int main() {}
変更することのないデータはFLASH上に確保されるよう const を付けるといいでしょう。
const int x = 5; int main() {}
Stack
関数の中などで宣言された変数は、スタックに確保されます。
関数を抜けるとメモリは解放されます。
void foo() { int x; } int main() {}
Heap
動的に確保された変数は、ヒープに確保されます。
new は、Cでいう malloc()
int *p; int main() { p = new int; }
区分け
- 実行コード (RO)
- const等読み取り専用データ (RO)
- 初期化されるglobal/static変数 (RW)
- 初期化されないglobal/static変数 (ZI)
- ローカル変数 (RW, ZI)
RO: read-only
RW: read-write
ZI: Zero Initialise
書き込み後 起動後 +--------+ +--------+ 上位アドレス | | | | | | | | | | RAM | | +--------+ ^ | | | ZI = 0 | | | | +--------+ | | | +-> |RW Data | | +========+ | +========+ ^ | | | | | | | | copy | | | +--------+ | +--------+ | Flash |RW Data | >-+ | | ^ +--------+ +--------+ | |Program | |Program | | +--------+ +--------+ 下位アドレス
Heap と Stack
ヒープはRAMの下位アドレスから上位アドレスへ向けて、 スタックはRAMの上位アドレスから下位アドレス向けて消費していきます。
+--------+ RAM 末尾アドレス | Stack | | | | | v | +--------+ RAM | | | | +--------+ | ^ | | | | | Heap | +--------+ | ZI | +--------+ | RW | +========+ RAM 先頭アドレス | | Flash | |
衝突
ヒープとスタックでメモリーを消費しきると、互いにメモリーの内容を上書きすることになり、変数のデータは破壊されプログラムは暴走するでしょう。
Please log in to post comments.