fifo.h 2.2 KB

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