fifo.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include "fifo.h"
  2. #include "Uart.h"
  3. FIFO_T g_rxfifo;
  4. FIFO_T g_txfifo;
  5. /*-----------------------------------------------------------------
  6. * 初始化fifo
  7. * ----------------------------------------------------------------*/
  8. void init_fifo(FIFO_T *fifo)
  9. {
  10. uint8_t i = 0;
  11. for(i=0;i<8;i++){
  12. memset(fifo->memory[i].da,0,256);
  13. fifo->memory[i].len = 0;
  14. }
  15. fifo->flag = FALSE;
  16. fifo->front = fifo->rear = 0;
  17. printf("循环队列已经创建完毕\n");
  18. return ;
  19. }
  20. /*-----------------------------------------------------------------
  21. * 判断fifo是否已满
  22. * 满返回1 否则返回0
  23. * -----------------------------------------------------------------*/
  24. bool fifo_is_full(FIFO_T *fifo)
  25. {
  26. if ((fifo->front == fifo->rear) && fifo->flag)
  27. {
  28. printf("循环队列已满!-fifo\n");
  29. return TRUE;
  30. }
  31. return FALSE;
  32. }
  33. /*------------------------------------------------------------------
  34. * 判断fio是否已空
  35. * 空返回 1: 否则返回0
  36. * -----------------------------------------------------------------*/
  37. bool fifo_is_empty(FIFO_T *fifo)
  38. {
  39. if ((fifo->front == fifo->rear) && !(fifo->flag)) // 判断队空 flag 为false
  40. return TRUE;
  41. return FALSE;
  42. }
  43. /*------------------------------------------------------------------
  44. * 写入数据到fifo
  45. * 1:写入 0: 操作失败
  46. * -----------------------------------------------------------------*/
  47. uint8_t fifo_write(FIFO_T *fifo,uint8_t *data,uint8_t len)
  48. {
  49. if ((fifo->front == fifo->rear) && fifo->flag)
  50. {
  51. printf("循环队列已满!-write front=%d,flag = %d\n",fifo->front,fifo->flag);
  52. return 0;
  53. }
  54. memcpy(fifo->memory[fifo->rear].da,data,len);
  55. fifo->memory[fifo->rear].len = len;
  56. ++(fifo->rear);
  57. fifo->rear %= MAXSIZE;
  58. if (fifo->rear == fifo->front) // 设置队列已满
  59. fifo->flag = TRUE;
  60. return 1;
  61. }
  62. /*------------------------------------------------------------------
  63. * 从fifo中读取数据
  64. * -----------------------------------------------------------------*/
  65. uint8_t fifo_read(FIFO_T *fifo,uint8_t *data)
  66. {
  67. uint8_t len;
  68. if ((fifo->front == fifo->rear) && !(fifo->flag)) // 判断队空
  69. {
  70. printf("队列为空!不能进行删除操作\n");
  71. return 0;
  72. }
  73. len = fifo->memory[fifo->front].len;
  74. memcpy(data,fifo->memory[fifo->front].da,len);
  75. //memset(fifo->memory[fifo->front].da,0,256);
  76. fifo->memory[fifo->front].len = 0;
  77. fifo->front++;
  78. fifo->front %= MAXSIZE;
  79. if (fifo->front == fifo->rear) // 设置队列为空
  80. fifo->flag = FALSE;
  81. return len;
  82. }