マイクロコントローラーのアプリケーションプログラムとは別にブートローダーが必要なのはなぜですか?


28

マイクロコントローラの同じフラッシュプログラムメモリ、特にブートローダと呼ばれるSTM32F103に別のプログラムが必要なのはなぜですか?

メインアプリケーションプログラムから分離するために特別なことは何ですか?

一般的に、マイクロプロセッサベースのシステム(PowerPC MPC8270など)のブートローダーは、マイクロコントローラー(ARM STM32F103など)と同じジョブを実行しますか、それとも互いに根本的に異なるジョブを実行しますが、両方とも「ブートローダー」と呼ばれます?


2
単一の巨大なモノリシック構造ではなく、個々のチップと部品を使用しているのと同じ理由
Emobe

あなたはしません。コンピューターコンソールのスイッチとライトを使用してプログラムを入力するだけです。
ホットリックス

1
厳密に言えば、マイクロコントローラー上に別のブートローダープログラムは必要ありません。ただし、ほとんどの場合、提供する追加のユーティリティ機能用に1つを選択します。これらの機能が必要ない場合や不要な場合は、ブートローダーを削除できます。マイクロコントローラーのブートローダーは通常、新しいプログラムをフラッシュに書き込むために使用されます。関数のデバッグに使用されることがあり、ブレークポイントやその他の便利な機能をサポートするものもあります。マイクロコンピューターでは、通常、ブートローダーは大容量メモリーからプログラムをロードし、そこで必要になります。
19:26のghellquist

回答:


55

マイクロコントローラーのブートローダーは、プログラミングヘッダー以外の通信チャネルを介してメインファームウェアを更新します。これは、BLE、UART、I2C、SDカード、USBなどでフィールドのファームウェアを更新するのに役立ちます。デバイスのファームウェアを更新するためだけにプログラマーを購入するよう顧客に要求することは非常に不便です。

ブートローダーが分離されている理由は、信頼性のためです。ブートローダーとアプリケーションコードはフラッシュの別々のセクションに配置されるため、ブートローダーコードに関連するものを変更することなく、ブートローダーによってアプリケーションコードを消去および書き換えることができます。

ブートローダーとアプリケーションが一緒に保持されている場合、ファームウェアを更新するとフラッシュ内のブートローダーコードが消去されるため、ブートローダーコードを実行する前にRAMにコピーする必要があります。RAMのブートローダーコードで電源が切断され、フラッシュが消去された場合、デバイスはブリックされます。


3
私たちも同じ理由です。それらは同じフラッシュ内にありますが、ブートローダーはフラッシュの消去境界に合わせられ、自身のアドレスよりも高いフラッシュのみを消去するのに十分なほどスマートです。
ジョシュア

3
場合によっては、製品のシャーシを分解せずにマイクロプロセッサのプログラミングヘッダーに実際にアクセスできないことがあるため、追加のハードウェアなしで通信バスを介して再プログラミングできることが信頼性の重要な要因です。
ジョンゴーソコ

6
@ alt-roseブートローダーとアプリケーションプログラムは別々にコンパイルされたプログラムであり、それぞれ独自のスタートアップコードとmain()機能を備えています。電源投入時に、ブートローダーの起動コードが実行され、ブートローダーのを呼び出しますmain()。ブートローダープログラムは、有効なアプリケーションプログラムをチェックし、アプリケーションプログラムのを呼び出すアプリケーションプログラムの起動コードにジャンプしますmain()。各プログラムのスタートアップコードは、各プログラムのCランタイム環境を初期化し(変数、スタックなどを初期化します)、通常、どちらのプログラムもmain()スタートアップコードに戻りません。
kkrambo

1
@ alt-rose:CPUがブートローダーの開始アドレスを取得するのと同じ方法で-取得しません。代わりに、CPUはブートローダーの開始アドレスとして使用するものを指定し、ブートローダーはアプリケーションプログラムの開始アドレスとして使用するものを指定します。
MSalters

4
@kkrambo一般的には真実ですが、ブートローダーをCまたはC派生言語で記述する必要はありません(普遍的に真実でもありません)main
ヤック

26
  1. 読み込みプロセスがエラーから回復できるようにします。アップグレード中に通信エラーまたは電源切断が発生したとします。ブートローダーがアップグレードするアプリケーションの一部である場合、ユーザーは特別なハードウェアを使用してブートローダーに再フラッシュすることなく再試行できません。

  2. 一部のマイクロコントローラーは、RAMからコードを実行できません。ブートローダーが他のソフトウェアと混在している場合、現在実行中のフラッシュのページを消去できないため、実際にソフトウェアをアップグレードすることはできません。回避策は、最初に新しいコードをフラッシュの後半に書き込み、それからジャンプします。新しいコードは、フラッシュの前半に自分自身をコピーします。もちろん、デメリットは、フラッシュの書き込みが通常遅いことであり、2回実行する必要があるため、ロードプロセスに最大2倍の時間がかかる場合があります。また、この回避策により、アプリケーションのサイズがフラッシュ全体の半分以下に制限されます。

  3. よく書かれたブートローダーは、デバイスを実行する前に、デバイスに有効なコードが存在することを確認しようとします。ブートローダーと他のコードが混在している場合、すべてのコードがロードされなかった場合に検証ルーチンが機能することをどのように確認できますか?

  4. 認証。セキュアブートローダーは、実行する前に、ロードされたアプリケーションがデジタル署名と一致することを確認しようとします。ただし、ブートローダーと他のコードが混在している場合、ユーザーが新しいコードを読み込むと起動時に何が起こるかを制御できないため、デバイス上で実行するものを制御できません。


4
ポイント2の例として、一部のマイクロコントローラーは起動時にアクセス可能なRAM さえ持っていない場合あります。たとえば、Raspberry PiはGPUを使用してSDカードからブートローダーをロードし、ARMプロセッサーとメモリを有効にします。
ErikF

11

通常、メインアプリケーションプログラムを更新できるようにするためにあります。

内部フラッシュの一部を消去および再プログラムする方法を知っているコードが必要です。それは、それ自体を消去すると再プログラムできないため、メインプログラムにはできません。


9

ブートローダーにより、MCUは他の何かと通信して、新しいプログラムを受け入れ、保存し、リセット後に実行できます。ブートローダーがない場合、メモリにアクセスしてプログラムを配置するためにプログラマが必要です。


2
それはほとんどそれです。MCUは、特別なプログラミングサブシステム(AVRICEやJTAGなど)を介して、またはフラッシュにブートローダーをすでに持っていることによってのみコードを取得できます。これは、ブートローダーの複雑さに関するアプリケーションの決定です。たとえば、一部のシステムはWiFiからコードをロードできます。ATTinyのような非常にローエンドのMCUでは、ブートローダー(およびシリアルピン)は大きなオーバーヘッドであるため、常にプログラマーを使用します。
リッチ

7

ブートローダーからメインファームウェアの再プログラミングを許可することに関する他の正解に加えて、ブートローダーを分離する別の利点は、実行時に必要なコードから「ブート時に1回実行」タスクを論理的に分離できることです。次に、ブートローダーが初期構成タスクを完了した後、メインファームウェアは、不要になったすべてのコードを使用してブートローダーをメモリから排除し、RAMスペースを大幅に節約できます。これを他の方法で実現することは可能ですが、ブートローダー/ファームウェアの分割により、多くのアーキテクチャではるかに簡単になります。


1
マイクロコントローラーでは、コードがRAMに置かれることはほとんどないため、削除することはできません。もちろん、ブートローダーのデータはRAMから破棄できます。
ベンフォイト

@BenVoigt、それはマイクロコントローラに依存します。一部(主にNORフラッシュを使用するもの)はフラッシュから直接実行できますが、その他(通常はより一般的になっているNANDフラッシュを使用する)はRAMから実行する必要があります。オンボードフラッシュさえない場合があり、実行するには、外部フラッシュチップからローカルSRAMにコードをコピーする必要があります。
ネイトS-モニカの復活

2

簡単な答えは、ソフトウェアが素晴らしいからです。

ブートローダーが行うすべてを「純粋なハードウェア」にすることができます。しかし、ブートローダーが行うタスクをソフトウェアとして作成し、ハードウェアで解釈する方がはるかに簡単です。

これらのタスクには、「実際の」ソフトウェアを実行するためのハードウェアのセットアップ(Raspberry Piで(@ErikFを介して)など)、実行前に「実際の」プログラムを置き換えるプロトコルが含まれます(ピンをチェックする場合、そのピンを設定してから実際のプログラムを再フラッシュする)、または「実際の」プログラムのソフトウェア環境を設定することもできます。

より小規模なソフトウェアでは、実行可能ファイルを実行すると、アプリケーションローダーはデータの一部をメモリにロードするなどの処理を行い、アドレスを修正したり、メインまたはその他のグローバルなものへの引数を設定したり、OSが提供するライブラリを起動したりします。その後、_mainコードの先頭にジャンプします。これらのことのいくつかは、ブートローダーによって実行できます。

マイクロコントローラーでは、ブートローダーが行うタスクの一部をプログラムに分割できます。プラットフォームのコンパイラは、すべての実行可能ファイルに「セットアップ」コードを自動的に挿入できます。

しかし、ブートローダーがプラットフォーム間の違いを「隠す」ことができるため、ブートローダーにそれを含めることは、同じコンパイラーが異なるハードウェアで動作する可能性があることを意味します。

さらに、メインプログラムをフラッシュしてもブートローダー(およびメインプログラムを再フラッシュする機能)を危険にさらすことはありません。そして、重要なブートローダーを用意することは非常に素晴らしいことです。


-1

カバーされていない答えの1つは、C言語の制限による懸念の分離の必要性です。

一般に、ブートローダーはアセンブリとCを組み合わせて作成され、アセンブリの非常に初期のブート段階で作成されます。

これは、次のような特定のものをセットアップするために行われます。

  • Cスタックの割り当て
  • スタックポインタをレジスタに読み込む
  • プログラムカウンタをレジスタに読み込む
  • リセットベクトルの宣言
  • 2番目のステージ(initramfs)をRAMにロードします。

これは実行された手順の非常に大まかな近似であり、ARMブートプロセスについて説明していますが、x86と他のアーキテクチャでは再び異なります。

ただし、基本的な理由は同じままです。Cスタックの割り当ては、アセンブリから行う必要があります。


なぜ下票なのですか?これは関連性があり正確です。
ビットシフト

-1

これまでに回答されていない質問の一部は、マイクロコントローラーとマイクロプロセッサーシステムのブートローダーの違いです。

マイクロコントローラー

ほとんどのマイクロコントローラには、プログラムコードを含むROMメモリが組み込まれています。このコードを変更するには、通常、マイクロコントローラーのプログラミングインターフェイス(たとえばATMegaのISP)に接続するプログラマーデバイスが必要です。ただし、これらのプログラミングインターフェイスは通常、他のインターフェイスと比較して、特定のコンテキストではすぐに利用できない可能性があるため、他のインターフェイスと比べて使用するのにあまり便利ではないことがよくあります。そのため、たとえば、ほとんどすべてのコンピューターはUSBポートを備えていますが、ISPに必要なSPIインターフェイスは非常にまれであり、ATXMegaで使用されるPIDインターフェイスなどの他のインターフェイスは専用のプログラミングハードウェアでのみサポートされます。

したがって、たとえば、外部ハードウェアなしで通常のコンピューターからソフトウェアを更新する場合は、異なる種類のインターフェース(RS232、USB、またはArduinoのようなUSB経由のRS232)から読み取るブートローダーを使用してデバイスをプログラムできます。共通のインターフェースを介して。

ただし、この機能が必要ない場合、ブートローダーは完全にオプションです。マイクロコントローラーは、ブートローダーなしでもコードを完全に実行できます。

マイクロプロセッサ

マイクロプロセッサでは、状況は少し異なります。ほとんどのマイクロプロセッサはブートローダーに十分な大きさのROMを備えていますが、これらのROMはOS全体を保持するのに十分な大きさではありません。そのため、ブートローダーの目的は、ハードウェアを初期化し、ブート可能なOSを探し、ロードして実行することです。そのため、ブートローダーはブートごとに重要です。

x86 / x64システムでは、このブートローダーはBIOSまたはUEFI(基本的にはBIOSの新しいバージョン)です。

チェーンで複数のブートローダーを実行している場合もあります。たとえば、WindowsとLinuxでデュアルブートシステムを使用している場合、次のようになる可能性があります。

  • BIOS / UEFIが起動し、インストールされているGRUBを見つけます。その後、GRUB(= Grand Unified Bootloader)をロードします
  • GRUBは、ある種のLinuxとWindowsブートローダーを検出します。ユーザーがWindowsブートローダーを選択します。
  • Windowsブートローダーが起動し、インストールされているWindows 7およびWindows 10を検出します。ユーザーはWindows 10を選択します。
  • Windows 10がようやく起動します。

したがって、この場合、ブートローダーと見なすことができるソフトウェアが3つありました。GRUBとWindowsブートローダーの両方は、BIOS / UEFIが提供するよりも便利なブート選択オプションをユーザーに提供するために主にあります。また、同じハードドライブまたは同じパーティションから複数のOSを起動することもできます。

TLDR

したがって、両方のシステムでブートローダーは似たようなことをしますが(ユーザーがブートするコードを選択するのに役立ちます)、どちらもその実現方法と正確な動作が大きく異なります。


RAMからコードを実行する必要があるプログラムとプログラム全体を保持するのに十分なランダムアクセス不揮発性ストレージ(ROMまたはフラッシュ)を備えたシステムを区別することは有用ですが、両方のタイプのマイクロコントローラーと両方のタイプのマイクロプロセッサーがあります。
スーパーキャット

もちろん、マイクロコントローラーとマイクロプロセッサーの違いは明確な境界ではなく、一部のマイクロコントローラーはマイクロプロセッサーのように動作し、その逆も同様です。AtMega / Arduinoとx86 / x64を例として取り上げた理由は、これらがそのように動作するためです。
ダッカロン

「マイクロプロセッサは、ブートローダーに十分な大きさのROMを備えています... x86 / x64システムでは、このブートローダーはBIOSまたはUEFIのいずれかです」いいえ。BIOSまたはUEFIはオフチップフラッシュメモリに保存されます。オンチップROMは、マイクロコードの初期化など、さらに低いレベルの機能用です。
ベンフォークト

@Dakkaron:マイクロプロセッサとマイクロコントローラの間には、チップがアドレスバス上で他に何もせずに重要な目的に使用できるように設計されているかどうかに基づいて線を引きます。8031は資格ない以外されていない(確かにマイクロコントローラである)、それは機能8051であることを指定された)内部ROMに有用なものを有するものとして、それ以外は完全に内部ストレージから使用できるように設計されます。RCA / CDP 1802のようなものは、LED名札を駆動するために使用できるとしても資格がありません...
supercat

... RAMなし/ ROMなしの設計は簡単なタスクに限定されるため、外部RAMとROMはありません。ただし、TMS 32050のようなものは、もし思い出すと、ブートローダーと、数千ワードの16ビットワードのRAMを内部に持っていると、マイクロコントローラーとして認定されます。多くのアプリケーションはより多くのRAMを追加する必要がありますが、UARTを介して別のシステムに接続すると、メモリバスに何もせずに多くの目的を果たすことができます。
スーパーキャット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.