Použitie CRC8, výpočet z viacerých bajtov (pole)

Mam kod z tejto stranky dattalo.com/technical/softwa … crc_8bit.c

Akurat mi nieje jasne ako to upravit aby som mohol dat vypocitat crc8 z viacerych bajtov (mam pole)

teraz sa tam vklada 16b cislo, je nejaka finta ako tam fkladat po bajtoch. napr zoberiem prvy bajt…urobim crc, a potom druhy bajt vynasobim s crc orezem na 16b a to opakujem az kym sa mi neminu bajty ? alebo ako ? Pripadne treba nieco v tomto koe este upravit ?

[code]/===========================================================/

unsigned char crc_bits(int data)
{
int i = (data ^ crc) & 0xff;

crc = 0;

if(i & 1)
crc ^= 0x5e;
if(i & 2)
crc ^= 0xbc;
if(i & 4)
crc ^= 0x61;
if(i & 8)
crc ^= 0xc2;
if(i & 0x10)
crc ^= 0x9d;
if(i & 0x20)
crc ^= 0x23;
if(i & 0x40)
crc ^= 0x46;
if(i & 0x80)
crc ^= 0x8c;

return crc;
}

/===========================================================/
[/code]

dakujem

:arrow_right: administrator: přesunuto z "Elektronika s mikrokontroléry, procesory"

:arrow_right: administrator: přejmenováno z "Pouzitie CRC8"

Uz som asi na to prisiel a asi mi to ani nebude treba.

crc8.h:[code]#ifndef CRC8_H_
#define CRC8_H_

#define CRC8_POLY 0x31 // Dalas polynominal = 0x31 (0b00110001: x8 + x5 + x4 + 1)

extern void crc8Init(void);
extern uint8_t crc8Checksum(uint8_t val], uint8_t len);

#endif[/code]

crc8.c:[code]#include “crc8.h”

// ======= Private global vars ====================================================================
static uint8_t table[256];

// ========= Private Function Prototypes ==========================================================
static void crc8GenTab(uint8_t poly);

// ========= Public Functions =====================================================================

void crc8Init(void)
{
crc8GenTab(CRC8_POLY);
}

uint8_t crc8Checksum(uint8_t val], uint8_t len)
{
uint8_t tmp = 0, i;

for(i = 0; i < len; i++)
{
	tmp = table[tmp ^ val[i]];
}
return tmp;

}

// ========= Private Functions ====================================================================

static void crc8GenTab(uint8_t poly)
{
//
//uint16_t i;
uint8_t curr, i=0, j;

for(;;)
{
	curr = (uint8_t)i;

	for (j = 0; j < 8; ++j)
	{
		if ((curr & 0x80) != 0)
		{
			curr = (curr << 1) ^ poly;
		}
		else
		{
			curr <<= 1;
		}
	}
	table* = curr;

	if(i++ == 255) break;
}

}[/code]*

Ten moj vlozeny kod funguje akurat mi neije jasne preco tam je ako vstup INT, kedze vkladam 1B tj 8bit ?

Int má ve vstupním parametru jednu drobnou výhodu - při volání funkce nemusíš číslo přetypovávat na nižší rozměr, oříznutí zajistí funkce (z “data” se bere jen nižších 8 bitů). Což je současně i nevýhoda - u 8bitového procesoru se operace dělá se 2 registry. Když by se chtěla funkce více zefektivnit, měl by být vstupní parametr unsigned char a stejně tak i proměnná “i”. Ale i teď je i při výpočtu proměnné “i” zbytečné to maskování “& 0xff”, protože vyšší bity se vůbec nepoužívají. Další zefektivnění by mohlo přinést načtení globální proměnné crc to lokální proměnné (držela by se v registru) a její uložení při ukončení funkce.

// typedef unsigned char u8; u8 crc_bits(u8 data) { data ^= crc; u8 crc_tmp = 0; if(data & 1) crc_tmp = 0x5e; if(data & 2) crc_tmp ^= 0xbc; if(data & 4) crc_tmp ^= 0x61; if(data & 8) crc_tmp ^= 0xc2; if(data & 0x10) crc_tmp ^= 0x9d; if(data & 0x20) crc_tmp ^= 0x23; if(data & 0x40) crc_tmp ^= 0x46; if(data & 0x80) crc_tmp ^= 0x8c; crc = crc_tmp; return crc_tmp; }