carcon999のブログ

12年間Y!ブログの記載を移行しました。電子工作関連の記事が多いです。

ツリー表示のソフトについて

さて、プログラムですが、途中ではまったので、それをネタにします。
最後には、プロジェクトファイルをUPしたので、気になる方はどうぞ。

■constの定数テーブルが1kバイトのRAMに配置される現象に遭遇
プログラムは、LEDの表現をテーブル化して、自由にテーブルを書き換えて自分に合う表現ができるようにしたのですが、なぜか、演出を追加してゆくと、動作が怪しくなります。経験上、スタックの破壊だろうと思っていたのですが、悪い箇所が見当たらず・・・。
いろいろ試していると、テーブルの構造体の定義をint->byteに変更しただけで、発生しなくなることに気が付きました。これは、RAMに配置されているなーと「ピーン」ときました。

しかしプログラム上では、そのテーブルは、const定義されており、ROM定義しています。const定義していても、RAMに配置されるということは、#pragmaで何か定義が必要なんだろうと、マニュアルを探すとありました。"PROGMEM"定義。Flash内に配置したい場合には、その定義にPROGMEM定義を行い、参照するときには、RAMに一度コピーしてから利用する必要があるみたいです。また、型の宣言も専用のものを利用します。

実際には以下のようになります。(サンプルです。)


// Flash内に配置するための定数テーブル定義(PROGMEMの定義がKEY)
PROGMEM prog_uchar tScript[3][4] = {
// 蛍表示
{0, COLOR_RED, 0, VIEW_PWM},
{1, COLOR_RED, 0, VIEW_PWM},
{2, COLOR_RED, 5, VIEW_PWM}
};

void Func()
{
LED_SCRIPT script;

// 先頭の行を得る。
for(int i = 0 ; i < 3 ; i++)
{
// 行を順番に取り出す。
memcpy_P*1;;

// 何らかの処理
・・・
}
}



せっかく、ビルドする製品も選択しているので、RAM領域がオーバーしたら警告でも出してくれれば親切なのですが、これからなのでしょうかね。とりあえず、勉強になりました。

さて、今回のプロジェクトファイルを以下にアップしました。気になる方はどうぞ。
BlinkEx.zip
※ジオシティを利用して、ダウンロードできるようにしました。今後も、自由にアップできそうです。

*1:void*)&script, &tScript[i][0], sizeof(script