楽天市場
[無料でホームページを作成] [通報・削除依頼]

Tiny AVR/PIC Bootloader+

Tiny AVR/PIC Bootloader+の起動処理についてまとめ

1.通信手順

以下にホストとブートローダーとの通信手順を示す。

img_20130729-134328.jpg

まずホスト側からリセット直後のターゲットに向け、コード0xC1を送出する。

ターゲット側がこれを正しく受信できれば、データ転送を開始する。

ホストとターゲットが繋がっていないときは、ターゲット側の受信ルーチンが約1秒でタイムアウトし、ブートローダーの処理を抜ける。

このときユーザープログラムが書き込まれていれば、ユーザーブログラムが実行される。

ターゲット側は転送されるデータブロック毎にチェックサムの判定を行い、チェックサムでエラーを判定するとホストに向けて文字"N"を送出する。

ホストは"N"を受信すると、先に送ったデータブロックを再送信する。 "K"を受信すると次のデータブロックを転送する。

ホスト側が転送を完了してもターゲット側は受信待ち状態にあるが、約1秒でタイムアウトしてブートローダーの処理を抜ける。


2.メモリーマップと命令の置換(PICの場合)

以下にPICの場合のメモリーマップを示す。

PICのフラッシュメモリのうちアドレス0000~0002がブートローダーへジャンプコードに書き換えられる。

ブートローダーの処理が完了すると、ブートローダーの先頭4ワードの領域へとジャンプし、ここがブートローダーの出口となる。

PICの場合この4ワードにソースコード0x0000~0003の領域を強制コピーする。この4ワードに含まれるGOTO命令により、ユーザープログラムへとジャンプする。

img_20130729-134424.jpg


<<PICブートローダーにおけるソースプログラム作成上の制約>>

①割り込み使用の有無に関わらず、ソースプログラムの先頭4ワード中に必ずユーザープログラムへのジャンプ命令を記述する必要がある。

②さらにGOTO命令やCALL命令の範囲を超えるフラッシュを塔載しているPICの場合はプログラムソースの先頭4ワード中でPCLATHの定義を行う必要がある。

例えば上図のソースプログラムで先頭clrf PCLATHがない場合を想定すると、ブートローダーの出口0F9CではPCLATHの値が0x0Fとなっているため。GOTO命令を実行するとINITのアドレス0x0010ではなく0x0F10にジャンプしてしまう。

③上記②の理由からソースプログラムの先頭4ワード中にBRA命令やBRW命令などの相対ジャンプ命令をそのまま記述できない。

④ブートローダーへのジャンプコードに書き換えられるアドレス0x0000~0002の領域へのジャンプやサブルーチンコールは不可。


2.メモリーマップと命令の置換(AVRの場合)

以下にAVRの場合のメモリーマップを示す。

img_20130731-003246.jpg


AVRのフラッシュメモリのうちアドレス0000のみブートローダーへジャンプコードに書き換えられる。

ブートローダーの処理が完了すると、ブートローダーの先頭4ワードの領域へとジャンプし、ここがブートローダーの出口となる。

この領域は以下の3つの場合により、 異なる コードが書き込まれる。

(1)ソースコードの0x0000がRJMP命令のとき、(3ワード使用)
RJMP命令をIJMP命令に置換して記述する。IJMP命令に置換する理由はアドレス0x0000とブートローダーの先頭4ワードの領域とでRJMPが届く領域が異なるため。

(2)ソースコードの0x0000がRCALL命令のとき、(4ワード使用)
RCALL命令をICALL命令に置換して記述する。次に相対ジャンプ命令で0x0001へのジャンプを記述
割り込みを使用しない場合0x0000に任意のコードを記述することが許される。ICALL命令に置換する理由は上記と同じ。

AVRのフラッシュメモリは最上位アドレスから最下位アドレスへと循環しているので、ブートローダーの出口から0x0001への相対ジャンプが可能である。

(3)その他の場合、(2ワード使用)
ソースコードの0x0000をそのままコピー、その後ブートローダーの出口から0x0001への相対ジャンプ

<<AVRブートローダーにおけるソースプログラム作成上の制約>>

①ブートローダーへのジャンプコードに書き換えられるアドレス0x0000の領域へのジャンプやサブルーチンコールは不可。

ただし、ブートローダー支援機能を搭載したATMEGAの場合は、リセットベクターが変わるので上記制約も無くなる。