いくつかの本当に賢いコードで、ブートローダーを悪用して自分自身を上書きすることが可能です。
抜粋:
ソリューションは、実際には概念的にはかなり単純です。ブートローダーは、その性質上、新しいファームウェアをデバイスにダウンロードするように設計されています。したがって、少なくとも1つのspm命令が含まれます。spm構成レジスタは、spm命令の4サイクル以内に書き込む必要があるため、実際に発生するシーケンスは非常に少ないことを意味します。sts、spm、またはout、spmシーケンスのみです。したがって、必要なのは、ブートローダーセクションでシーケンスを見つけることだけです。適切なレジスタを設定して呼び出します。
しかし、それにも大きな問題があることがわかりました。V-USBセルフプログラミングブートローダーのspm命令は、きちんとした小さなルーチンではありませんが、メインコードにインライン化されています。したがって、それを呼び出すと、残りのV-USBブートローダーを実行しようとしたときにAVRがクラッシュします。
厄介ですが、解決策があります。CPU周波数でクロックされるタイマー(AVRでは簡単です)を使用して、ブートローダーのout、spmシーケンス用のレジスターをセットアップするルーチンをアセンブラーで作成できます。それを呼び出して、spm自体の最初のサイクルが実行された瞬間に、タイマー割り込みがオフになり、AVRが(アプリケーション空間で)割り込みルーチンにジャンプするはずです。割り込みルーチンは、ブートローダーアドレスをポップしてから、前のコードに戻ります。これは、出力、spmシーケンスをセットアップするルーチンです。ブートローダーセクションにspm命令を適用すると、完了するまでCPUが停止するため、これは機能するはずです。
したがって、基本的には、豪華なプログラミングを行って、ブートローダーにそれ自体をホースさせ、専用のプログラマーがなければMCUを役に立たなくすることができます。