--/--/--  --:--    スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
最近知りましたが、AVRはconstを変数名の前につけただけじゃROM上定数にしてくれないんですね。
H8とかは勝手にやってくれると知っていたので、AVRもそうだろうと思い込んでいました。
しかし、文化祭で使用したドットマトリクスのプログラムで定数の配列を作り
constをつけて宣言していましたが、どんどんRAMの容量が上がって行きました。
その時、やっとAVRはconstをつけてもRAM上に展開されてしまうことに気が付きました。

AVR wikiを覗いてみると、Getting Started Notesにちゃんと書いてあるんですね。
よく周辺機能の方の項目は覗いていましたが、そっちの方はちゃんと見ていませんでした。
といいますか、
「FLASH上定数ってなんだろう???」
って昔にスルーした覚えがあったりします。
今になってその意味を実感した感じです。
それだけ昔の私は無知であったという馬鹿らしい話なのですが・・・。

文化祭の方は、結局char型に1か0を入れて配列にしておくという馬鹿らしい仕様を改め、
int型に1行(16bit分)のデータをつめておいて、
ANDして1bitずつ抜き出して処理するという方法に変更したため、
SRAMが1KBなMEGA88でも十分な文字数は入れることができました。

文化祭が終わって、今度こそROM上に定数を置こうと調べてみました。
AVR WikiのFLASH上定数の項目を見てみましたが、
ちょっとわかりにくいのでもう少し調べてみることに。
実際のプログラムが載っていてわかりやすかったのはこちら。
マイコン講座/プログラムメモリ上定数 - 工研Wiki

実際のプログラムはこんな感じに。

#include ‹avr/pgmspace.h›
#define moji(number) pgm_read_word(&moji_[number])
const prog_uint16_t moji_[] = {
0x0000 //データ
};
a = moji(0);

まあこんな感じです。
defineしておけば、[ ]を( )に変えるだけで、通常の配列のように使えます。
これを利用し配列をROM上に置いたところRAMがものすごく空きました。
constを書いただけで勝手にやってくれれば便利なんですけどね・・・。
実際AVRを使っていても気づいていないことはまだまだ多くありそうです。
AVR
Secret

TrackBackURL
→http://amenotiyukizora.blog76.fc2.com/tb.php/234-bfdf5834
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。