分享一个好用的Fifo队列

2019-12-12 18:23发布

可以移植在任意单片机或Linux中,挺好~~


  1. #include "CirQueue.h"


  2. CirQueue stQueue;


  3. /*        $Function                :  Init_Queue               
  4. ==  ===============================================================
  5. ==        Description                :       
  6. ==        Argument                :        *Q
  7. ==                                        :       
  8. ==         Return                        :        none
  9. ==        Modification        :        2014-03-05        xu_chenhua                Create
  10. ==  ===============================================================
  11. */
  12. void InitQueue(CirQueue *Q)
  13. {
  14.    u8 i;       
  15.         Q->front = Q->rear = 0;
  16.         Q->count = 0;
  17.         memset(Q->receive,0,QueueSize);
  18.                
  19. }



  20. /*        $Function                :  QueueEmpty               
  21. ==  ===============================================================
  22. ==        Description                :       
  23. ==        Argument                :        *Q
  24. ==                                        :       
  25. ==         Return                        :        if count =0 is return 1,if not return 0
  26. ==        Modification        :        2014-03-05        xu_chenhua                Create
  27. ==  ===============================================================
  28. */

  29. u16 QueueEmpty(CirQueue *Q)
  30. {
  31.         return Q->count == 0;           
  32. }



  33. /*        $Function                :  QueueFull               
  34. ==  ===============================================================
  35. ==        Description                :       
  36. ==        Argument                :        *Q
  37. ==                                        :       
  38. ==         Return                        :        if count = Queuesize is return 1,if not return 0
  39. ==        Modification        :        2014-03-05        xu_chenhua                Create
  40. ==  ===============================================================
  41. */

  42. u16 QueueFull(CirQueue *Q)
  43. {
  44.         return Q->count == QueueSize;  
  45. }




  46. /*        $Function                :  QueuePushIn               
  47. ==  ===============================================================
  48. ==        Description                :       
  49. ==        Argument                :        *Q,x
  50. ==                                        :       
  51. ==         Return                        :        if queue is full return 0 ,if not return 1
  52. ==        Modification        :        2014-03-05        xu_chenhua                Create
  53. ==  ===============================================================
  54. */

  55. u8 EnQueue(CirQueue *Q,u8 x)   
  56. {
  57.         if(QueueFull(Q))
  58.         {
  59.                 return 0;
  60.         }
  61.         Q->count++;
  62.         Q->receive[Q->rear] = x;                             
  63.         Q->rear = (Q->rear+1)%QueueSize;
  64.         return 1;
  65. }



  66. /*        $Function                :  QueuePushIn               
  67. ==  ===============================================================
  68. ==        Description                :       
  69. ==        Argument                :        *Q ,*dat
  70. ==                                        :       
  71. ==         Return                        :        if queue is empty return 0 ,if not return 1
  72. ==        Modification        :        2014-03-05        xu_chenhua                Create
  73. ==  ===============================================================
  74. */
  75. u8 DeQueue(CirQueue *Q, u8 *dat)
  76. {
  77.         if(QueueEmpty(Q))
  78.         {
  79.                 return 0;
  80.         }
  81.         *dat = Q->receive[Q->front];
  82.         Q->front = (Q->front +1)%QueueSize;
  83.         Q->count--;
  84.         return 1;
  85. }



  86. /*        $Function                :  QueuePushIn               
  87. ==  ===============================================================
  88. ==        Description                :       
  89. ==        Argument                :        *rxdata,length
  90. ==                                        :       
  91. ==         Return                        :        none
  92. ==        Modification        :        2014-03-05        xu_chenhua                Create
  93. ==  ===============================================================
  94. */
  95. u8 QueuePushIn(u8 *rxdata,u8 length)
  96. {
  97.         u8 i;
  98.         if(QueueFull(&stQueue))
  99.         {
  100.                 return 0;
  101.         }
  102.        
  103.         for(i=0;i<length;i++)
  104.         {
  105.                 EnQueue(&stQueue,*rxdata++);
  106.         }
  107.         return 1;
  108. }


  109. /*        $Function                :  QueuePopOut               
  110. ==  ===============================================================
  111. ==        Description                :       
  112. ==        Argument                :        *buf,length
  113. ==                                        :       
  114. ==         Return                        :        none
  115. ==        Modification        :        2014-03-05        xu_chenhua                Create
  116. ==  ===============================================================
  117. */
  118. u8 QueuePopOut(u8 *buf, u16 length)
  119. {
  120.         u8 i;
  121.         if(QueueEmpty(&stQueue))
  122.         {
  123.                 return 0;
  124.         }
  125.         for(i=0;i<length;i++)
  126.         {
  127.                 DeQueue(&stQueue, &buf[i]);
  128.         }
  129.         return 1;
  130. }

复制代码

头文件:

  1. #ifndef __CIRQUEUE_H_
  2. #define __CIRQUEUE_H_

  3. #include  "usr_define.h"
  4. #include <string.h>
  5. #include <stdlib.h>


  6. #define QueueSize  64

  7. typedef struct _TagCirQueue
  8. {
  9.         u16 front;
  10.         u16 rear;
  11.         u16 count;
  12.         u8  receive[QueueSize];
  13. }CirQueue;

  14. extern CirQueue stQueue;

  15. u8 QueuePopOut(u8 * buf,u16 length);
  16. u8 QueuePushIn(u8 * rxdata,u8 length);
  17. void InitQueue(CirQueue * Q);





  18. #endif
复制代码
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。