Studentenversion des ESY6/A Praktikums "signal_processing".
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

crc.c 1.8KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. #include "system/task_crc.h"
  2. #include "system/data_channel.h"
  3. #include "system/float_word.h"
  4. int task_crc_run( void * task ) {
  5. // TODO
  6. crc_config * config = ( crc_config *) task;
  7. uint32_t value = config->start; // Startwert CRC vom gewaehlten Algorithmus (wird erst in der Funktion invertiert)
  8. // Nachfolgende Antworten Lesen den FIFO der ersten Datenquelle aus und multiplizieren
  9. // den jeweils gelesenen Wert mit 4 und speichern das Ergebnis in der Datensenke
  10. for (uint32_t i = 0; i < DATA_CHANNEL_DEPTH; ++i) {
  11. float_word a;
  12. data_channel_read(config->base.sources[0], (uint32_t * ) & a.word );
  13. float_word c;
  14. //c.value = 4*a; //Hier mit Werten aus CRC FIFO multiplizieren
  15. c.value = 0;
  16. for (uint32_t j = 0; j < 32; j++) {
  17. if (a.word & (1<<31)) {
  18. c.word = (c.word * 2 + ((a.word & (1<<j))>>j)) ^ CRC32POLY;
  19. } else {
  20. c.word = (c.word * 2 + ((a.word & (1<<j))>>j));
  21. }
  22. }
  23. /*
  24. for (uint32_t j = 0; j < 4; j++) {
  25. if (a.word & (1<<31)) {
  26. c.word = (c.word * 2 + ((a.word & (0xff<<j*8))>>j*8)) ^ CRC32POLY;
  27. } else {
  28. c.word = (c.word * 2 + ((a.word & (0xff<<j*8))>>j*8));
  29. }
  30. }
  31. */
  32. data_channel_write( config->base.sink, c.word );
  33. printf("a= %08x c= %08x\n", a.word, c.word);
  34. }
  35. return 0;
  36. }
  37. /*
  38. crc := 0000… (Startwert)
  39. für alle Bits b im Datenstrom:
  40. wenn das am weitesten links stehende Bit von crc 1 ist:
  41. crc := (crc * 2 + b) xor CRC-Polynom
  42. sonst:
  43. crc := crc * 2 + b
  44. crc enthält das Ergebnis.
  45. */
  46. /*
  47. const uint8_t bitstream[] = { 1,0,0,0,1,1,0,0 };
  48. const int bitcount = 8;
  49. uint32_t crc32 = 0; // Schieberegister
  50. int main ()
  51. {
  52. for (int i = 0; i < bitcount; i++)
  53. {
  54. if ( ((crc32 >> 31) & 1) != bitstream[i])
  55. crc32 = (crc32 << 1) ^ CRC32POLY;
  56. else
  57. crc32 = (crc32 << 1);
  58. }
  59. printf ("0x%08X\n", crc32);
  60. }
  61. */