CRC nedir, checksum'dan farkı nedir? CRC-16 hesaplayan bir C fonksiyonu yazın.
Cevap
CRC (Cyclic Redundancy Check), veriyi bir polinomla mod-2 bölme işlemine sokup kalanı kontrol değeri olarak ekleyen bir hata algılama yöntemidir. Basit toplama checksum'ına göre çok daha güçlüdür: n-bit bir CRC, n bit veya daha kısa tüm burst hatalarını ve tek sayıda bit hatalarını (uygun polinomla) yakalar. Byte'ların sırası değiştiğinde de farklı sonuç verir; toplama checksum'ı bunu yakalayamaz.
CRC parametreleri
Bir CRC algoritması şu parametrelerle tanımlanır: genişlik, polinom, başlangıç değeri (init), giriş/çıkış yansıtma (refin/refout) ve son XOR değeri (xorout). "CRC-16" tek bir algoritma değildir; MODBUS, CCITT-FALSE, XMODEM gibi farklı varyantları vardır.
CRC-16/MODBUS (bit bit)
#include <stdint.h>
#include <stddef.h>
uint16_t crc16_modbus(const uint8_t *buf, size_t len)
{
uint16_t crc = 0xFFFF; /* init */
while (len--) {
crc ^= *buf++;
for (int i = 0; i < 8; i++) {
if (crc & 1u)
crc = (crc >> 1) ^ 0xA001; /* 0x8005'in yansıtılmış hali */
else
crc >>= 1;
}
}
return crc; /* "123456789" için 0x4B37 */
}Uygulama seçenekleri
| Yöntem | Hız | Bellek |
|---|---|---|
| Bit bit | Yavaş (byte başına 8 döngü) | Çok az |
| Nibble tablosu | Orta | 16 veya 32 byte |
| 256 elemanlı tablo | Hızlı | 512 byte (CRC-16), 1 KB (CRC-32) |
| Donanım CRC birimi | En hızlı, DMA ile beslenebilir | Yok |
Pratik noktalar
- Algoritmanızı her zaman bilinen "check" değeriyle test edin (ASCII
"123456789"girişi standarttır). - STM32 CRC donanımının varsayılan ayarları CRC-32/MPEG-2'ye karşılık gelir; Ethernet/zlib CRC-32'si ile aynı sonucu almak için yansıtma ve son XOR ayarlarını değiştirmek gerekir.
- CRC kasıtlı değişikliğe karşı koruma sağlamaz; firmware bütünlüğünü saldırılara karşı korumak için SHA-256 veya imza kullanılmalıdır.
İlgili Haberleşme Protokolleri soruları
- UART, SPI ve I2C arasındaki farklar nelerdir?
- CAN bus nasıl çalışır? Arbitration, hata yönetimi ve CAN FD farkını açıklayın.
- SPI'da CPOL ve CPHA nedir? Dört SPI modu arasındaki fark nasıl açıklanır?
- I2C protokolü nasıl çalışır? Adresleme, ACK/NACK ve clock stretching nedir?
- UART'ta baud rate, frame yapısı ve parity nedir? RS-485 UART'tan nasıl farklıdır?
- USB nasıl çalışır? Enumeration süreci, endpoint'ler ve transfer tipleri nelerdir?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.