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を使用できます。

  1. リンカ(Linker) > チェックサム(Checksum) > 未使用コードメモリをフィルする(Fill unused code memory)の選択を解除します。
  2. リンカ(Linker) > 追加オプション(Extra Options) > コマンドラインオプションの使用(Use command line options)に、以下の記述を追加します。
    --place_holder __checksum,2,.checksum,1
    --define_symbol __checksum_begin=0x0
    --define_symbol __checksum_end=0xfffb
  3. ビルドアクション(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に変更されていますが、チェックサムを計算するアドレス範囲は、オリジナルのサンプルプロジェクトと同じになっています。

説明:

  1. ビルドアクション(Build Actions) > ポストビルドコマンドライン(Post-build command line)を以下のように設定します。
    $PROJ_DIR$\post-build.bat "$TARGET_BPATH$"
  2. プロジェクトフォルダに、以下の内容が記述された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%

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

 

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