Arduinoブートローダーの詳細


11

Arduinoブートローダーがどのように機能するかを誰かが説明できますか?ここでは高レベルの答えを探しているのではありません。コードを読んだので、その要点を理解しました。私はこの他の投稿も読みました(私はそれへの応答者の1人でさえありました)。

Arduino IDEとブートローダーコードの間に発生する一連のプロトコルの相互作用により、最終的に、シリアルインターフェイスを介して送信されるプログラムでフラッシュを自己プログラミングする多数のインラインアセンブリ命令が生成されます。

はっきりしないのは270行目です。

void (*app_start)(void) = 0x0000; 

...これは、関数ポインタの宣言およびNULLへの初期化として認識されます。ブートローダーがユーザーがロードしたコードの実行に委任することを目的とした場所で、app_startへの後続の呼び出しがあります。

確かに、app_startこれをすべて組み合わせるには、ある時点で何らかの方法でNULL以外の値を取得する必要があります。ブートローダーのコードにそれが表示されていません...ブートローダーによって読み込まれるプログラムによって魔法のようにリンクされていますか?ブートローダーのメインは、チップのリセット後のソフトウェアへのエントリポイントだと思います。

アセンブリの70行程度にまとめると、app_startが実際にどこにあるかをメインプログラムに伝える秘密のデコーダリングである必要がありますか?それとも、Arduino IDEによって利用されている暗黙の知識ですか?私が知っているのは、誰かがapp_startを0以外の場所を指すように変更しないと、ブートローダーコードが永遠にそれ自体をスピンさせるだけだからです。

別の言い方をすれば、ブートローダーコードが割り込みに依存することは可能ですか、それともノーノーですか?

編集

ブートローダーコード用に個別のメモリスペースを持たないTiny AVR(具体的にはATTiny44A)にブートローダーを移植することに興味があります。ブートローダーコードが特定のヒューズ設定とチップサポートに依存していることが明らかになったので、私が本当に興味を持っているのは、これらのヒューズとハードウェアを持たないチップにブートローダーを移植するために何が必要かということです。サポート(ただし、まだセルフプログラミング機能があります)?

USIを半二重UARTとして使用するためにAVR307の実装を使用できると考えていました(Timer0割り込みとピン変更割り込みを使用)。誰でも、ブートローダーのハードウェアサポートがないチップのブートローダーコードを作成/移植する方法についてのガイダンスを提供できますか?

ブートローダーコードをアドレスmainの通常の場所(たとえば、0x029eまたはコンパイラーがmainを配置する場所)に置くと思います。次に、ブートローダーコードの「アドレス」にオフセットを追加してメインの終わりを過ぎたところに置き、「app_start」をそのアドレスに設定するようにします。私はこれについて正しく考えていますか、それとも完全に何かを逃していますか?ありがとう!

編集2

FWIW、私はArduinoのスケッチをATTiny85にロードする方法の文書化されたプロセスを見つけました。これは、私が最初にこの質問で行っていた場所です...かなりきちんとしていると思います


1
stackoverflow.com/questions/3652233/arduino-bootloader/…私の答えはどこに行くのだろうと思っていました...
Nick T

回答:


12
void (*app_start)(void) = 0x0000; 

これはNULLポインターではありません。これは実際には、ブートローダーがジャンプするアプリケーションコードの開始アドレスです。リンカは、アプリケーションコードがアドレス0から始まるように調整します。ATMEGA168データシートの表26-6を参照してください。

ブートローダーのコードはフラッシュ内で上位に起動します。正確にどこがブートローダーのヒューズに依存するか。


ブートローダーのメインコードはどこにありますか
vicatcu

1
@Joby、ああ、わかりました...私の質問の更新を参照してください-ブートローダーを、ブートローダーコード用の個別のメモリスペースを持たない小さなAVRに移植することに興味があります。
vicatcu

1
@Joby、したがって、ブートローダーコードは「...リセット後にブートリセットヒューズがブートフラッシュの開始アドレスを指すようにプログラムできます。この場合、ブートローダーはリセット後に開始されます。 」
vicatcu

3
特にArduinoブートローダーが必要でしたか?これは、STK500プログラマをエミュレートするため、多少かさばります。ブートローダーのdirには、gcc-3で1K未満にコンパイルされるatmega8バージョンがありますが、それでも、利用可能なフラッシュがかなり不足することになります。
Peter Gibson

3
あなたは本当に本当にブートローダーが必要ですか?確かにATTinyの場合は、ICSPプログラマー(usbTinyISPなど)を使用してデバイスをプログラミングする価値があります
SingleNegationElimination
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.