IELFTOOL Checksum - 複数の領域のチェックサム

テクニカル・ノート 53274

アーキテクチャ:

ARM, RH850, RX, SH, STM8

コンポーネント:

general

更新日:

2019/05/16 9:13

はじめに

チェックサムの計算対象が複数の範囲にわたる場合があります。複数の範囲のチェックサムを計算する場合、以下の点に注意してください。

  • GUIは1つの範囲しか受け付けないため、チェックサムオプションをオフにする必要があります。さらに、
    • プロジェクト(Project) > オプション(Options...) > リンカ(Linker) > 追加オプション(Extra options)でコマンドラインオプションを入力します
    • ビルドアクション(build actions) > ポストビルドコマンドライン(post build command line)でコマンドラインオプションを入力します
  • このとき、(アプリケーションにおける)計算では、アドレスが最も低い範囲から計算を行い、アドレスが高い方に向かって順次計算するようにしてください。
  • (アプリケーションにおける)計算では、(GUIによって定義された)チェックサムシンボルを使用できません。そのため、アプリケーション内で正しい範囲が使用されるように工夫する必要があります。

2つの範囲 - 2つのチェックサム値

次のプロジェクトサンプルを参照してください: Two ranges two checksums 650.zip

1番目の範囲が0x1006000~0x102FFFBで、2番目の範囲が0x1030000~0x103EFFBであるとします。

このとき、3つの変更が必要になります。

  1. プロジェクト(Project) > オプション(Options...) > リンカ(Linker) > 追加オプション(Extra options)で、IAR ILINKリンカに関する変更を行います。
    以下の記述を追加します。
    --place_holder __checksum1,2,.checksum1,1
    --place_holder __checksum2,2,.checksum2,1
    --define_symbol __checksum_begin1=0x1006000
    --define_symbol __checksum_end1=0x102FFFB
    --define_symbol __checksum_begin2=0x1030000
    --define_symbol __checksum_end2=0x103EFFB
  2. ポストビルドコマンドラインを使用して、チェックサムを計算します。プロジェクト(Project) > オプション(Options...) > ビルドアクション(Build Actions) > ポストビルドコマンドライン(Post-build command line)を以下のように設定します。
    ielftool --fill 0xFF;0x1006000-0x102FFFB --fill 0xFF;0x1030000-0x103EFFB
    --checksum __checksum1:2,crc16,0x0;0x1006000-0x102FFFB
    --checksum __checksum2:2,crc16,0x0;0x1030000-0x103EFFB
    --verbose "$TARGET_PATH$" "$TARGET_PATH$"
  3. .icfファイルで、メモリ範囲を定義するとともに、チェックサムをどこに配置するかを定義します。
    define symbol __ICFEDIT_region_ROM_start__ = 0x1006000;
    define symbol __ICFEDIT_region_ROM_end__ = 0x102FFFF;
    
    define symbol __ICFEDIT_region_PFM_start__ = 0x1030000;
    define symbol __ICFEDIT_region_PFM_end__ = 0x103EFFF;
    
    define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__
    to __ICFEDIT_region_ROM_end__];
    
    define region PFM_region = mem:[from __ICFEDIT_region_PFM_start__
    to __ICFEDIT_region_PFM_end__];
    
    place at end of ROM_region { readonly section .checksum1 };
    place at end of PFM_region { readonly section .checksum2 };

2つの範囲 - 1つのチェックサム値

次のプロジェクトサンプルを参照してください: Two ranges one checksum 650.zip

1番目の範囲が0x1006000~0x102FFFBで、2番目の範囲が0x1030000~0x0x103EFFFであるとします。

このとき、3つの変更が必要になります。

  1. プロジェクト(Project) > オプション(Options...) > リンカ(Linker) > 追加オプション(Extra options)で、IAR ILINKリンカに関する変更を行います。
    以下の記述を追加します。
    --place_holder __checksum,2,.checksum,1
    --define_symbol __checksum_begin1=0x1006000
    --define_symbol __checksum_end1=0x102FFFB
    --define_symbol __checksum_begin2=0x1030000
    --define_symbol __checksum_end2=0x103EFFF
  2. ポストビルドコマンドラインを使用して、チェックサムを計算します。プロジェクト(Project) > オプション(Options...) > ビルドアクション(Build Actions) > ポストビルドコマンドライン(Post-build command line)を以下のように設定します。
    ielftool --fill 0xFF;0x1006000-0x102FFFB --fill 0xFF;0x1030000-0x103EFFF
    --checksum __checksum:2,crc16,0x0;0x1006000-0x102FFFB;0x1030000-0x103EFFF
    --verbose "$TARGET_PATH$" "$TARGET_PATH$"
  3. .icfファイルで、メモリ範囲を定義するとともに、チェックサムをどこに配置するかを定義します。
    define symbol __ICFEDIT_region_ROM_start__ = 0x1006000;
    define symbol __ICFEDIT_region_ROM_end__ = 0x102FFFF;
    
    define symbol __ICFEDIT_region_PFM_start__ = 0x1030000;
    define symbol __ICFEDIT_region_PFM_end__ = 0x103EFFF;
    
    define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__
    to __ICFEDIT_region_ROM_end__];
    
    define region PFM_region = mem:[from __ICFEDIT_region_PFM_start__
    to __ICFEDIT_region_PFM_end__];
    
    place at end of ROM_region { readonly section .checksum };

 

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

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