Arduino IDE 「PROGMEM」について
チャートレコーダーのスケッチを修正についての
補足です。
AVRマイコンにおけるC言語特有の問題を解決してくれる
魔法の言葉「PROGMEM」について、ちょいと解説して
おきます。
〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜
利用できるRAMが小さな組み込み用マイコンの世界では、
「変化しないデータ」(数値や文字、ビットパターン
など)をROMエリアに配置します。
※PCだと、固定データでもRAMに入ります。
なにせRAM上で実行されるんですから。
AVRマイコンなど、ちょいと特殊なマイコンでは、
RAMの読み書きと、ROMに固定したデータへのアクセス
方法が、別命令になっています。
ROMのデータを読み出すだけの命令があるのです。
※ROMには書けませんので、読むだけ。
一般的な「C言語」は、このような特殊な事は想定
されていません。
AVRマイコンの「C」では、この特殊な読み出しが
できるように処理系が拡張されています。
例えば…
(1)4バイトの固定値をROMに配置
const byte data4[] PROGMEM = {
0x01, 0x02, 0x04, 0x08,
};
「const」は、そのデータは固定値だとコンパイラに
指示する型修飾子です。
しかし、AVRマイコンのコンパイラは、これだけでは
データをROMエリアには配置してくれません。
※constだけではデータはRAMに置かれます。
そこに書き込もうとすると、コンパイル時、
そのコード部分にエラーが出ます。
そこで「PROGMEM」という魔法の言葉が出てきます。
これで、そのデータがROM内に配置されます。
さらに、これを読むための関数が用意されていて
1バイトなら「pgm_read_byte」、2バイトのデータ
なら「pgm_read_word」を用います。
ROMとRAMを区別せずにアクセスできるマイコンの
Cなら「d = data4[0]」と書けるわけですが、
AVRマイコンのCでは、「d = pgm_read_byte(&data4[1])」
などと読み出し関数を使い、「&」=アドレス演算子を
用いて、ROM内に配置されたデータの場所を指定します。
ちょいと面倒ですが、AVRマイコン特有のアーキテクチャ
ですので、しかたありません。
※ROM内に置いた文字列を扱う関数も
用意されています。
もちろん、RAMエリアに余裕があるときは、こんな
面倒なことは不要です。
const修飾子を付加して、普通に固定データとして
書いておけばかまいません。
プログラムが走り始めたとき、ROMからRAMへこれらの
データがコピーされ、RAM上のデータとして命令を実
行します。
特殊な読み出し関数も使わなくてかまいません。
ケチくさいですが、無駄に使われる「RAMがもったい
ない」と感じてしまうので、ROMに固定できるところ
はROMに入れておこうということで、プログラムを
書いています。
|
2015年10月7日 17時23分
|
記事へ |
コメント(0) |
トラックバック(0) |
|
・電子回路工作 |
トラックバックURL:http://blog.zaq.ne.jp/igarage/trackback/4250/
※ブログ管理者が承認するまで表示されません