queue.c 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "queue.h"
  2. /// front ... rear 数据方向 ->
  3. /* 队列的顺序存储结构(循环队列) */
  4. can_queue_tag can_tx_queue;
  5. can_queue_tag can_rx_queue;
  6. /****************************************************
  7. * 函 数 名:init_queue
  8. * 函数功能:初始化队列
  9. * 入口参数:无
  10. * 说 明:
  11. ****************************************************/
  12. void queue_init(p_can_queue_tag p_queue)
  13. { /* 构造一个空队列Q */
  14. p_queue->head = p_queue->tail = 0; /*空队列*/
  15. p_queue->count = 0;
  16. }
  17. /****************************************************
  18. * 函 数 名:is_queue_empty
  19. * 函数功能:查询队列是否为空
  20. * 入口参数:Q 队列
  21. * 说 明:空队列,返回SUCCESS;否则返回ERROR
  22. ****************************************************/
  23. uint8_t queue_empty(p_can_queue_tag p_queue)
  24. { /* 若*/
  25. return p_queue->count == 0;
  26. }
  27. uint8_t queue_full(p_can_queue_tag p_queue)
  28. { /* 若*/
  29. return p_queue->count == MAX_QSIZE;
  30. }
  31. /****************************************************
  32. * 函 数 名:queue_length
  33. * 函数功能:初始化长度
  34. * 入口参数:Q 队列
  35. * 说 明:
  36. ****************************************************/
  37. uint16_t queue_length(can_queue_tag p_queue)
  38. { /* 返回Q的元素个数,即队列的长度 */
  39. return (p_queue.tail - p_queue.head + MAX_QSIZE) % MAX_QSIZE;
  40. }
  41. /****************************************************
  42. * 函 数 名:get_head
  43. * 函数功能:获取对头数据
  44. * 入口参数:Q 队列
  45. * 说 明:
  46. ****************************************************/
  47. uint8_t get_head(
  48. can_queue_tag *p_queue,
  49. pdu_tag *e)
  50. { /* 若队列不空,则用e返回Q的队头元素,并返回OK;否则返回ERROR*/
  51. if (p_queue->head == p_queue->tail) /* 队列空 */
  52. return Q_ERR;
  53. *e = p_queue->can_message[p_queue->head];
  54. p_queue->head = (p_queue->head + 1) % MAX_QSIZE;
  55. return Q_OK;
  56. }
  57. /****************************************************
  58. * 函 数 名:insert_queue
  59. * 函数功能:队列插入数据
  60. * 入口参数:Q 待插入队列 e 待插入数据
  61. * 说 明:
  62. ****************************************************/
  63. QUEUE_STATUS en_queue(p_can_queue_tag p_queue,
  64. pdu_tag data)
  65. {
  66. if (queue_full(p_queue))
  67. return Q_FULL;
  68. p_queue->count++;
  69. p_queue->can_message[p_queue->head] = data;
  70. p_queue->head = (p_queue->head + 1) % MAX_QSIZE;
  71. return Q_OK;
  72. /* 插入元素e为Q的新的队尾元素 */
  73. // if ((p_queue->tail + 1) % MAX_QSIZE == p_queue->head) /* 队列满 */
  74. // return ERROR;
  75. // p_queue->can_message[p_queue->tail] = e;
  76. // p_queue->tail = (p_queue->tail + 1) % MAX_QSIZE;
  77. // return SUCCESS;
  78. }
  79. QUEUE_STATUS de_queue(p_can_queue_tag p_queue,
  80. p_pdu_tag p_data)
  81. { /* 插入元素e为Q的新的队尾元素 */
  82. // if ((p_queue->tail + 1) % MAX_QSIZE == p_queue->head) /* 队列满 */
  83. // return ERROR;
  84. // p_queue->can_message[p_queue->tail] = e;
  85. // p_queue->tail = (p_queue->tail + 1) % MAX_QSIZE;
  86. // return SUCCESS;
  87. if (queue_empty(p_queue))
  88. return Q_EMPTY;
  89. *p_data = p_queue->can_message[p_queue->tail];
  90. p_queue->tail = (p_queue->tail + 1) % MAX_QSIZE;
  91. p_queue->count--;
  92. return Q_OK;
  93. }