AVR Libc Home Page | AVR Libc Development Pages | ||||
Main Page | User Manual | Library Reference | FAQ | Alphabetical Index | Example Projects |
関数 | |
static __inline__ uint16_t | _crc16_update (uint16_t __crc, uint8_t __data) |
static __inline__ uint16_t | _crc_xmodem_update (uint16_t __crc, uint8_t __data) |
static __inline__ uint16_t | _crc_ccitt_update (uint16_t __crc, uint8_t __data) |
static __inline__ uint8_t | _crc_ibutton_update (uint8_t __crc, uint8_t __data) |
#include <util/crc16.h>
このヘッダファイルは、一般的な多項式を用いた巡回冗長検査(CRC:cyclic redundancy checks)計算のために最適化されたインライン関数を提供します。
Dallas Semiconductorの、8051アセンブラ例と一般的なCRC最適化提案であるアプリケーションノート27を参照してください。アプリケーションノートの最後のページの表は、これらの実装を理解するうえで重要となります。
Jack Crenshawの"Implementing CRCs" Embedded Systems Programming 1992年1月号の記事。これを見つけるのは難しいかもしれないですが、とても明確かつ簡潔な用語で、CRCを説明しています。コピーを入手するための努力の価値があります。
典型的なアプリケーションは、次のようになります。
// Dallas iButton test vector. uint8_t serno[] = { 0x02, 0x1c, 0xb8, 0x01, 0, 0, 0, 0xa2 }; int checkcrc(void) { uint8_t crc = 0, i; for (i = 0; i < sizeof serno / sizeof serno[0]; i++) crc = _crc_ibutton_update(crc, serno[i]); return crc; // must be 0 }
最適化されたCRC-CCITT計算
多項式: x^16 + x^12 + x^5 + 1 (0x8408)
初期値: 0xffff
これは、PPPやIrDAで使用されるCRCです。
RFC1171(PPPプロトコル)やIrDA IrLAP 1.1を参照してください。
次は、Cで書かれた同等の関数です。
最適化されたDallas(現Maxim) iButton 8-bit CRC計算
多項式: x^8 + x^5 + x^4 + 1 (0x8C)
初期値: 0x0
http://www.maxim-ic.com/appnotes.cfm/appnote_number/27を参照してください。
次は、Cで書かれた同等の関数です。
uint8_t _crc_ibutton_update(uint8_t crc, uint8_t data) { uint8_t i; crc = crc ^ data; for (i = 0; i < 8; i++) { if (crc & 0x01) crc = (crc >> 1) ^ 0x8C; else crc >>= 1; } return crc; }
最適化されたCRC-XMODEM計算
多項式: x^16 + x^12 + x^5 + 1 (0x1021)
初期値: 0x0
これは、Xmodem-CRCプロトコルで使用されるCRCです。
次は、Cで書かれた同等の関数です。