fifo.h 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990
  1. /*
  2. * =====================================================================================
  3. *
  4. * .d8888b 88888b. .d88b. .d8888b 888d888 8888b. 88888b.d88b.
  5. * 88K 888 "88b d8P Y8b 88K 888P" "88b 888 "888 "88b
  6. * "Y8888b. 888 888 88888888 "Y8888b. 888 .d888888 888 888 888
  7. * X88 888 888 Y8b. X88 888 888 888 888 888 888
  8. * 88888P' 888 888 "Y8888 88888P' 888 "Y888888 888 888 888
  9. *
  10. * www.optixx.org
  11. *
  12. *
  13. * Version: 1.0
  14. * Created: 07/21/2009 03:32:16 PM
  15. * Author: david@optixx.org
  16. *
  17. * =====================================================================================
  18. */
  19. #ifndef __FIFO_H__
  20. #define __FIFO_H__
  21. #include <avr/io.h>
  22. #include <avr/interrupt.h>
  23. typedef struct {
  24. uint8_t volatile count; // # Zeichen im Puffer
  25. uint8_t size; // Puffer-Größe
  26. uint8_t *pread; // Lesezeiger
  27. uint8_t *pwrite; // Schreibzeiger
  28. uint8_t read2end, write2end; // # Zeichen bis zum Überlauf Lese-/Schreibzeiger
  29. } fifo_t;
  30. extern void fifo_init(fifo_t *, uint8_t * buf, const uint8_t size);
  31. extern uint8_t fifo_put(fifo_t *, const uint8_t data);
  32. extern uint8_t fifo_get_wait(fifo_t *);
  33. extern int fifo_get_nowait(fifo_t *);
  34. static inline uint8_t _inline_fifo_put(fifo_t * f, const uint8_t data)
  35. {
  36. if (f->count >= f->size)
  37. return 0;
  38. uint8_t *pwrite = f->pwrite;
  39. *(pwrite++) = data;
  40. uint8_t write2end = f->write2end;
  41. if (--write2end == 0) {
  42. write2end = f->size;
  43. pwrite -= write2end;
  44. }
  45. f->write2end = write2end;
  46. f->pwrite = pwrite;
  47. uint8_t sreg = SREG;
  48. cli();
  49. f->count++;
  50. SREG = sreg;
  51. return 1;
  52. }
  53. static inline uint8_t _inline_fifo_get(fifo_t * f)
  54. {
  55. uint8_t *pread = f->pread;
  56. uint8_t data = *(pread++);
  57. uint8_t read2end = f->read2end;
  58. if (--read2end == 0) {
  59. read2end = f->size;
  60. pread -= read2end;
  61. }
  62. f->pread = pread;
  63. f->read2end = read2end;
  64. uint8_t sreg = SREG;
  65. cli();
  66. f->count--;
  67. SREG = sreg;
  68. return data;
  69. }
  70. #endif /* _FIFO_H_ */