2011-11-03 10 views
14

カスタムCortex-M3ベースのデバイスで作業しています.JTAGなしでデバイスファームウェアをアップデートできるように、IAP(In-Application Programming)メカニズムを実装する必要があります(代わりにTFTPまたはHTTPを使用します)。 )。 STマイクロエレクトロニクスから入手可能なIAP関連のコード例は私にとってははっきりしていますが、再点滅がどのように機能するかはわかりません。ARM(Cortex M3)のアプリケーション内プログラミングはどのように機能しますか?

私が理解する限り、命令はフラッシュからICodeバス(およびプリフェッチブロック)を介してCPUによってフェッチされます。だから、私はかなり愚かな質問です:それはそれ自体が再フラッシュ(すなわち、それが実行されているフラッシュメモリを変更)中に実行中のプログラムが壊れてしまうのはなぜですか?

答えて

9

一般的な解決策は、実際の点滅しているプログラムが保存されているフラッシュ内に小さな予約領域を設けることです。新しいファームウェアがダウンロードされたら、このエリアのコードにジャンプしてください。

もちろん、この小さな領域はファームウェアをフラッシュするときに上書きされません。他の手段(JTAGなど)でしか実行できません。だから、この点滅しているプログラムがうまく動作することを確認してください。 :)

+0

ああ...そうですね、私はコードを勉強している間にその部分を逃しました! –

+1

はい、多くのデバイスでは、実際にフラッシュをプログラミングしている間にRAMから実際に実行する必要があるため、プログラミングコードの短いブロックをRAMにコピーして、実際のプログラミングを実行する必要があります。フラッシュの予約された部分のコード。 –

+0

考慮する必要のある多くの障害シナリオがあります。そうしないと、システムが壊れてしまう可能性があります。IAPはf/w開発の礎石であり、特に損失の多いネットワーク上ではそれを行うのが難しい場合があります。 – Amit

6

私はSTM実装に精通していませんが、NXPチップでは、IAPルーチンはユーザーコードでは消去できない別の予約ROM領域に格納されています。

HWレジスタを直接使用してフラッシュ書き込みコードを実装する場合は、実行中のセクタに触れないようにするか、RAMから実行するかを確認する必要があります。

1

今や、IAPをサポートする多くのマイクロコントローラが、同じフラッシュでプログラムの実行中にフラッシュメモリをプログラムすることが可能です。

IAPの場合、フラッシュ内のプログラムメモリは、実行可能な1つの実行可能ファイル&の2つの部分に分割できます。

一般に、ファームウェアのバージョンが0.01であるJTAGを介してフラッシュメモリを場所(例:part-1)にプログラムします。 IAPの場合、コードが実行されている間に別の部分(パート2)にフラッシュをプログラムすると、対応するAPIがファームウェアバージョン0.01で提供され、フラッシュ部分2をプログラムするのに役立ちます。 0.02として更新されました。プロセッサが再起動すると、初期化時にファームウェアのバージョンを確認して最新のファームウェアにジャンプします。

ファームウェアが実行されている部分を実行可能部分といい、その他はバックアップです。なぜそれがバックアップと呼ばれるのか、プログラミング中にファームウェアの破損が存在すると、ファームウェアのバージョンが&を再起動しない場合、プログラム制御は自動的にバージョン番号の確認後にバックアップファームウェアにジャンプします。

0

カスタマイズしたブートローダを使用することもできます。ただし、STM IAPはFlashに保存されないため、自己で上書きすることはできません。一般的に人々が行うことは、フラッシュを2つの部分に分け、1つはカスタム作成のブートローダ用に予約され、もう1つはアプリケーション用です。ブートローダは、割り当てられた領域に書き込まないようにします。ブートローダーはJTAGを介してプログラムすることができ、後でアプリケーションはブートローダーを利用してプログラムすることができます。

関連する問題