fifo.h 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #ifndef _FIFO_H_
  2. #define _FIFO_H_
  3. #include <avr/io.h>
  4. #include <avr/interrupt.h>
  5. typedef struct {
  6. uint8_t volatile count; // # Zeichen im Puffer
  7. uint8_t size; // Puffer-Größe
  8. uint8_t *pread; // Lesezeiger
  9. uint8_t *pwrite; // Schreibzeiger
  10. uint8_t read2end, write2end; // # Zeichen bis zum Überlauf Lese-/Schreibzeiger
  11. } fifo_t;
  12. extern void fifo_init(fifo_t *, uint8_t * buf, const uint8_t size);
  13. extern uint8_t fifo_put(fifo_t *, const uint8_t data);
  14. extern uint8_t fifo_get_wait(fifo_t *);
  15. extern int fifo_get_nowait(fifo_t *);
  16. static inline uint8_t _inline_fifo_put(fifo_t * f, const uint8_t data)
  17. {
  18. if (f->count >= f->size)
  19. return 0;
  20. uint8_t *pwrite = f->pwrite;
  21. *(pwrite++) = data;
  22. uint8_t write2end = f->write2end;
  23. if (--write2end == 0) {
  24. write2end = f->size;
  25. pwrite -= write2end;
  26. }
  27. f->write2end = write2end;
  28. f->pwrite = pwrite;
  29. uint8_t sreg = SREG;
  30. cli();
  31. f->count++;
  32. SREG = sreg;
  33. return 1;
  34. }
  35. static inline uint8_t _inline_fifo_get(fifo_t * f)
  36. {
  37. uint8_t *pread = f->pread;
  38. uint8_t data = *(pread++);
  39. uint8_t read2end = f->read2end;
  40. if (--read2end == 0) {
  41. read2end = f->size;
  42. pread -= read2end;
  43. }
  44. f->pread = pread;
  45. f->read2end = read2end;
  46. uint8_t sreg = SREG;
  47. cli();
  48. f->count--;
  49. SREG = sreg;
  50. return data;
  51. }
  52. #endif /* _FIFO_H_ */