カスタマーサポートセンター

FAQ~よくある質問~ | FAQマスタ詳細表示

FAQ詳細情報

ID 10810606
FAQカテゴリ(大) リンカ
最終更新日 2016-03-21

質問内容

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

回答内容

ーゲット:ARM、RH850、RX、SH、STM8
コンポーネント:一般
公開日:2013年9月6日午前12時52分

 

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

 

メモリの最後に置く
Technical note 65473 でカバーされています。

 

アプリケーションの開始より前に置く

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

サンプルプロジェクト 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つの範囲) のサンプルプロジェクト
サンプルプロジェクト (1 range, 3 diff. locations) は、IELFTOOLが生成する CRCの計算結果と同じ計算結果を出す、実際の C ソースファイルを含んでいます。これは、ILINK/IELFTOOL の設定と、メモリの指定された場所に CHECKSUMセクション配置する修正した icf ファイルを含みます。

サンプルプロジェクト (1 range, 3 diff. locations) には、 それぞれ違った方法でチェックサムを置く、3つのビルド構成が含まれています。
• ROMの一番最後置く (ビルド構成 PlaceEndOfROM).
• アプリケーションコードの開始より前に置く (ビルド構成 PlaceInFirstBlock).
• アプリケーションコードの終了より後に置く (ビルド構成 PlaceInLastBlock).

checksum-start と checksum-end を使用する代替案
通常の、チェックサム計算を行う方法は、
プロジェクトメニュー > オプション > リンカ > チェックサムタブ
を開き、□未使用のコードメモリをフィルする
にチェックを入れ、フィルパターンとアドレス範囲 (開始、終了アドレス)を指定し、さらに、チェックサム生成にチェックを入れます。
このダイヤログでは開始アドレスと終了アドレスをアプリケーションに合わせて設定する必要があり、不便です。
開始アドレスは通常固定ですが、終了アドレスはそのたびに合わせなくてはなりません。この代替案では、特別なシンボル (checksum_start and checksum_end) を用いてこの不便さを克服しようとするものです。

サンプルプロジェクト (checksum-start と checksum-end を使用する代替案) と (1 range, 3 diff. locations のビルド構成 PlaceInLastBlock) との主な違いは、
• プロジェクトメニュー > オプション > リンカ > チェックサムタブの
□未使用コードメモリをフィルするにチェックが入っていない。
• 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};

// 最後のバイトは checksum area end mark です。
// start と end marker にはどんな値を設定してもかまいません。
// キーワード __root はソースファイルがこれらのシンボルを参照していない時に必要です。


• リンカ設定ファイルに 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 };


• The 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 には割り込みベクタが含まれていません。割り込みベクタは、通常 0番地に place at ディレクティブを使用して配置されます。 割り込みベクタをチェックサム計算に含ませるには ielftool コマンドラインの、 オプション --fill と option --checksum の checksum_start を 0x0 で置き換えます。 

 

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

参考資料URL