ielftoolのチェックサム - NXPのLPCデバイス使用時
テクニカル・ノート 52619
アーキテクチャ:
ARM
コンポーネント:
general
更新日:
2018/08/13 7:55
はじめに
本テクニカルノートでは、一部のNXP LPCデバイスで必要とされる、ベクタテーブルの「特殊な」チェックサムについて説明します。
NXP LPCデバイスに関する注意事項
NXP LPCデバイスでは、特定のアドレス(ベクタテーブル)に特殊なチェックサムを配置する必要があります。IAR Embedded Workbench for ARMでは、このチェックサムが自動的に計算されて配置されます。このとき、ベクタテーブルに格納されている特殊なチェックサムが、カスタムのCRCチェックサムの計算に含まれないようにしなければなりません。
問題1 - ielftoolのエラーが発生する
ビルド時に以下のエラーが発生する場合があります。
ielftool error: Checksums have dependencies
このエラーは、同じielftoolコマンドでベクタテーブルのチェックサムとアプリケーションのチェックサムが同時に計算されたときに発生します。
解決方法1 - ベクタテーブルを除外する
この解決方法では、アプリケーションのチェックサムの計算からベクタテーブルを除外します。これは、計算開始アドレスをベクタテーブルの直後のアドレスに設定することで実現します。
リンカ(Linker) > チェックサム(Checksum) > 開始アドレス(Start address)を0x0から0x40に変更します。
(.mapファイルをチェックして、.intvecセクションの終了アドレスを確認してください)
問題2 - チェックサムの計算にベクタテーブルを含める必要がある
アプリケーションのチェックサムの計算にベクタテーブルも含める必要がある場合、「解決方法1」ではベクタテーブルが除外されてしまいます。
解決方法2 - ポストビルドコマンドラインを使用する
ポストビルドコマンドラインを使用すれば、2つのチェックサムを別々のielftoolコマンドで計算させることができます。これにより、依存関係によってielftoolのエラーが発生するのを防ぐことができるとともに、開始アドレスとして0x0を使用できます。
- リンカ(Linker) > チェックサム(Checksum) > 未使用コードメモリをフィルする(Fill unused code memory)の選択を解除します。
- リンカ(Linker) > 追加オプション(Extra Options) > コマンドラインオプションの使用(Use command line options)に、以下の記述を追加します。
--place_holder __checksum,2,.checksum,1 --define_symbol __checksum_begin=0x0 --define_symbol __checksum_end=0xfffb
- ビルドアクション(Build Actions) > ポストビルドコマンドライン(Post-build command line)を以下のように設定します。
ielftool --fill 0xFF;0x0-0xfffb --checksum __checksum:2,crc16,0x0;0x0-0xfffb --verbose "$TARGET_PATH$" "$TARGET_PATH$"
問題3 - バイナリファイルにチェックサムが含まれない
出力コンバータ(Output Converter) > 出力(Output) > 追加出力ファイルを生成(Generate additional output) > 出力フォーマット(Output format)でバイナリ(binary)が設定されているにもかかわらず、生成されたバイナリファイルにアプリケーションのチェックサムが含まれていない場合があります。
これは、このバイナリファイルが、リンク後かつポストビルドアクション前(ポストビルドアクションによってチェックサムが計算される前)に生成されたためです。
解決方法3 - ポストビルドコマンドラインで.batファイルを使用する
この問題を解決するには、チェックサムを計算してから追加の出力を生成する.batファイルをポストビルドコマンドラインで呼び出すようにします。
サンプルプロジェクトIAR Embedded Workbench for ARM - Example (LPC device).zipを参照してください。
注:
このサンプルプロジェクトは、「Example (1 range, 3 diff. locations)」というサンプルをベースにして、PlaceEndOfROMが設定されたものです。ielftoolのエラーが発生するように、ターゲットがLPC1768に変更されていますが、チェックサムを計算するアドレス範囲は、オリジナルのサンプルプロジェクトと同じになっています。
説明:
- ビルドアクション(Build Actions) > ポストビルドコマンドライン(Post-build command line)を以下のように設定します。
$PROJ_DIR$\post-build.bat "$TARGET_BPATH$"
- プロジェクトフォルダに、以下の内容が記述されたpost-build.batファイルを作成します。
set OUT=%1.out set HEX=%1.hex set BIN=%1.bin :: calculate application checksum ielftool --fill 0xFF;0x0-0xfffb --checksum __checksum:2,crc16,0x0;0x0-0xfffb --verbose %OUT% %OUT% :: generate additional output: hex ielftool.exe --ihex --verbose %OUT% %HEX% :: generate additional output: binary ielftool.exe --bin --verbose %OUT% %BIN%
全ての製品名は、それぞれの所有者の商標または登録商標です。