ニックネーム: 居酒屋ガレージ店主
★ZAQのBlogari停止のため、あれこれ「データ吸い出し」対策しています。 新規記事はとりあえず停止。 コメント書き込みはまだ有効です。 (JH3DBO 下間憲行)
2015年10月07日(水)
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/
※ブログ管理者が承認するまで表示されません
コメントを記入  
お名前(必須)
 
パスワード:
 
メール:
 
URL:
 
非公開:  クッキーに保存: 
※非公開にチェックを入れると、管理者のみにコメントが届きます。
ブログの画面には表示されません。
captcha


※画像に表示されている文字を入力してください(半角・大文字/小文字の区別なし)。
文字が読みづらい場合はこちらをクリックしてください。
小文字 太字 斜体 下線 取り消し線 左寄せ 中央揃え 右寄せ テキストカラー リンク