Q2あなたの質問について何か付け加えたいと思います。
Q2:ブートローダーがアプリケーションをRAMにコピーしてから、RAMからアプリケーションを実行する必要があるのはなぜですか?アプリケーションをFLASHから実行すると、どのような問題が発生しますか?
それは、SPIまたは同様のシリアル外部コードメモリを持っていることだけではありません(とにかくそれほど頻繁ではありません)。
通常の高速パラレルバスに接続された外部ROM/FLASH / EPROM /でさえ、外部メモリアクセス時間のために比較的遅いMCUでもシステムが最大クロック(ゼロ待機状態)で動作するのを防ぎます。100MHzクロックには10nsのFLASHアクセス時間が必要ですが、これを取得するのはそれほど簡単ではありません(経済的に可能であれば)。そして、あなたは100MHzがもはやそのような脳の回転速度ではないことに同意するでしょう:-)
そのため、多くのMCU / CPUアーキテクチャは、乗算命令を一度に読み取る、内部キャッシュを使用する、または低速の外部コードメモリを補うために必要なことをすべて実行するというトリックを実行しています。ほとんどの古い8ビットアーキテクチャのみが、フラッシュメモリから直接コードを実行できます(「インプレース」)。
コードメモリが内部フラッシュだけだったとしても、それを高速化するために何かをする必要があります。この記事を例にとってみましょう。
http://www.iqmagazineonline.com/magazine/pdf/v_3_2_pdf/pg14-15-18-19-9Q6Phillips-Z.pdf
ARM7がMAM(Memory Accelerator Module)と呼ばれるものをどのように組み込んだかを説明しています。これは良い読み物であり、特定のARM7アーキテクチャのコードメモリアクセスを高速化するためのいくつかの手段があります(他のほとんどの場合に使用されます)。
- 最大クロック周波数を制限します(記事の例では80MHzから約20MHzまで)
- フラッシュアクセス中に待機サイクルを挿入する
- 命令キャッシュを使用する
- プログラムコードをフラッシュからRAMにコピーします
明らかに、命令キャッシュがオプションではなかった場合(小さすぎる、またはクロックが高すぎる)、起動時にコードを再配置した後、RAMからの実行のみが実際に残されます。
リンカに指定できるRAMからコードの特定のセクションのみを実行するオプションもあります。DSP(Digital System Processing)システムの場合、EPROM / FLASHから実行するオプションは、今では言うまでもなく、クロックが数十MHz程度の昔でも実際にはありませんでした。
もう1つの問題はデバッグです。ROMまたはFlashに配置されたコードをデバッグするためのオプションは非常に限られています(ほとんどのシステムでブレークポイントを設定できるようにするには、コードのセクションをRAMに移動する必要があります)。