こんにちは、私は内部メモリを使用してOTA機能に取り組んでいます。私のカスタムボードは KW45B41Z-EVKよりもメモリが小さいため、メモリセクションを再構成する必要があります。
「otap_client_att_bm」デモは3つの変更のみで使用しています。
1.内部メモリを使用するようにgAppOtaExternalStorage_cフラグを変更しました。
2.メモリ分割を変更し、より具体的には「PROGRAM_FLASH」のサイズを縮小しました。
また、OTAP ダンプ アドレス "INT_STORAGE" のサイズと開始アドレスを縮小しました。
実験1:
実験2:
私は次のSDKを使用しました。
すべての実験は評価ボードで行いました。
私のOTAアプリケーションは、デフォルトの場所、0x7a000「INT_STORAGE」(sb3ファイルを受信して保存するためのメモリセクション)を使用すると正常に動作します。ただし、「INT_STORAGE」を下位のアドレスに変更すると、OTAPプロセスによって新しく定義された「INT_STORAGE」の内容が消去され、新しいsb3イメージが消去されるようです。
これを確認するために、下の画像に示すように、"INT_STORAGE" を 0x7a000 から 0x76000 に 2 セクター変更しました。
OTAPを開始する前は、次の図に示すように、ダンプアドレス「INT_STORAGE」は空です。
次に、OTAPを開始し、「OTA_SetNewImageFlagWithOffset」機能にブレークポイントを設定します。これは、この機能に入ると画像の転送が完了するためです。この時点で、sb3イメージが新しいダンプアドレス(0x76000)に保存されていることがわかります(下の画像を参照)。
OTAPシーケンスが終了すると、つまりデバイスが再起動すると、デバイスは機能しなくなります。開始アドレスのメモリがこれを説明しています。下の画像を参照してください。新しいアプリケーションは、アドレス0xb0までのみ作成されます。
新しいダンプアドレス「INT_STORAGE」(0x76000)を見ると、それもクリアされています。
ただし、デフォルトのダンプアドレス(0x7a000)を見ると、データはまだ保持されています。
さらに、デフォルトの「INT_STORAGE」(0x7a000)の内容と、オフセット0x4000で送信したsb3ファイルの内容、つまり再起動前にアドレス0x7a000に書き込まれた内容を比較すると、完全に一致していることがわかります。
これにより、sb3 イメージの最初の 16kB または 0x4000 バイトは OTAP プロセスの再起動中に消去されるため、sb3 ファイルの処理に失敗していると私は考えています。
私は同じ実験を行いましたが、ダンプアドレスを反対方向、つまり1セクター上(0x80000)に移動しました。この実験中、OTA は成功しますが、メモリでも同じ動作が観察されます。デフォルトの「PROGRAM_FLASH」セクション、つまり 0x00 -> 0x7a000 が消去されます。次のスクリーンショットは、OTAP初期化前のデバイスのメモリを示しており、デフォルトの「INT_STORAGE」が変更されていないことを示しています。
その後、前回と同じ OTAP シーケンスを続行し、同じ場所でブレークします。この時点で、デフォルトの「INT_STORAGE」アドレスのメモリは、イメージ受信前と同じです。
ただし、新しいダンプ アドレス (0x80000) のメモリは sb3 ファイルの開始を示しています。
また、OTAP はリブート後に新しいイメージを正常に起動します。
これらの 2 つの実験から、"PROGRAM_FLASH" セクションの消去はアクティブ メモリ構成を考慮しておらず、既定のメモリ分割を厳密に考慮しているという結論に至ります。これは、メモリ分割が完全にオプションであるため、奇妙で望ましくない動作のようです。sb3イメージの一部を削除する消去操作のアドレス指定に関する修正はありますか?それとも、問題を調査するために、OTAブートローダーのソースコードを提供できますか?
sb3ファイルの生成で問題が見つかりました。
デフォルトでは、Over The Air Programmingツールは、アドレス「0x00」からsb3ファイルに消去コマンドを「0x7a000」のサイズで設定し、「0x76000」に保存されているsb3ファイルの一部を効果的に消去します。
この行を有効にし、サイズを目的の値である「PROGRAM_FLASH」に変更すると、問題は修正されました。