fifo.h 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
  1. #ifndef FIFO_H_
  2. #define FIFO_H_
  3. #include <stdint.h>
  4. //ðàçìåð äîëæåí áûòü ñòåïåíüþ äâîéêè: 4,8,16,32...128
  5. #define FIFO( size )\
  6. struct {\
  7. uint8_t buf[size];\
  8. uint16_t tail;\
  9. uint16_t head;\
  10. }
  11. //êîëè÷åñòâî ýëåìåíòîâ â î÷åðåäè
  12. #define FIFO_COUNT(fifo) (fifo.head-fifo.tail)
  13. //ðàçìåð fifo
  14. #define FIFO_SIZE(fifo) ( sizeof(fifo.buf) / sizeof(fifo.buf[0]) )
  15. //fifo çàïîëíåíî?
  16. #define FIFO_IS_FULL(fifo) (FIFO_COUNT(fifo)==FIFO_SIZE(fifo))
  17. //fifo ïóñòî?
  18. #define FIFO_IS_EMPTY(fifo) (fifo.tail==fifo.head)
  19. //êîëè÷åñòâî ñâîáîäíîãî ìåñòà â fifo
  20. #define FIFO_SPACE(fifo) (FIFO_SIZE(fifo)-FIFO_COUNT(fifo))
  21. //ïîìåñòèòü ýëåìåíò â fifo
  22. #define FIFO_PUSH(fifo, byte) \
  23. {\
  24. fifo.buf[fifo.head & (FIFO_SIZE(fifo)-1)]=byte;\
  25. fifo.head++;\
  26. }
  27. //âçÿòü ïåðâûé ýëåìåíò èç fifo
  28. #define FIFO_FRONT(fifo) (fifo.buf[fifo.tail & (FIFO_SIZE(fifo)-1)])
  29. //óìåíüøèòü êîëè÷åñòâî ýëåìåíòîâ â î÷åðåäè
  30. #define FIFO_POP(fifo) \
  31. {\
  32. fifo.tail++; \
  33. }
  34. //î÷èñòèòü fifo
  35. #define FIFO_FLUSH(fifo) \
  36. {\
  37. fifo.tail=0;\
  38. fifo.head=0;\
  39. }
  40. #endif /* FIFO_H_ */