IELFTOOL Checksum - チェックサムの配置

テクニカル・ノート 62709

アーキテクチャ:

ARM, RH850, RX, SH, STM8

コンポーネント:

general

更新日:

2018/01/10 6:24

はじめに

このテクニカルノートは、チェックサムの配置について説明します。

メモリの最後に配置

テクニカルノート65473でカバーされています。

アプリケーションコードの開始前に配置

define block CHECKSUM { ro section .checksum };
place in ROM_region { ro, first block CHECKSUM };

サンプルプロジェクト(ARM用IAR Embedded Workbenchで作成)Example (1 range, 3 diff. locations).zipでは、ビルド構成 'PlaceInFirstBlock'を使用してください。開始アドレスは0x84で、終了アドレスは0xFFFFです。

注意:

開始アドレスは割り込みベクターとチェックサムの後にあります。この場合、チェックサム計算は割り込みベクターを含みません。 (通常割り込みベクターは 0番地に置かれ、配置に特別な place at ディレクティブが使用されます)

アプリケーションコードの終了後に配置

define block CHECKSUM { ro section .checksum };
place in ROM_region { ro, last block CHECKSUM };

サンプルプロジェクト'Example(1 range、3 diff locations)'のビルド構成 'PlaceInLastBlock'では、開始アドレスは0x0、終了アドレスは0x296Bです。開発中の実際のアプリケーションの終了アドレスはビルドのたびに異なるため、終了アドレスを頻繁に変更するのは面倒です。プロジェクトのリリース段階でこの設定を使用することをお勧めします。注:この不便さを克服するには、checksum-startとchecksum-endを使用する代替ソリューションを検討してください。

通常(1つの範囲)の例

'Example(1 range、3 diff locations)'(上記リンク)には、CRC計算でIELFTOOLが生成するのと同じチェックサム値を計算するための実際の汎用Cソースが含まれています。また、ILINK / IELFTOOLのIAR Embedded Workbench設定と、メモリ内の指定された場所にCHECKSUMセクションを配置するための変更された.icfファイルも含まれています。

サンプルプロジェクト'Example (1 range, 3 diff. locations)'には3つのIAR Embedded Workbenchプロジェクト設定があり、チェックサムは3つの異なる方法で配置されていますが、

  • ROMの最後に配置(ビルド構成 PlaceEndOfROM)
  • アプリケーションコードの開始前に配置(ビルド構成 PlaceInFirstBlock)
  • アプリケーションコードの終了後に配置(ビルド構成 PlaceInLastBlock)

checksum-start と checksum-end マーカーを使用する代替ソリューション

チェックサム計算の通常の手順は、 "オプション> リンカ> チェックサム"ダイアログを開き、 "未使用メモリをフィルする"を有効にし、フィルパターンを指定し、アドレス範囲(開始アドレス、終了アドレス)を指定します。次に”チェックサム”生成を有効にしてアルゴリズムを指定します。

このダイアログを使用することの不便さは、開始アドレスと終了アドレスをアプリケーションに合わせて調整する必要があることです。

開始アドレスは通常固定ですが、終了アドレスは時々調整する必要があります。この代替ソリューションは、特別なシンボル(checksum_startとchecksum_end)を使用することでこの不都合を克服しようとしています。

' Example(1 range、3 diff。locations)ビルド構成 PlaceInLastBlock ' 例(代替ソリューション).zipの主な違いはのとおりです。

  • メニュー "プロジェクト>オプション...>リンカ>チェックサム>"未使用コードメモリをフィルする "選択されていません。
  • C/C++ソースには、checksum-start と checksum-end マーカが追加されています。
__root const unsigned char checksum_start @ "checksum_start_mark" = 0;
__root const unsigned char checksum_end[4] @ "checksum_end_mark" = {0,0,0,0xEE};

// The last byte is the actual "checksum area end mark"
// Any values can be assigned to the start and end markers.
// The keyword __root is only needed if the source is not referencing these symbols.
  • リンカ設定ファイルに ROM-block with fixed order を追加します。
define block ROM_CONTENT with fixed order
{
readonly section checksum_start_mark,
readonly,
readonly section checksum_end_mark,
readonly section checksum
};
place in ROM_region { block ROM_CONTENT };
  • C/C ++ソースは、extern宣言を使用してチェックサム値を参照します。
    extern const unsigned short ielftool_checksum;
  • "プロジェクト>オプション>リンカ>追加オプション>コマンドラインオプションの使用" で チェックサムシンボルのスペースを作成/確保するための--place_holderとシンボルが含まれることを保証するための--keep を追加します。
    --place_holder ielftool_checksum,2,checksum,4
    --keep = ielftool_checksum
  • "プロジェクト>オプション>ビルドアクション>ポストビルドコマンドライン"で、ielftoolコマンドを追加します。
    ielftool --fill 0xFF;checksum_start-checksum_end+3 
    --checksum ielftool_checksum:2,crc16,0x0;checksum_start-checksum_end+3
    --verbose "$ TARGET_PATH $" "$ TARGET_PATH $"
    注意:

ブロックROM_CONTENTには割り込みベクタが含まれません。割込みベクタは通常はアドレス0x0に配置され、配置にはplace atディレクティブが使用されます。チェックサム計算に割り込みベクタを含めるには、オプション--fillとオプション--checksumの両方について、ielftoolコマンドラインで "checksum_start"を0x0に置き換えます。

 

全ての製品名は、それぞれの所有者の商標または登録商標です

申し訳ございませんが、弊社サイトではInternet Explorerをサポートしていません。サイトをより快適にご利用いただくために、Chrome、Edge、Firefoxなどの最新ブラウザをお使いいただきますようお願いいたします。