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

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

FAQ詳細情報

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

質問内容

TN65473: IELFTOOL Checksum - 基本動作

回答内容

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

 

概要
このテクニカルノートは、IAR Embedded Workbenchのツールチェーンとアプリケーションの両方で、CRC16チェックサムcalcuationを設定するために必要な手順を説明します。

このテクニカルノートは、次のIAR Embedded Workbench製品、バージョンに適用されます。
ARM用 IAR Embedded Workbench 5.11 (およびそれ以降)
RX用 IAR Embedded Workbench 2.10 (およびそれ以降)
SH用 IAR Embedded Workbench 2.10(およびそれ以降)
STM8 用 IAR Embedded Workbench 1.10(およびそれ以降)

 

アプリケーションに、チェックサムの計算を行うソースプログラムを含めてください。
• 最小要件は、ソースファイルからシンボル __checksum を参照していることです。
• 注: ソースファイルからシンボル __checksum を参照していないと、IELFTOOLが次のエラーメッセージを表示します。
The string '__checksum' was not found in the string table
• とりあえずリンクを成功させるには、プロジェクトメニュー > オプション > リンカ > 追加オプション > コマンドラインオプションの使用にチェックを入れ、コマンドラインオプションのテキストボックスに--keep __checksum を記入します。

 

アプリケーションでのチェックサム計算 
提供されているサンプルは、CRC16 チェックサム計算の使い方を説明しています。 実際にEWARMが計算するのと同じチェックサム値を計算する、実際のCソースをアプリケーションに追加する必要があります。 2種類の計算方法があります。 
• 高速 - 計算時間が短いが 定数テーブル用のROM/Flash 領域を多く使います。
• 低速 - ROM/Flashの使用量は減りますが、計算時間が長くなります。

 

注意 
• チェックサム計算は、チェックサム自身が置かれているメモリ領域を計算しないようにしなくてはなりません。今回は、チェックサムをメモリの先頭か最後に置きます。そうすることにより、チェックサムを置くデータ  (1、2 または 4バイト) は、チェックサムの計算の対象から除外されます。 
• 低速の関数を使用する場合、計算の最後に、チェックサムデータのバイト数分 0x00 でコールする必要があります。 詳細は、サンプルプロジェクト Example (1 range, 3 diff. locations).zip を参照してください。  

 

リンカオプションで、チェックサム計算をオンにします。
このオプションは Embedded Workbench からでも、コマンドラインからでも利用できます。 コマンドラインを使用していると、コマンドは先人リンカを実行し、次に IELFTOOLを実行します。

IAR Embedded Workbenchでは、プロジェクトメニュー > オプション > リンカ > チェックサムタブの、オプションを設定する必要があります

最初のサンプルプロジェクトで使用したオプションは、 
未使用コードをフィルする 
フィルパターン 0xFF (どんなパターンでも良い) 
開始アドレス 0x0 (アプリケーションに合わせます) 
終了アドレス 0xFFFB (アプリケーションに合わせます) 
チェックサムの生成 サイズ = 2 バイト、CRC16、補数 = そのまま使用、ビット順 = MSBが先頭、初期値 = 0.

対応するコマンドラインは次のとおりです。

ielftool --fill 0xFF;0x0-0xfffb --checksum __checksum:2,crc16,0x0;0x0-0xfffb

 

これを動作させるためには、 2つの条件を満たす必要があり、このテクニカルノートの 2つのパートを参照してください。 
• チェックサムを計算するアドレス範囲を選択する 
• チェックサムを置く場所を選択する。

 

チェックサムを計算するアドレス範囲を選択します 
チェックサムはアプリケーションの (通常) RAM以外の範囲をカバーし、チェックサムを置く場所を除きます。

このためには、
• プロジェクトメニュー > オプション > リンカ > チェックサムタブ

□未使用コードメモリをフィルする
□チェックサムを生成

にチェックを入れます。 

• プロジェクトメニュー > オプション > リンカ > リストタブ □リンカマップファイルの表示 にチェックを入れる。
• ツールメニュー > オプション > メッセージ > ビルドメッセージの表示 ドロップダウンリストを全てに設定。 
• アプリケーションに __checksum シンボル使用を追加. 
• ビルドする 
• マップファイルを見て __checksum が配置されている場所を調べる。 
• ビルドウィンドウを見て、チェックサム計算に使用されているメモリ範囲を確認します。

 

チェックサムを格納する場所を指定します。 
これは icf ファイルで行います。以下のサンプルでは、メモリの最後にチェックサムを格納しています。 

 

以下の行を icf ファイルに入れます。

place at end of ROM_region { ro section .checksum };

 

注意 
チェックサムを格納する方法と、メモリ上のどこに配置するかは、いくつか方法があります。これらの方法は、TN62709: IELFTOOL Checksum - チェックサムの配置 に書かれています。

 

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

参考資料URL