queue.c 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /************************************************************************
  2. Project: Welling Motor Control Paltform
  3. Filename: queue.c
  4. Partner Filename: queue.h
  5. Description: The math function
  6. Complier: IAR Embedded Workbench for ARM 7.80, IAR Systems.
  7. CPU TYPE : GD32F3x0
  8. *************************************************************************
  9. Copyright (c) 2018 Welling Motor Technology(Shanghai) Co. Ltd.
  10. All rights reserved.
  11. *************************************************************************
  12. *************************************************************************
  13. Revising History (ECL of this file):
  14. ************************************************************************/
  15. /************************************************************************
  16. Beginning of File, do not put anything above here except notes
  17. Compiler Directives:
  18. *************************************************************************/
  19. #ifndef _QUEUE_C_
  20. #define _QUEUE_C_
  21. #endif
  22. /************************************************************************
  23. Included File:
  24. *************************************************************************/
  25. #include "queue.h"
  26. #include "string.h"
  27. /******************************************************************************************************************************************************
  28. ** \brief parameter
  29. ******************************************************************************************************************************************************/
  30. ERROR_LOG que_stErrorLog;
  31. FLASH_ERROR_QUEUE que_stFlashErrorLog;
  32. /******************************************************************************************************************************************************
  33. ** \brief
  34. ******************************************************************************************************************************************************/
  35. void que_voInit(FLASH_ERROR_QUEUE *Q)
  36. {
  37. Q->ubHead = 0;
  38. Q->ubRear = 0;
  39. memset(Q->stLog, 0, sizeof(ERROR_LOG) * QUEUE_SIZE);
  40. }
  41. /******************************************************************************************************************************************************
  42. ** \brief
  43. ******************************************************************************************************************************************************/
  44. static BOOL que_fgEmpty(const FLASH_ERROR_QUEUE *Q)
  45. {
  46. BOOL ret = FALSE;
  47. if (Q->ubHead == Q->ubRear)
  48. {
  49. ret = TRUE;
  50. }
  51. return ret;
  52. }
  53. /******************************************************************************************************************************************************
  54. ** \brief
  55. ** \return
  56. ******************************************************************************************************************************************************/
  57. static BOOL que_fgFull(const FLASH_ERROR_QUEUE *Q)
  58. {
  59. BOOL ret = FALSE;
  60. if (((Q->ubHead - Q->ubRear) + QUEUE_SIZE) % QUEUE_SIZE == 1)
  61. {
  62. ret = TRUE;
  63. }
  64. return ret;
  65. }
  66. /******************************************************************************************************************************************************
  67. ** \brief
  68. ******************************************************************************************************************************************************/
  69. static UBYTE que_voEnter(FLASH_ERROR_QUEUE *Q, ERROR_LOG x)
  70. {
  71. memcpy(&(Q->stLog[Q->ubRear]), &x, sizeof(ERROR_LOG));
  72. Q->ubRear = (Q->ubRear + 1) % QUEUE_SIZE;
  73. if (que_fgFull(Q) != FALSE) //队列满,覆盖队头数据
  74. {
  75. Q->ubHead = (Q->ubHead + 1) % QUEUE_SIZE;
  76. return (UBYTE)0;
  77. }
  78. else
  79. {
  80. return (UBYTE)1;
  81. }
  82. }
  83. /******************************************************************************************************************************************************
  84. ** \brief
  85. ** \return if queue is empty return 0 ,if not return 1
  86. ******************************************************************************************************************************************************/
  87. static UBYTE que_voDelete(FLASH_ERROR_QUEUE *Q, ERROR_LOG *dat)
  88. {
  89. if (que_fgEmpty(Q) != FALSE)
  90. {
  91. return (UBYTE)0;
  92. }
  93. *dat = Q->stLog[Q->ubHead];
  94. Q->ubHead = (Q->ubHead + 1) % QUEUE_SIZE;
  95. return (UBYTE)1;
  96. }
  97. /******************************************************************************************************************************************************
  98. ** \brief
  99. ******************************************************************************************************************************************************/
  100. UBYTE que_ubPushIn(FLASH_ERROR_QUEUE *Q, const ERROR_LOG *rxdata, UBYTE length)
  101. {
  102. for (UBYTE i = 0; i < length; i++)
  103. {
  104. que_voEnter(Q, *rxdata);
  105. rxdata++;
  106. }
  107. return (UBYTE)1;
  108. }
  109. /******************************************************************************************************************************************************
  110. ** \brief Variable Defination
  111. ******************************************************************************************************************************************************/
  112. UBYTE que_ubPopOut(FLASH_ERROR_QUEUE *Q, ERROR_LOG buf[], UBYTE length)
  113. {
  114. if (que_fgEmpty(Q) != FALSE)
  115. {
  116. return (UBYTE)0;
  117. }
  118. for (UBYTE i = 0; i < length; i++)
  119. {
  120. que_voDelete(Q, &buf[i]);
  121. }
  122. return (UBYTE)1;
  123. }
  124. /******************************************************************************************************************************************************
  125. ** @brief
  126. ** @param[in]
  127. ** @Param[out]
  128. ** @returns
  129. ******************************************************************************************************************************************************/
  130. /******************************************************************************************************************************************************
  131. ** end of file
  132. ******************************************************************************************************************************************************/