ハードウェアCRC計算ユニットを備えたARMcortexM3ボードを使用しています。3つの標準CRC多項式をサポートします。モジュールへのインターフェースは非常にシンプルです。データとデータ長へのポインタを提供する必要があります。私が抱えている問題は、最初にLSBを計算することです。そして、最初にCRC Msb(xmodem crc16-itt)を知る必要があります。とにかくそれが得た計算を取り、それを最初にmsbに変換することはありますか?
3 に答える
編集/書き換え:
提供された情報から、私はあなたがこれらの選択肢を持っていると思います:
1)マイクロコントローラーがそれほど多くの作業を行う必要がないように、ホスト上にデータを配置します(マイクロコントローラーほどリソースに制約がないと想定されます)。
2)可能な場合は機能/命令を使用してデータの(バイトスワップされた)コピーを作成し、それを高速化してから、ハードウェアCRCエンジンにcrcを計算させます。
3)ハードウェアcrcエンジンを使用せず、ソフトウェアを使用してcrcを計算します。
4)crcを無視します。
5)別のマイクロコントローラーを使用します(このユースケースを処理できます)。
[...]最初にCRCMsbを知る必要があります(xmodem crc16-itt)。とにかくそれが得た計算を取り、それを最初にmsbに変換することはありますか?
xmodem crc16-ittは、バイトをデータとして処理します。したがって、最上位バイトが最初または最下位バイトが最初であることが、CRC値の表現にのみ関係します。計算された値を交換するだけです-たとえば、__REV16()
CMSIS関数を使用します。
編集:
私は双方がその0x01 0x02 0x03 0x04
ように見えると仮定しました。片側が異なるバイトを見る場合、たとえば0x04 0x03 0x02 0x01
メモリ内の場合、CRCは失敗します。しかし、データを処理するときにひどい頭痛がするので、とにかくそれを遅かれ早かれ修正したいと思うでしょう。
次のように2バイトを交換するだけです。
unsigned short crc_little_endian = ...; // call to your CRC function
unsigned short crc_big_endian = (crc_little_endian >> 8) | (crc_little_endian << 8);