ブートローダーシーケンス

標準のブートローダがシリアル通信を感知し、何も読み込まれなければ、それはコアプログラムに制御を渡します。これはおおまかに対応しています

int main(void) {
    init();
    setup();
    for (;;) {
        loop();
        if (serialEventRun) serialEventRun();
    }
    return 0;
}

コアプログラムが実行されている間に、IDEまたは avrdude を使用して新しいスケッチをアップロードするときに何が起こるのか理解したいと思います。私は、ブートローダが何かがシリアル通信で読み込まれたときに制御を取り戻し、これはボードリセット( serialEventRun のどこかで起動されます)を介して行われると思います。

もしそうなら、この流れはどのようにシリアルポートの使用法と相互作用しますか?私は avrdude を使ってUSB経由でスケッチをアップロードし、プログラム実行中にシリアル通信を使いたいとします。

4
シリアル接続を開くとボードがリセットされ、ブートローダがロードされます。どのボードについて話していますか?
追加された 著者 Al.,

2 答え

ほとんどのコンピュータは起動時に位置ゼロで実行を開始します(または間接的にジャンプします)。バリエーションがあるかもしれませんが、これは一般的な考えです。ブートローダがインストールされているときに場所ゼロに置かれたものは、ブートローダがパワーアップまたはリセット時に制御を獲得する原因となります。その後は、次に起こることはブートローダに任されます。

通常は、ブートローダがシリアルポートを監視して「ハンドシェイク」シーケンスの開始を監視します。それが探している場合は、ローダープログラム(例えば、avrdude)が、これがちょうどその時点で送信されていたランダムなテキストではなく、返信するブートローダであることを知らせるように応答します。 (ブートローダが短期間にハンドシェイクシーケンスを開始しない、またはハンドシェーク以外の何かを見ると、既存のユーザプログラムが起動します)。

そこから、ローダープログラムとブートローダーが協力して、ユーザープログラムをArduinoに転送し、指定された場所でフラッシュメモリーにロードします。また、ユーザプログラムと共に転送されるのは開始アドレスである。アップロードが完了して検証されると、ブートローダはユーザプログラムの開始アドレスに転送されます。

この時点で、ユーザプログラムはシリアルポートを含むマシンを所有し、別の電源サイクルまたはリセットが発生するまでマシンを継続します。ユーザープログラムとブートローダがポートの使用をネゴシエートする必要はありません。ブートローダーはリセットからアップロード終了まで所有しており、ユーザープログラムはそれを所有しています。

更新:

しかし、その時点で(ユーザープログラムの実行中に)私は   アップロード(IDEまたはavrdudeから)。

これは、avrdudeがArduinoボードがチップをリセットさせるために使用するハードウェア信号(データストリームに含まれていない )を送信できるためです。実行中のプログラムからブートローダーに制御を移すのはリセットプロセスです。一例として、手作りのボードには、その自動リセット回路は含まれていませんでした。これらの掲示板では、avrdudeは自発的に新しいアップロードを開始することはできません。私はavrdudeを起動するときに手動でリセットする必要があります。

2
追加された
@leonbloy - チップをリセットするか、実行中のスケッチの一部がブートローダに制御を戻すようにする何かを行うだけです。最初の例は、コンデンサを介してターゲットMCUのリセットに接続されたフロー制御信号をトグルすることです。
追加された 著者 rossp,
"この時点で、ユーザプログラムはシリアルポートを含むマシンを所有しており、別の電源サイクルまたはリセットが発生するまでマシンを継続します。しかし、その時点で(ユーザープログラムの実行中)、私はアップロードを開始することができます(IDEまたはavrdudeから)。
追加された 著者 samdoj,

Arduino IDEが通信ポート制御信号の1つをトグルすることによってArduinoボードをリセットするという事実が失われているようです。これによりArduinoボードのハードウェアがリセットされ、説明したようなことが起こります。

2
追加された