4

フラッシュの整合性についてcrc16チェックを実行する必要があるファームウェアプロジェクトに取り組んでいます。

crcは、IAR Xlinkリンカーを使用して計算され、フラッシュの最後に保持されます。この場合も、crcは実行時にコードから計算され、フラッシュに保存されている値と比較されて整合性がチェックされます。ただし、crcはフラッシュメモリのコードセグメントでしか計算できません。コードに変更を加えるたびに、サイズが変わる可能性があります。現在手動で行っているこのプロセスを自動化できますか?

.xclリンカーファイルから:

// ---------------------------------------------------------
// CRC16 Essentials: -H for fill,-J for checksum calculation
// ---------------------------------------------------------

-HFF         

-J2,crc16,,,CHECKSUM2,2=(CODE)5C00-FF7F;(CODE)10000-0x20A13

ここで、2番目のコードセグメントの終了値を変更する必要があります。これは現在0x20A13です。この値は、.mapファイルから取得します。つまり、コードがフラッシュ内に存在するメモリ範囲の量を取得します。これは私が行う最初の変更です。

ここで私はコードから2番目の変更を加える必要があります:

  sum = fast_crc16(sum, 0x5C00, 0xFF7F-0x5C00+1);

  sum = fast_crc16(sum, 0x10000,0x20A13-0x10000+1); 

  //Check the crc16 values 
   if(sum != __checksum)
   {
    // Action to be taken if checksum doesn't match
   }

このプロセスの自動化にご協力ください!!

4

2 に答える 2

2

IAR EW430 の [ヘルプ] メニューからアクセスできる「C/C++ コンパイラ リファレンス ガイド」で説明されている IARの__segment_beginand__segment_sizeまたは組み込み関数を使用してみてください。__segment_endマニュアルには、リンカーファイルで定義されたセグメントで動作すると書かれており、インターネット上の多くの人がそのように使用しているようですが、試してみるとコンパイラエラーが発生しました (IAR EW430 5.40.7)。それが何らかの形で壊れている場合は、IAR に報告して修正してもらいたいと思うかもしれません (サポート契約を結んでいる場合)。

次のように使用できます。

sum = fast_crc16(sum, __segment_begin("CODE"), __segment_size("CODE"));

分割セグメントで何が起こるかわかりません。しかし、なぜチェックサムの計算からリセット ベクターを除外するのでしょうか? CODE の最初から最後まで行って、リセット ベクターを含めることができます。

コードを次のように構成できると思います。

sum = fast_crc16(sum, __segment_begin("CODE"), (char *)__segment_begin("INTVEC") - (char *)__segment_begin("CODE") + 1);

sum = fast_crc16(sum, 0x10000, (char *)__segment_end("CODE") - 0x10000);

__checksumまた、変数がメモリに収まる場所に配置されることに気づいているかもしれませんし、気づいていないかもしれません。DATA16_IDチェックサムコードの範囲のちょうど真ん中にあるセグメントの後に潜んでいることがわかりました.チェックサム計算のためにメモリのセクションをスキップすることを自動化する方法を知りませんでした. 私がしたことは__checksum、最初の 2 バイトのセグメントを定義してそこに配置することにより、フラッシュの最初の 2 バイトに強制されました。

編集:最初の変更を逃しました。IAR リンカ チェックサム ルーチンの範囲を手動で調整している場合、コンパイラからセグメント組み込み関数を使用できるようにするには、リンカでコードの最後を使用するカスタム セグメントを定義する必要があります。

それを自動化する方法があるかどうかはわかりません。コードの末尾を取得するには、セグメントを無制限にしてコードを 2 回 (うーん) 1 回コンパイルし、スクリプトを使用してコードの末尾を抽出し、リンカー スクリプトを更新する必要がある場合があります。おそらく、ビルド前のコマンド ライン イベントで初期ビルドを実行し、無制限のリンカー ファイルを使用して IAR プロジェクトをビルドするだけで済みます。しかし、それはかなり醜いようです。

于 2012-08-23T11:22:14.367 に答える
2

おそらく、ソリューションを変更して、使用済み部分だけでなく、アプリケーション用に予約された完全なフラッシュ上に CRC を構築することもできます。

そうすれば、リンカー ファイルや C コードを変更する必要がなくなり、ブートローダーでさえ、アプリケーションの実際のサイズを知らなくても crc を計算できます。

于 2012-08-24T11:04:13.667 に答える