|
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- #include "system/task_crc.h"
- #include "system/data_channel.h"
- #include "system/float_word.h"
-
- int task_crc_run( void * task ) {
-
- // TODO
- crc_config * config = ( crc_config *) task;
-
- uint32_t value = config->start; // Startwert CRC vom gewaehlten Algorithmus (wird erst in der Funktion invertiert)
-
- // Nachfolgende Antworten Lesen den FIFO der ersten Datenquelle aus und multiplizieren
- // den jeweils gelesenen Wert mit 4 und speichern das Ergebnis in der Datensenke
- for (uint32_t i = 0; i < DATA_CHANNEL_DEPTH; ++i) {
- float_word a;
- data_channel_read(config->base.sources[0], (uint32_t * ) & a.word );
- float_word c;
- //c.value = 4*a; //Hier mit Werten aus CRC FIFO multiplizieren
- c.value = 0;
-
- for (uint32_t j = 0; j < 32; j++) {
- if (a.word & (1<<31)) {
- c.word = (c.word * 2 + ((a.word & (1<<j))>>j)) ^ CRC32POLY;
- } else {
- c.word = (c.word * 2 + ((a.word & (1<<j))>>j));
- }
- }
-
- /*
- for (uint32_t j = 0; j < 4; j++) {
- if (a.word & (1<<31)) {
- c.word = (c.word * 2 + ((a.word & (0xff<<j*8))>>j*8)) ^ CRC32POLY;
- } else {
- c.word = (c.word * 2 + ((a.word & (0xff<<j*8))>>j*8));
- }
- }
- */
- data_channel_write( config->base.sink, c.word );
- printf("a= %08x c= %08x\n", a.word, c.word);
- }
-
- return 0;
- }
-
- /*
- crc := 0000… (Startwert)
- für alle Bits b im Datenstrom:
- wenn das am weitesten links stehende Bit von crc 1 ist:
- crc := (crc * 2 + b) xor CRC-Polynom
- sonst:
- crc := crc * 2 + b
- crc enthält das Ergebnis.
- */
- /*
- const uint8_t bitstream[] = { 1,0,0,0,1,1,0,0 };
- const int bitcount = 8;
- uint32_t crc32 = 0; // Schieberegister
-
- int main ()
- {
- for (int i = 0; i < bitcount; i++)
- {
- if ( ((crc32 >> 31) & 1) != bitstream[i])
- crc32 = (crc32 << 1) ^ CRC32POLY;
- else
- crc32 = (crc32 << 1);
- }
- printf ("0x%08X\n", crc32);
- }
- */
|