-crc


最適化リンケージエディタ(rlink)・オプション / 出力オプション

[指定形式]

-crc = <サブオプション>
       <サブオプション>: <出力位置>=<計算範囲>[/<演算方法>][(<初期値>)][:<エンディアン>]
                       <出力位置>: <アドレス>
                       <計算範囲>: { <先頭アドレス>-<終了アドレス> | <セクション> }[,...]
                       <演算方法>: { CCITT | 16-CCITT-MSB | 16-CCITT-MSB-LITTLE-4 | 
                                     16-CCITT-MSB-LITTLE-2 | 16-CCITT-LSB | 16 | 
                                     SENT-MSB | 32-ETHERNET }
                       <初期値>  : <初期値>
                       <エンディアン>: { BIG | LITTLE }[-<サイズ>-<オフセット>]

 

[詳細説明]

-

指定した範囲のセクションのデータを、下位アドレスから上位アドレスの順でCRC(Cyclic Redundancy Check)演算を行い、演算結果を出力アドレスへエンディアンの指定方法で出力します。

-

演算方法には以下のいずれかを指定することができます。演算方法の指定を省略した場合は、CCITTを指定したものとして演算を行います。

表 2.16

演算方法一覧

演算方法

内容

CCITT

CRC-16-CCITTでMSB First、初期値0xFFFF、XOR反転による演算結果を得ることができます。

生成多項式はx16+x12+x5+1です。

16-CCITT-MSB

【V2.04.00以降】

CRC-16-CCITTでMSB Firstによる演算結果を得ることができます。

生成多項式はx16+x12+x5+1です。

16-CCITT-MSB-LITTLE-4

【V2.04.00以降】

入力をLITTLEエンディアン4バイト単位としCRC-16-CCITTでMSB Firstによる演算結果を得ることができます。

生成多項式はx16+x12+x5+1です。

16-CCITT-MSB-LITTLE-2

【V2.04.00以降】

入力をLITTLEエンディアン2バイト単位としCRC-16-CCITTでMSB Firstによる演算結果を得ることができます。

生成多項式はx16+x12+x5+1です。

16-CCITT-LSB

【V2.04.00以降】

CRC-16-CCITTでLSB Firstによる演算結果を得ることができます。

生成多項式はx16+x12+x5+1です。

16

CRC-16でLSB Firstによる演算結果を得ることができます。

生成多項式はx16+x15+x2+1です。

SENT-MSB

【V2.04.00以降】

入力をLITTLEエンディアン1バイト中下位4bit単位としSENT準拠で初期値0x5、MSB Firstによる演算結果を得ることができます。

生成多項式はx4+x3+x2+1です。

32-ETHERNET

【V2.04.00以降】

CRC-32-ETHERNETによる演算結果を得ることができます。演算結果は初期値0xFFFFFFFF、XOR反転、ビットリバースされています。

生成多項式はx32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1です。

-

<初期値>として指定可能な値の範囲は、演算方法が32-ETHERNETでは0x0〜0xFFFFFFFF、それ以外では0x0〜0xFFFFです。

-

<初期値>を省略した場合は、演算方法がSENT-MSBでは 0x5、CCITTでは0xFFFF、32-ETHERNETでは0xFFFFFFFF、それ以外は 0x0 を指定したものとして演算を行います。

-

演算結果の出力アドレスへの出力は、サイズで確保した領域の先頭からオフセットの位置に、BIGかLITTLEで指定したバイトオーダーで書き込みます。確保した領域の先頭からオフセットの位置直前までは0を出力します。

-

サイズとオフセットが省略された場合、サイズは2バイトで、オフセットは0とします。

-

計算範囲にある空き領域はspace オプションが指定されていない場合は、space=FFが指定されていると仮定して、CRC 演算を行います。ただし、CRC 演算は、空き領域では0xFFで計算を行いますが、生成コードに0xFF を埋めることはありません。

-

演算範囲として指定した下位アドレスから上位アドレスの順に演算を行います。

[例]

-

rlink *.obj -form=stype -start=P1,P2/1000,P3/2000
-crc=2FFE=1000-2FFD -output=out.mot=1000-2FFF

 

-

crcオプション:-crc=2FFE=1000-2FFD

-

0x1000〜0x2FFDの領域に対してCRC演算を行い、その結果を0x2FFE番地に出力します。

-

計算範囲にある空き領域はspaceオプションが指定されていない場合、space=0xFFが指定されていると仮定して、CRC演算を行います。

-

outputオプション:-output=out.mot=1000-2FFF

-

spaceオプションが指定されていないため、空きの領域は「out.mot」ファイルに出力されません。CRC演算は、空き領域では0xFFで計算を行いますが、0xFFを埋めることはありません。

注 1.

CRC出力位置は、計算範囲に含むことは出来ません。

注 2.

CRC出力位置はoutputオプションの出力範囲に含まれている必要があります。

 

-

rlink *.obj -form=stype -start=P1/1000,P2/1800,P3/2000
-space=7F -crc=2FFE=1000-17FF,2000-27FF
-output=out.mot=1000-2FFF

 

-

crcオプション:-crc=2FFE=1000-2FFD,2000-27FF

-

0x1000〜0x17FFと0x2000〜0x27FFの2つの領域に対してCRC演算を行い、その結果を0x2FFE番地に出力します。

-

CRC演算は計算対象として、連続していない複数の計算範囲を指定できます。

-

spaceオプション:-space=7F

-

指定された計算範囲の空き領域はspaceオプションの値(0x7F)で計算されます。

-

outputオプション:-output=out.mot=1000-2FFF

-

spaceオプションが指定されているため、空き領域は「out.mot」ファイルに出力されます。空き領域は0x7Fで充填されます。

注 1.

CRC演算の計算順は計算範囲の指定順ではありません。下位アドレスから上位アドレスの順に計算されます。

注 2.

crcオプションとspaceオプションを同時に指定する場合、spaceオプションにrandomまたは2バイト以上の値を指定することは出来ません。1バイトのデータを指定してください。

 

-

rlink *.obj -form=stype -start=P1,P2/1000,P3/2000
-crc=1FFE=1000-1FFD,2000-2FFF
-output=flmem.mot=1000-1FFF

 

-

crcオプション:-crc=1FFE=1000-1FFD,2000-2FFF

-

0x1000〜0x1FFDと0x2000〜0x2FFFの領域に対してCRC演算を行い、その結果を0x1FFE番地に出力します。

-

計算範囲にある空き領域はspaceオプションが指定されていない場合、space=0xFFが指定されていると仮定して、CRC演算を行います。

-

outputオプション:-output=flmem.mot=1000-1FFF

-

spaceオプションが指定されていないため、空きの領域は「flmem.mot」ファイルに出力されません。

-

CRC演算は、空き領域では0xFFで計算を行いますが、0xFFを埋めることはありません。

[備考]

-

複数のロード・モジュール・ファイル入力時、ワーニングを出力して本オプションを無視します。

-

出力形式がform={hexadecimal | stype | bin}の場合に有効です。これら以外の場合はエラーを出力して終了します。

-

spaceオプションが指定されていない場合で、計算範囲に出力されない空き領域があるとき、空き領域には0xFF が設定されているものとしてCRC の計算が行われます。

-

CRC演算の計算範囲にオーバーレイ指定されている領域が含まれる場合はエラーを出力して終了します。

-

エンディアンの指定で、サイズとオフセットには、以下が指定できます。これ以外の場合はエラーを出力して終了します。

-

LITTLE

-

LITTLE-2-0

-

LITTLE-4-0

-

BIG

-

BIG-2-0

-

BIG-4-0

-

サンプルコード

crcオプションで計算されたCRC演算結果を比較するためのサンプルコードです。

サンプルコードのプログラムは、rlinkのCRC演算結果と一致します。

演算方法CRC-CCITTの場合(初期値 0xFFFF, MSBファースト, 反転出力)

typedef  unsigned   char    uint8_t;
typedef  unsigned   short   uint16_t;
typedef  unsigned   long    uint32_t;
uint16_t CRC_CCITT(uint8_t *pData, uint32_t iSize)
{
    uint32_t  ui32_i;
    uint8_t       *pui8_Data;
    uint16_t  ui16_CRC = 0xFFFFu;
    pui8_Data = (uint8_t *)pData;
    for(ui32_i = 0; ui32_i < iSize; ui32_i++)
    {
        ui16_CRC  = (uint16_t)((ui16_CRC >> 8u) |
        ((uint16_t)((uint32_t)ui16_CRC << 8u)));
        ui16_CRC ^= pui8_Data[ui32_i];
        ui16_CRC ^= (uint16_t)((ui16_CRC & 0xFFu) >> 4u);
        ui16_CRC ^= (uint16_t) ((ui16_CRC << 8u) << 4u);
        ui16_CRC ^= (uint16_t)(((ui16_CRC & 0xFFu) << 4u) << 1u);
    }
    ui16_CRC = (uint16_t)( 0x0000FFFFul & 
    ((uint32_t)~(uint32_t)ui16_CRC) );
    return ui16_CRC;
}

-

演算方法CRC-16の場合(初期値 0x0000, LSBファースト, 非反転出力)

#define  POLYNOMIAL  0xa001      // 生成多項式 CRC-16
typedef  unsigned    char     uint8_t;
typedef  unsigned    short    uint16_t;
typedef  unsigned    long     uint32_t;
uint16_t CRC16(uint8_t *pData, uint32_t iSize)
{
    uint16_t crcdData = (uint16_t)0;
    uint32_t data = 0;
    uint32_t i,cycLoop;
    for(i=0;i<iSize;i++){
        data = (uint32_t)pData[i];
        crcdData = crcdData ^ data;
        for (cycLoop = 0; cycLoop < 8; cycLoop++) {
            if (crcdData & 1) {
                crcdData = (crcdData >> 1) ^ POLYNOMIAL;
            } else {
                crcdData = crcdData >> 1;
            }
        }
    }
    return crcdData;
}