IELFTOOL Checksum - 基本動作

テクニカル・ノート 65473

アーキテクチャ:

Arm, STM8

コンポーネント:

general

更新日:

2018/02/19 9:27

はじめに

このテクニカルノートは、IAR ILINK リンカを使用するIARシステムズ製品に適用されます。アプリケーションでCRC16チェックサム計算を使用するために必要な基本的な手順について説明します。

解説

CRC16チェックサムの計算を開始するには、次の基本的な処理が必要です:

  • アプリケーションにチェックサム計算用のCRC16ソースを含めて使用する。
  • IAR Embedded Workbench IDEでチェックサムオプションを選択する。

解説においての前提

このテクニカルノートでは下記を前提として解説します。:

  • 仮想のデバイスを使用します。0x0000から0xFFFFの領域はread-onlyメモリとします。

アプリケーションでのチェックサム計算用のCRC16ソースのインクルードと使用

CRC16ソースを追加するときは、以下アクションを考慮する必要があります:

  • アプリケーションソースがシンボル__checksumを使用していることを確認する。
  • 注: アプリケーションソースがシンボル__checksumを使用していない場合は、ielftoolからはエラーメッセージが表示されます:
The string '__checksum' was not found in the string table.

サンプルプロジェクトは、CRC16 チェックサム計算の使い方を示しています。チェックサム値計算のためのCRC16ソースをアプリケーションに追加する必要があります。 2種類の計算方法があります:

  • Fast -- 計算時間が短いが 定数テーブル用のROM/Flash 領域を多く使います。
  • Slow -- ROM/Flashの使用量は減りますが、計算時間が長くなります。

アプリケーションでのチェックサム計算アルゴリズムに関する重要な注意事項

  • チェックサム計算は、チェックサム自身が置かれているバイトの領域で行われてはいけません。したがって、チェックサムが保存されるバイト(1、2 または 4バイト) は、チェックサムの計算の対象から除外されなければなりません。
  • 1つのアプローチとしては、チェックサムをメモリの先頭か最後に置きます。そうすることにより、アドレス範囲を正しく設定することが容易になります。
  • slow calculation を使用する時は、ソースはslow checksum calculationへの余分な最後のコールを行わなければなりません。 値0x00とチェックサムのサイズ(1,2、または4バイト)と同じバイト数でコールを行います。 詳細はサンプルプロジェクトを参照してください。

ielftoolでのチェックサム計算のオプションの選択

IAR Embedded Workbench IDE では、 プロジェクト>オプション>リンカ>チェックサム ページでオプションを設定してください。サンプルプロジェクトでの設定:

  • 未使用コードメモリをフィルする
  • フィルパターン: 0xFF (どんなパターンでも良い)
  • 開始アドレス: 0x0 (アプリケーションに合わせます)
  • 終了アドレス: 0xFFFB (アプリケーションに合わせます)
  • チェックサム生成
  • チェックサムサイズ: 2 バイト
  • アルゴリズム: CRC16
  • 補数: as is
  • ビット順: MSBが先頭
  • 初期値: 0

正しいチェックサムを生成するための要件を満たす

ielftool が正しいチェックサムを生成するための要件は2つあります ielftool generate a correct checksum:

  • チェックサムを格納する場所を指定する。
  • チェックサムを計算するアドレス範囲を確認する。

チェックサムを格納する場所を指定

チェックサムが格納される場所は、リンカ設定ファイルのディレクティブで制御されます。 次の例では、メモリの最後にチェックサムを格納します。 リンカ設定ファイルに以下行を追加してください:

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

チェックサムを計算するアドレス範囲を確認

チェックサム値が格納されているバイトを除いて、アプリケーションのすべてのread-onlyバイトに対してチェックサムが計算されていることを確認します。

これに関する情報を得るには、以下の手順を実行してください:

  1. プロジェクト>オプション>リンカ>リスト>リンカマップファイルの表示 を選択
  2. ツール>オプション>メッセージ>ビルドメッセージの表示>全て を選択
  3. ビルド (これは、手順4および5の情報を生成するために行います。)
  4. マップファイルで、シンボル__checksum を検索し、__checksum が配置されている場所を確認
  5. ビルドウィンドウのielftool ビルドメッセージから、チェックサム計算で使用するメモリ範囲に関する情報を取得

サンプルプロジェクト

サンプルプロジェクトでの開始アドレス設定:

  • 0x0 (for ARM)
  • 0x8000 (for STM8).

終了アドレス設定は 0xFFFBです。

サンプルプロジェクトのリンク:

まとめ

プロジェクトでCRCを使用するときは、このテクニカルノートに記載されているアクションと注意事項を考慮する必要があります。

他にも有用なテクニカルノートがあります。例えば:

テクニカルノート11927 は以下の情報を提供しています:

  • ielftoolを使ったチェックサム計算に関する一般的なコメント
  • チェックサム処理の特別なケースをカバーする他のテクニカルノートへのリンク

メモリにチェックサムを格納する方法と場所に関する別の提案はテクニカルノート62709に記載されています。

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

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