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にロードする方法の文書化されたプロセスを見つけました。これは、私が最初にこの質問で行っていた場所です...かなりきちんとしていると思います