ATmega128でのROMデータの取り扱い

公開日:  最終更新日:2014/06/05

すいません m(_ _)m、本記事はブログ引越時に書式が崩れました。順次修正中です。

さて、EZ-SERVOがちょっと落ち着いてきたので、久々のATmega128ネタ。


ATmega128を使い始めてわかったことなんですが、ROM上に配置したり、またROM上のデータを取り扱う場合、少し特別なことをしないといけないようです。


まずは、avr/pgmspace.hというヘッダファイルをインクルードする必要があります。このヘッダファイルには、ROM上にデータを配置するためのマクロと取り出すためのマクロ(というか関数というか)が記述されていますので、ROMアクセスに関しては、これを参考にしてプログラムを作成すればよさそうです。


また基本的なアクセス方法は、マクロ(関数)を使って、一旦、RAMに取り出してから使うようです。これって、ATmega128(AVR)特有なんでしょうか?H8/TINYの時には無かった概念です。


変数をROM上へ配置
変数をROM上に配置するためには、変数定義時に、「PROGMEM」というキーワードを一緒に設定します。変数が実際にどのアドレスに割り当てられたかは、MAPファイル(拡張子がmap)を見ると知る事ができます。


というわけで、いくつかテストしてみました。



  1. const short sTestData PROGMEM = 0;…ROM上に配置

  2. const short sTestData= 0;…RAM上に配置

  3. short sTestData= 0;…RAM上に配置

  4. short sTestData PROGMEM = 0;…ROM上に配置

「const」をつけてもつけなくても、「PROGMEM」をつけるとROMの方へ行くみたいなので、どっちでもよさそうですけど、やはりここは、「読み出し専用」ということで、「const」と「PROGMEM」、両方ちゃんとつけておくのがよさそうです。


上記のような、初期化付きの変数がRAMに割り当てられた場合、初期化データそのものはROM上に置かれ、起動時にコピーされるとのことです。


ROM上の変数を読み出す
ROM上の変数を読み出すためには、pgmspace.hで宣言されているマクロ(関数)を使用する必要があります。どんなものがあるかは、pgmspace.hをみてもらえばわかると思います。SIN関数の話で使った機能は、memcpy_P()というものです。これは、ROM(PROGRAM領域)から、RAMにコピーする機能です。


慣れてしまえば、どうってもんでも無いんですが、なんとなくめんどくさいので、なんとか自動判別できるようにならないもんでしょうか。うーん。

  • このエントリーをはてなブックマークに追加
  • Pocket

関連前後記事

Your Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

PAGE TOP ↑