K60 のハードウェアを使用した CRC32演算
テクニカル・ノート 85753
アーキテクチャ:
ARM
コンポーネント:
general
更新日:
2018/08/25 15:03
はじめに
FreescaleのK60デバイスには、ハードウェアのCRC32計算機が内蔵されています(アプリケーションでCRC32を使用する際、CRC32計算アルゴリズムのためのコード空間を確保する必要がありません)。
IAR Embedded Workbench for ARMバージョン6.60の解決方法
6.60のオプション
プロジェクト(Project) > オプション(Options) > リンカ(Linker) > チェックサム(Checksum)に、K60デバイスに内蔵されているハードウェアと同じ方法でielftoolにCRC32を計算させるためのオプションが追加されました。
このオプションを以下のように設定します。
Size: 4 bytes
Alignment: 4
Algorithm: CRC32(0x4C11DB7)
Complement: As is
Bit order: MSB first
[ ]Reverse byte order within word [unchecked]
Initial Value: 0x0
[X]Use as input [checked]
Checksum unit size: 32-bit
K60の例
ここでは、ソースコード、リンカ設定ファイル、およびリンカオプションダイアログにおける設定の例を示します。
- ソースコード(抜粋)
extern uint32_t __checksum;
uint32_t valCrc32;
uint32_t calcCrc32(uint32_t* data, uint32_t len, uint32_t startValue)
{
uint32_t result=0;
uint32_t *memptr;
memptr = data;
SIM_SCGC6 |= SIM_SCGC6_CRC_MASK;
CRC_CTRL = CRC_CTRL_WAS_MASK | CRC_CTRL_TCRC_MASK; /* 32bit CRC */
CRC_CRC = startValue; /* Seed */
CRC_CTRL = CRC_CTRL_TCRC_MASK; /* 32bit CRC */
CRC_GPOLY = 0x04C11DB7; /* Poly to match
IAR 32-bit default */
for (uint32_t i=0; i < len; i++)
{
CRC_CRC = *memptr++;
}
result = CRC_CRC;
return result;
}
void main (void)
{
// ROM content
uint32_t start_address = 0x410;
uint32_t end_address = 0x2ffb;
uint32_t len = (end_address + 1 - start_address) / 4;
valCrc32 = calcCrc32((uint32_t*)start_address, len, 0x0);
if (valCrc32 == __checksum)
{
// TBD
}
else
{
// TBD
}
// ROM content, including checksum
len++;
valCrc32 = calcCrc32((uint32_t*)start_address, len, 0x0);
if (valCrc32 == 0)
{
// TBD
}
else
{
// TBD
}
}
リンカ設定ファイル(抜粋)
define symbol __ICFEDIT_region_ROM_start__ = 0x00000000;
define symbol __ICFEDIT_region_ROM_end__ = 0x00002ffb;
"CHECKSUM":
place at address mem:0x00002ffc { readonly section .checksum };
keep { section .checksum};
- リンカオプションダイアログ
- サンプルプロジェクト:
Example (6.60).zip
全ての製品名は、それぞれの所有者の商標または登録商標です。