Arduinoチュートリアル 基礎編


メモリ

原文

Arduinoボードのマイクロコントローラ(ATmega168)には3種類のメモリがあります。

・Flashメモリ:Arduinoのスケッチが格納されます
・SRAM(static random access memory):スケッチの実行中に変数の作成と操作がおこなれる領域です
・EEPROM:長期的に情報を記録するためのスペースです

FlashメモリとEEPROMは不揮発性です。つまり、電源を切っても情報は消えずに残ります。SRAMは揮発性で、電源を切ると内容は失われます。

ATmega168チップの各メモリの容量は次のとおりです

Flash 16kバイト (内2kバイトはブートローダで使用)
SRAM 1024バイト
EEPROM 512バイト

SRAMの容量は大きくありません。スケッチのなかでたくさんの文字列を使用すると簡単になくなってしまいます。たとえば次のように宣言するとしましょう。

char message[] = "I support the Cape Wind project.";

この1行で32バイトのSRAMを消費します(1文字につき1バイト)。この例のとおりなら問題ありませんが、1024文字まで伸ばすことはできません。ディスプレイに大量の文字を送りたいときや、大きなルックアップテーブルを使うときは注意が必要です。

SRAMを使い切ってしまうと、あなたのスケッチは期待通りの動作をしてくれません。アップロードは成功しても、おかしな動作をするか、まったく動作しなくなります。そういう現象が発生したら、スケッチのなかの文字列やデータの定義を(コードは変えずに)短くしたり、コメントアウトしてみましょう。それで問題が解消するならば、おそらくSRAMの不足が原因です。

解決方法はいくつかあります。

・あなたのスケッチがパソコンと通信しながら動いているのであれば、Arduino側のデータや処理をパソコン側へ移動させて、負担を軽くしてやります。

・ルックアップテーブルや大きな配列を使っている場合は、データを記憶するのに必要な最低限の大きさの型を選択するようにします。たとえば、ひとつのint型の変数は2バイトを消費しますが、byte型ならば1バイトです(そのかわり、記憶できる値の範囲は小さくなります)。

・実行中は変更されない文字列やデータの場合、それらをSRAMにかわってFlashメモリに記録しておくことができます。そのとき使用するのがPROGMEMキーワードです。



[目次へ戻る]

Creative Commons Attribution-ShareAlike 3.0 License.
このドキュメントはArduino Teamにより執筆され、Takumi Funadaが翻訳し、一部加筆修正したものです
ご意見はtf at musashinodenpa.comまでお送りください [Arduino wiki]