AVR ヒューズビット BOOTRSTについて(その2)

AVR ヒューズビット BOOTRST (その1)では超変な使い方を紹介しましたが、単純な応用プログラムを作成しているときに、BOOTRSTビットの設定を間違ったらどうなるのでしょうか?

デフォルトではBOOTRST=1なので、新品のAVRを購入して使う分には問題はありませんが、UNOやMINIなどのブートローダ付きAVRを購入して、新品かどうかわからなくなってしまったような場合です。

もちろんFUSEビットを読みだして確認すればOKですが、実はどちらでも問題なく動作します。

ROMライタでプログラムを焼く場合、最初にERASEコマンドを実行させるはずです。もちろん意識的にERASEせずにPROGRAMも可能ですが、当然正しく動作するような結果にはならないはずですからね。

ERASEでは当然ブートローダも消えてしまします。その後のEEPROMの値は全エリア 0xFFFF で初期化されています。

ではBOOTRSTが0 で、リセット後に0x7800から 0xFFFFをフェッチすればどうなるでしょうか?

0xFFFFのインストラクションを調べてみると・・・

sbrs r31, 7 となりますので、R31レジスタのbit7がsetなら次のインストラクションをスキップします。でも次の行も 0xffff なので、R31の状態にかかわらず同じ動作がずっと続きます。

どこまで続くかというと0x7ffeまでで次は0x0000ですね。スキップしてもしなくても4の倍数でもあり2の倍数でもあるので0x0000に到達して正規のプログラムコードをフェッチすることになります。結果意図した動作がいずれ始まります。その無駄な SBRS命令を1000回ほど繰り返しますが、1000回は1命令100nSec@10Mhzなので100マイクロ秒でしかありません。なので見た目はBOOTRSTビットにかかわらず普通にRESETした動作にみえます。

うまくコーディネイトされた石ですね。