らずらいと姫の挑戦日記(第26回)~組込マイコンとコンピュータの違い②~
2016-10-25
今回は、組込マイコンを使用する上で避けては通れない、『メモリ』の仕組みについて勉強します。
ノウハウ
②メモリについて知る
メモリは、マイコンの中にあるデータを保存する場所で、RAM(Random Access Memory)と呼ばれているそうです。組込マイコンでは、このメモリを「ユーザ領域」、「スタック領域」という2つに分けて使っているそうです。
Lazuriteに搭載されているマイコンML620Q504H のメモリは6Kバイトで、そのうち、Lazuriteの初期設計はユーザ領域が5.5Kバイト、スタック領域が512バイトに設定されてるそうです。
ユーザ領域
変数別にメモリを割り当てていく領域です。
プログラムの{}の外で宣言した変数
{}の中でもstatic指定子を付けた変数がユーザ領域に割り当てられます。
部屋にたとえると、予め使うと宣言をした人が、一人で自由に使用することが出来る個室になります。
スタック領域
スタック領域というのは、部屋にたとえるとみんなでシェアして使う共用スペースになります。
- {}内で宣言した変数
- 自分を呼び出した関数のアドレス
などが、その領域に書き込まれます。
サンプルプログラム「Welcome_SubGHz2」を例に見てみましょう。
[c]
#define LED 26 // pin number of Blue LED
#define SUBGHZ_CH 36 // channel number (frequency)
#define SUBGHZ_PANID 0xABCD // panid
#define HOST_ADDRESS 0x5f59 // distination address
unsigned char send_data[] = {"Welcome to Lazurite Sub-GHz\r\n"};
bool event=false;
void callback(void)
{
event = true;
}
void setup(void)
{
SubGHz.init(); // initializing Sub-GHz
Serial.begin(115200); // Initializing serial
pinMode(LED,OUTPUT); // setting of LED
digitalWrite(LED,HIGH); // setting of LED
timer2.set(1000L,callback);
timer2.start();
}
void loop(void)
{
SUBGHZ_MSG msg;
wait_event(&event);
// Initializing
SubGHz.begin(SUBGHZ_CH, SUBGHZ_PANID, SUBGHZ_100KBPS, SUBGHZ_PWR_20MW); // start Sub-GHz
// preparing data
digitalWrite(LED,LOW); // LED ON
msg = SubGHz.send(SUBGHZ_PANID, HOST_ADDRESS, &send_data, sizeof(send_data),NULL);// send data
digitalWrite(LED,HIGH); // LED off
SubGHz.msgOut(msg);
// close
SubGHz.close(); // Sub-GHz module sets into power down mode.
return;
}
[/c]
このプログラムをメニューのプロジェクト –> ビルドをします。
ビルドが完了したら、メニューのプロジェクト –> プロジェクトのフォルダを開くを選択すると、たくさんのファイルの中に、Welcome_SubGHz2.mapというファイルが出来ています。このファイルは、マイコンのコンパイラが様々な関数や変数にメモリを割り当てていった結果が書きこまれています。そうすると、Welcome_SubGHz2.cというソースファイルから、次のメモリが割り当てられているのが解ります。CODEというのは、プログラムROM、DATAというのはRAMに割り当てられたことを示しています。
一方で、「SUBGHZ_MSG msg」という変数は見当たりません。この変数の方は{}の中で使用されているため、スタック領域に割り当てられているためだからです。
スタック領域とは?
スタック領域はマイコンがどのように使用しているのか掘り下げてみましょう。
~スタック領域の使われ方① 一時的なデータを置いておく~
図書館の広い共有机で勉強しています。図書館の参考書と自分の参考書、両方を机においていますが、図書館の参考書は一時的に見て、元の場所に戻しますよね。一時的に図書館から借りた本を置いておくのがスタック領域で、自分の参考書は自分のものなので、ずっと手元に置いておきます。これがユーザ領域です。
例えば、図書館の本を大量に持ってきて、共有スペースに広げると他の人に迷惑をかけます。それは、メモリでも同じで、一時作業エリアに大きなサイズのデータをいれると壊れてしましまうそうです。大きなデータなら、ユーザ領域にもってくるなどして、プログラムを作っているのですね。
~スタック領域の使われ方② 足跡を残していく~
C言語のプログラムは、AがBを呼び出し、BがCを呼び出し、Cが完了したらBに戻って、というように動きます。ヘンデルとグレーテルのように、関数を呼び出すとき、足跡を残しながら先に進んでいくので、関数が終わったら呼び出した元の場所に戻ることが出来ます。
マイコンは、この足跡をスタック領域に残しながら、次の関数を実行しているのです。無駄に深い関数の構造をした場合もスタック領域が無くなるプログラムになるのだそうです。
まとめると、ソフトウエアは下の図のように動くとき、スタック領域はこれらの関数の中で一時的に使用される{}内の変数や、自分を呼び出したプログラムの場所を記憶するために使用されるのです。
コンピュータは、このようなことを考えるのが面倒だからたくさんのメモリを搭載して、ソフトウエアで開発者が意識せずに使用できるようにしたものなのです。
メモリの仕組みを理解する事は、電池の小さな組込マイコンを使用する上でとても大切な事なので、頑張って勉強してみました!