源码公开

[复制链接]
1132|5
 楼主| Vansm 发表于 2018-8-3 13:51 | 显示全部楼层 |阅读模式
给大家分享一个自己一直用的环形队列源码,同时也希望大家能指出其中的bug或者不足之处也便改进。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
 楼主| Vansm 发表于 2018-8-3 13:51 | 显示全部楼层
本帖最后由 Vansm 于 2018-8-3 14:07 编辑
  1. <div class="blockcode"><blockquote>/*
  2. **#############################################################################
  3. **      SVN Information
  4. **
  5. **      Checked In          : 2017-12-27
  6. **
  7. **      Author              : Fan
  8. **
  9. **      Revision            : V1.1
  10. **
  11. **      Release Information : Loop queue (.c)
  12. **#############################################################################
  13. */

  14. #include "Loop_queue.h"

  15. /*
  16. **#############################################################################
  17. ** Loop queue initialzation
  18. **#############################################################################
  19. */
  20. void LoopQueueInit(LoopQueue *queue)
  21. {
  22.     unsigned int i = 0;
  23.     queue->getIndex = 0;
  24.     queue->putIndex = 0;
  25.     queue->dataNumber = 0;
  26.     for(i = 0; i<QUEUE_MAX_LENGTH; i++)
  27.     {
  28.         queue->queueFIFO[i] = 0;   // Clear all fifo
  29.     }
  30. }

  31. /*
  32. **#############################################################################
  33. ** Loop queue clear
  34. **#############################################################################
  35. */
  36. void LoopQueueClear(LoopQueue *queue)
  37. {
  38.     unsigned int clearIndex;

  39.     queue->getIndex = 0;
  40.     queue->putIndex = 0;
  41.     for(clearIndex = 0; clearIndex < QUEUE_MAX_LENGTH ; clearIndex ++)
  42.     {
  43.         queue->queueFIFO[clearIndex] = 0;
  44.     }
  45.     queue->dataNumber = 0;
  46. }

  47. /*
  48. **#############################################################################
  49. ** Loop queue write data by pointer
  50. **#############################################################################
  51. */
  52. LoopQueueStateType LoopQueueWrite(LoopQueue *queue, unsigned char *data, unsigned int length)
  53. {
  54.     unsigned int i = 0;
  55.     if(length > (QUEUE_MAX_LENGTH - queue->dataNumber))   
  56.     {
  57.         return UNDONE;
  58.     }
  59.     for(i = 0; i<length ; i++)
  60.     {
  61.         if((QUEUE_MAX_LENGTH - queue->dataNumber) == 0)
  62.         {
  63.             return FULL;
  64.         }
  65.         queue->queueFIFO[queue->putIndex] = *(data++);
  66.         queue->dataNumber ++;
  67.         if(queue->putIndex == QUEUE_MAX_LENGTH-1)
  68.         {
  69.            queue->putIndex = 0;
  70.         }
  71.         else
  72.         {
  73.            queue->putIndex ++;
  74.         }
  75.     }
  76.     return DONE;
  77. }

  78. /*
  79. **#############################################################################
  80. ** Loop queue read data from queue and put its into somewhere with pointer
  81. **#############################################################################
  82. */
  83. LoopQueueStateType LoopQueueRead(LoopQueue *queue, unsigned char *addr ,unsigned int length)
  84. {
  85.     unsigned int i = 0;

  86.     if(queue->dataNumber == 0)
  87.     {
  88.         return EMPTY;
  89.     }
  90.     for(i = 0; i<length; i++)
  91.     {
  92.         if(queue->dataNumber == 0)
  93.         {
  94.             return UNDONE;
  95.         }
  96.         *addr++ = queue->queueFIFO[queue->getIndex];
  97.         queue->dataNumber --;
  98.         if(queue->getIndex == QUEUE_MAX_LENGTH-1)
  99.         {
  100.            queue->getIndex = 0;
  101.         }
  102.         else
  103.         {
  104.            queue->getIndex ++;
  105.         }
  106.     }
  107.     return DONE;
  108. }

  109. /*
  110. **#############################################################################
  111. ** Loop queue write one data
  112. **#############################################################################
  113. */
  114. LoopQueueStateType LoopQueueWriteOne(LoopQueue *queue, unsigned char data)
  115. {
  116.     if((QUEUE_MAX_LENGTH - queue->dataNumber) == 0)
  117.     {
  118.         return FULL;
  119.     }
  120.     queue->queueFIFO[queue->putIndex] = data;
  121.     queue->dataNumber ++;
  122.     if(queue->putIndex == QUEUE_MAX_LENGTH-1)
  123.     {
  124.          queue->putIndex = 0;
  125.     }
  126.     else
  127.     {
  128.          queue->putIndex ++;
  129.     }

  130.     return DONE;
  131. }

  132. /*
  133. **#############################################################################
  134. ** Loop queue read one data
  135. **#############################################################################
  136. */
  137. LoopQueueStateType LoopQueueReadOne(LoopQueue *queue, unsigned char *addr)
  138. {
  139.     if(queue->dataNumber == 0)
  140.     {
  141.         return EMPTY;
  142.     }
  143.     *addr = queue->queueFIFO[queue->getIndex];
  144.     queue->dataNumber --;
  145.     if(queue->getIndex == QUEUE_MAX_LENGTH-1)
  146.     {
  147.          queue->getIndex = 0;
  148.     }
  149.     else
  150.     {
  151.          queue->getIndex ++;
  152.     }
  153.     return DONE;
  154. }

  155. /*
  156. **#############################################################################
  157. ** Loop queue get data length
  158. **#############################################################################
  159. */
  160. unsigned int LoopQueueGetLength(LoopQueue *queue)
  161. {
  162.     return queue->dataNumber;
  163. }

 楼主| Vansm 发表于 2018-8-3 13:52 | 显示全部楼层
  1. /*
  2. **#############################################################################
  3. **      SVN Information
  4. **
  5. **      Checked In          : 2017-12-27
  6. **
  7. **      Author              : Fan
  8. **
  9. **      Revision            : V1.1
  10. **
  11. **      Release Information : Loop queue head file(.h)
  12. **#############################################################################
  13. */

  14. #ifndef _RING_QUEUE_H_
  15. #define _RING_QUEUE_H_

  16. #define QUEUE_MAX_LENGTH  256                   // The max length of queue

  17. //---------------- Loop queue states
  18. typedef enum _LoopQueueStateType
  19. {
  20.     EMPTY = 0x50000000,                         // Queue is empty
  21.     FULL,                                       // Queue is full
  22.     DONE,                                       // Queue operating is done
  23.     UNDONE,                                     // Queue operating is not done
  24. }LoopQueueStateType;

  25. //---------------- Loop queue struct
  26. typedef struct _LoopQueue
  27. {
  28.     unsigned char putIndex;                     // Put data index
  29.     unsigned char getIndex;                     // Get data index
  30.     unsigned int dataNumber;                    // Current data number
  31.     unsigned char queueFIFO[QUEUE_MAX_LENGTH];  // Loop queue FIFO
  32. }LoopQueue;

  33. //---------------- Loop queue initialization
  34. extern void LoopQueueInit(LoopQueue *queue);

  35. //---------------- Loop queue clear
  36. extern void LoopQueueClear(LoopQueue *queue);

  37. //---------------- Loop queue write data by pointer and length of data
  38. extern LoopQueueStateType LoopQueueWrite(LoopQueue *queue, unsigned char *data, unsigned int length);

  39. //---------------- Loop queue read data and put data by it's pointer
  40. extern LoopQueueStateType LoopQueueRead(LoopQueue *queue, unsigned char *addr ,unsigned int length);

  41. //---------------- Loop queue write one data
  42. extern LoopQueueStateType LoopQueueWriteOne(LoopQueue *queue, unsigned char data);

  43. //---------------- Loop read once
  44. extern LoopQueueStateType LoopQueueReadOne(LoopQueue *queue, unsigned char *addr);

  45. //---------------- Get the data length with queue pointer
  46. extern unsigned int LoopQueueGetLength(LoopQueue *queue);

  47. #endif


new21jackie 发表于 2018-8-3 22:09 | 显示全部楼层
  直接 i < dataNumber 不就完了吗? 自己练练手就可以了,开源社区里的这种轮子已经很多了。
  for(i = 0; i<length; i++)
    {
        if(queue->dataNumber == 0)
        {
            return UNDONE;
        }
 楼主| Vansm 发表于 2018-8-3 22:12 | 显示全部楼层
new21jackie 发表于 2018-8-3 22:09
直接 i < dataNumber 不就完了吗? 自己练练手就可以了,开源社区里的这种轮子已经很多了。
  for(i = 0; ...

哎 其实是想发来让大家帮找找bug
caijie001 发表于 2018-8-3 22:46 | 显示全部楼层
谢谢分享,下载看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则

7

主题

187

帖子

3

粉丝
快速回复 在线客服 返回列表 返回顶部