メモリーモデル

メモリーモデル

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 |        |

衝突

ヒープとスタックでメモリーを消費しきると、互いにメモリーの内容を上書きすることになり、変数のデータは破壊されプログラムは暴走するでしょう。


詳細 戻る (back)


Please log in to post comments.