AVRマイクロコントローラーがブートローダー(Arduinoなど)で使用する多くのプロジェクトに出会ったことがありますが、その概念をよく理解していません。
ブートローダーを作成するにはどうすればよいですか(マイクロコントローラー用)?
ブートローダーを作成した後、マイクロコントローラーにどのようにプログラムされますか(AVRのフラッシュROMで焼き付けられた.hexプログラムなど)。
AVRマイクロコントローラーがブートローダー(Arduinoなど)で使用する多くのプロジェクトに出会ったことがありますが、その概念をよく理解していません。
ブートローダーを作成するにはどうすればよいですか(マイクロコントローラー用)?
ブートローダーを作成した後、マイクロコントローラーにどのようにプログラムされますか(AVRのフラッシュROMで焼き付けられた.hexプログラムなど)。
回答:
ブートローダーは、プログラムするマイクロコントローラーで実行されるプログラムです。何らかの通信手段を介して外部から新しいプログラム情報を受信し、その情報をプロセッサのプログラムメモリに書き込みます。
これは、プログラムをマイクロコントローラーに取り込む通常の方法とは対照的です。マイクロコントローラーは、その目的のためにマイクロに組み込まれた特別なハードウェアを介しています。PICでは、これはSPIのようなインターフェイスです。私の記憶が正しければ、AVRはJtagを使用するか、少なくとも一部は使用します。いずれにせよ、これには情報をプログラムメモリに書き込むためにプログラミングピンを少しずつ動かす外部ハードウェアが必要です。プログラムメモリの内容を記述するHEXファイルは汎用コンピューターで作成されるため、このハードウェアは一方のコンピューターに接続し、他方のマイクロの特別なプログラミングピンに接続します。私の会社では、特にPICプログラマーを副業として作っているので、PICでのこのプロセスにはかなり精通しています。
特殊なハードウェアを介した外部プログラミングの重要なポイントは、プログラムメモリの既存のコンテンツに関係なく機能することです。マイクロコントローラーは、プログラムメモリが消去された状態または未知の状態で開始されるため、最初のプログラムをマイクロに取り込む唯一の手段は外部プログラミングです。
製品にロードするプログラムについて確信があり、ボリュームが十分に大きい場合は、メーカーまたはディストリビューターのプログラムチップを入手できます。チップは他のチップと同様にボードにはんだ付けされ、ユニットは準備完了です。これは、たとえばおもちゃのようなものに適しています。ファームウェアが完成したら、ほぼ完成し、大量に生産されます。
ボリュームが小さい場合、またはさらに重要なことは、進行中のファームウェア開発とバグ修正を期待している場合、事前にプログラムされたチップを購入したくないということです。この場合、ブランクチップがボードにマウントされ、製造プロセスの一部としてファームウェアをチップにロードする必要があります。その場合、ハードウェアプログラミングラインを何らかの方法で利用可能にする必要があります。これは、明示的なコネクタを介して行うことも、実稼働テストフィクスチャを作成する場合はpogoピンパッドを介して行うこともできます。多くの場合、そのような製品はテストする必要があり、とにかくキャリブレーションする必要があるため、通常、プログラムをプロセッサに書き込むための追加コストは最小限です。小型のプロセッサを使用する場合、特別な生産テストファームウェアが最初にプロセッサにロードされることがあります。これは、ユニットのテストとキャリブレーションを容易にするために使用され、次に、ハードウェアが正常であることがわかった後、実際のファームウェアがロードされます。この場合、プログラミングプロセスが機能するのに十分なプログラミングラインへのアクセスを許可するだけでなく、回路に過度の不便を与えないために、いくつかの回路設計上の考慮事項があります。詳細については、インサーキットプログラミングの説明。
これまでのところ、ブートローダーは必要ありません。ただし、フィールドアップグレードが可能な比較的複雑なファームウェアを備えた製品、またはエンドカスタマーがアップグレードできる製品を検討してください。エンドカスタマーがプログラマガジェットを持っていると期待したり、たとえそれを提供したとしても適切に使用する方法を知ったりすることはできません。実際、私の顧客の一人がこれをしています。特別なフィールドカスタマイズオプションを購入すると、私のプログラマーが製品を入手できます。
ただし、ほとんどの場合、顧客にPCでプログラムを実行し、ファームウェアを魔法のように更新してもらいたいだけです。これは、特に製品にUSB、RS-232、イーサネットなどのPCと簡単に接続できる通信ポートが既にある場合、特にブートローダーが入ります。顧客は、すでにマイクロにあるブートローダーと通信するPCプログラムを実行します。これにより、新しいバイナリがブートローダーに送信され、プログラムメモリーに書き込まれた後、新しいコードが実行されます。
単純に聞こえますが、少なくともこのプロセスを堅牢にしたい場合はそうではありません。通信エラーが発生し、ブートローダーに到着するまでに新しいファームウェアが破損した場合はどうなりますか?起動プロセス中に電源が切断された場合はどうなりますか?ブートローダーにバグがあり、それ自体にがらくたがある場合はどうなりますか?
単純なシナリオでは、ブートローダーは常にリセットから実行されます。ホストとの通信を試みます。ホストが応答すると、ブートローダーに新しいものがないことを通知するか、新しいコードを送信します。新しいコードが到着すると、古いコードは上書きされます。アップロードされたコードには常にチェックサムが含まれているため、ブートローダーは新しいアプリに問題がないかどうかを確認できます。そうでない場合、有効なチェックサムを持つものがメモリにロードされるまで、ブートローダーに常にアップロードを要求し続けます。これは、常に接続されているデバイス、および場合によってはブートローダー要求に応答するホストでバックグラウンドタスクが実行されるデバイスで許容される場合があります。このスキームは、主に自律的であり、ホストコンピューターに接続するのはたまにしか行わないユニットには適していません。
通常、上記の単純なブートローダーは、フェイルセーフがないため受け入れられません。新しいアプリのイメージがそのまま受信されない場合、デバイスが古いイメージの実行を続け、アップロードが正常に実行されるまで停止しないようにします。このため、通常、ファームウェアには実際には2つの特別なモジュール、アップローダーとブートローダーがあります。アップローダーはメインアプリの一部です。ホストとの定期的な通信の一環として、新しいアプリの画像をアップロードできます。これには、外部EEPROMなどのメインアプリイメージとは別のメモリが必要か、より大きなプロセッサを使用するため、プログラムメモリ領域の半分を新しいアプリイメージの保存に割り当てることができます。アップローダーは受信した新しいアプリの画像をどこかに書き込むだけですが、実行はしません。アップロード後にホストからのコマンドで発生する可能性のあるプロセッサがリセットされると、ブートローダーが実行されます。これは現在、外部通信機能を必要としない完全に自己完結型のプログラムです。現在のバージョンとアップロードされたアプリのバージョンを比較し、それらのチェックサムをチェックし、バージョンが異なり、新しいイメージのチェックサムがチェックされる場合、新しいイメージをアプリ領域にコピーします。新しいイメージが破損している場合、以前のように古いアプリを実行するだけです。
多くのブートローダーを作成しましたが、同じものはありません。一部のマイクロコントローラ企業があなたに信じてほしいと思っているにもかかわらず、汎用のブートローダーはありません。すべてのデバイスには、ホストに対処するための独自の要件と特別な状況があります。以下は、私が使用したブートローダーの構成とアップローダーの構成の一部です。
ブートローダー自体は完全なTCPネットワークスタックを含む複雑なコードであったため、フィールドアップグレードも可能でなければなりませんでした。彼らが行った方法は、アップロードサーバーに特別なアプリを提供し、実行されたブートローダーを上書きし、新しいブートローダーが実行されるようにマシンをリセットして、アップロードサーバーが最新のメインアプリの画像。技術的には、特別なアプリがブートローダーを介して新しいイメージをコピーするのにかかった数ミリ秒の間の電源障害は、回復不能な障害になります。実際には、これは決して起こりませんでした。これらのデバイスは大規模なインストールの一部であり、システムのメンテナンスを行う人々がすでにいたため、場合によっては他の理由で組み込みデバイスを交換することを意味するため、その可能性はほとんどありませんでした。
他の多くの可能性があり、それぞれがリスク、速度、コスト、使いやすさ、ダウンタイムなどのトレードオフを持っていることを願っています。
ブートローダーの概念は何ですか?
このシナリオを想像してください:マイクロコントローラーにかなりの量のストレージがあります-互いに独立した2つ以上のプログラムまたはアプリケーションを保管するのに十分です。デバイスを起動するときに、実行するデバイスを選択できるようにしたいとします。これをサポートするには何が必要ですか?起動時に他のプログラムを選択できる開始プログラムが必要になります。
使い方?
ブートローダーはそのプログラムです-実行する最初のものであり、他のアプリケーションをメモリ内の特定の場所(FLASHのような永続的、またはRAMのような揮発性)にロードし、そこから実行を引き継ぐ目的のプログラムにジャンプします。
avrブートローダーの作成方法(またはマイクロコントローラー用)
ブートローダーを作成したことはありませんが、これは私がそれをやろうと思う方法です:通常どおりにファームウェアプログラムの作成を開始しますデバイスが起動します。私の頭の中で、この小さなプログラムに必要な機能のいくつか:新しいプログラムをメモリ内の利用可能な場所にアップロードする機能、以前にアップロードされたプログラムを消去する、実行するプログラムを選択する機能( 1)そして、他のプログラムがどこにあるかを覚えてそこにジャンプできるように、何らかの種類のストレージデータ構造(成長可能なジャンプテーブル?)を持っています。UARTを介して相互作用を行うと、非常にシンプルなターミナルメニューが表示され、同じチャネルを介してファームウェアをアップロードできます。
マイクロコントローラへのプログラム方法(avrのフラッシュROMで焼き付けられた.hexプログラムなど)
それ自体を更新できる既存のブートローダーを持たない完全に空白のチップである場合、それを達成するために必要な技術を使用して説明したのと同じようにFLASHに書き込む必要があります(AVRの場合はICSP)。
これは決して「ブートローダー」とは何かを包括するものではありません。1つまたはシステムの目的に応じて、FLASHではなくRAM内の指定された場所にアップロードし、任意のメモリ位置で実行を開始するように設計できます。または、PCの起動時にロードするオペレーティングシステムを選択できるものが必要な場合もあります(たとえばgrubを参照)。8ビットマイクロコントローラー用のブートローダーは非常に単純な傾向があります。
Arduinoについてのメモ:このブートローダーは1つのプログラムを管理するだけで、シリアルポートを引き継いでファームウェアのアップロードなどを管理します。
「ブート」ローダーの概念は、ポンプの「呼び水」の概念に似ています。つまり、指定されたアドレスにプログラムをロードし、その指定されたアドレスでプログラムの実行を開始する「何か」が必要です。それがブートローダーです。最も単純な場合、ブートローダーはCPUの指定された開始アドレス(ゼロ、ほとんどの場合)に「表示」され、必要なメモリセグメントにプログラムをロードし、制御をそれに転送し、「消失」します。外観と消失は、「外部」ハードウェアによって制御されます。1つの可能な実装は、「ハードウェア」リセットによってアクティブ化され、「ソフトウェア」リセットによって非アクティブ化されるROMを使用することです。ROM内のローダーは、必要に応じて単純または複雑にすることができ、特定のCPUが理解できるバイナリ形式で記述する必要があります。ROMが使用するアドレススペースが不要な場合、ROMの非アクティブ化は必要ありません。明らかに、ROMの代わりにEEPROM、ePROM、フラッシュPROMなどを使用できます。