queue.c 7.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  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. #include "typedefine.h"
  28. /******************************************************************************************************************************************************
  29. ** \brief parameter
  30. ******************************************************************************************************************************************************/
  31. ERROR_LOG que_stErrorLog;
  32. FLASH_ERROR_QUEUE que_stFlashErrorLog;
  33. /******************************************************************************************************************************************************
  34. ** \brief
  35. ******************************************************************************************************************************************************/
  36. void que_voInit(FLASH_ERROR_QUEUE *Q)
  37. {
  38. Q->ubHead = 0;
  39. Q->ubRear = 0;
  40. memset(Q->stLog, 0xFFFFFFFF, sizeof(ERROR_LOG) * QUEUE_SIZE);
  41. }
  42. /******************************************************************************************************************************************************
  43. ** \brief
  44. ******************************************************************************************************************************************************/
  45. static BOOL que_fgEmpty(const FLASH_ERROR_QUEUE *Q)
  46. {
  47. BOOL ret = FALSE;
  48. if (Q->ubHead == Q->ubRear)
  49. {
  50. ret = TRUE;
  51. }
  52. return ret;
  53. }
  54. /******************************************************************************************************************************************************
  55. ** \brief
  56. ** \return
  57. ******************************************************************************************************************************************************/
  58. static BOOL que_fgFull(const FLASH_ERROR_QUEUE *Q)
  59. {
  60. BOOL ret = FALSE;
  61. if (((Q->ubHead - Q->ubRear) + QUEUE_SIZE) % QUEUE_SIZE == 1)
  62. {
  63. ret = TRUE;
  64. }
  65. return ret;
  66. }
  67. /******************************************************************************************************************************************************
  68. ** \brief
  69. ******************************************************************************************************************************************************/
  70. static UBYTE que_voEnter(FLASH_ERROR_QUEUE *Q, ERROR_LOG x)
  71. {
  72. memcpy(&(Q->stLog[Q->ubRear]), &x, sizeof(ERROR_LOG));
  73. que_ubIndexIncrease(Q, &(Q->stLog[Q->ubRear].ErrorIndex));
  74. Q->ubRear = (Q->ubRear + 1) % QUEUE_SIZE;
  75. if (que_fgFull(Q) != FALSE) //队列满,覆盖队头数据
  76. {
  77. Q->ubHead = (Q->ubHead + 1) % QUEUE_SIZE;
  78. return (UBYTE)0;
  79. }
  80. else
  81. {
  82. return (UBYTE)1;
  83. }
  84. }
  85. /******************************************************************************************************************************************************
  86. ** \brief
  87. ** \return if queue is empty return 0 ,if not return 1
  88. ******************************************************************************************************************************************************/
  89. static UBYTE que_voDelete(FLASH_ERROR_QUEUE *Q, ERROR_LOG *dat)
  90. {
  91. if (que_fgEmpty(Q) != FALSE)
  92. {
  93. return (UBYTE)0;
  94. }
  95. *dat = Q->stLog[Q->ubHead];
  96. Q->ubHead = (Q->ubHead + 1) % QUEUE_SIZE;
  97. return (UBYTE)1;
  98. }
  99. /******************************************************************************************************************************************************
  100. ** \brief
  101. ******************************************************************************************************************************************************/
  102. UBYTE que_ubPushIn(FLASH_ERROR_QUEUE *Q, const ERROR_LOG *rxdata, UBYTE length)
  103. {
  104. for (UBYTE i = 0; i < length; i++)
  105. {
  106. que_voEnter(Q, *rxdata);
  107. rxdata++;
  108. }
  109. return (UBYTE)1;
  110. }
  111. /******************************************************************************************************************************************************
  112. ** \brief Variable Defination
  113. ******************************************************************************************************************************************************/
  114. UBYTE que_ubPopOut(FLASH_ERROR_QUEUE *Q, ERROR_LOG buf[], UBYTE length)
  115. {
  116. if (que_fgEmpty(Q) != FALSE)
  117. {
  118. return (UBYTE)0;
  119. }
  120. for (UBYTE i = 0; i < length; i++)
  121. {
  122. que_voDelete(Q, &buf[i]);
  123. }
  124. return (UBYTE)1;
  125. }
  126. /******************************************************************************************************************************************************
  127. ** \brief
  128. ******************************************************************************************************************************************************/
  129. void que_ubIndexIncrease(FLASH_ERROR_QUEUE *Q, UWORD* ErrorIndex)
  130. {
  131. UBYTE i;
  132. UWORD Temp16;
  133. UWORD Index_pre = 0;
  134. for(i=0; i< QUEUE_SIZE; i++)
  135. {
  136. Temp16 = Q->stLog[i].ErrorIndex;
  137. if(Temp16 == 0xFFFF)
  138. {
  139. //确定当前故障的序列号
  140. if(i == 0)
  141. {
  142. *ErrorIndex = 1;
  143. }
  144. else
  145. {
  146. *ErrorIndex = Q->stLog[i-1].ErrorIndex + 1;
  147. }
  148. return ;
  149. }
  150. else if(Index_pre > Temp16)
  151. {
  152. *ErrorIndex = Index_pre + 1;
  153. return ;
  154. }
  155. else
  156. {
  157. Index_pre = Temp16;
  158. }
  159. }
  160. *ErrorIndex = Index_pre + 1;
  161. }
  162. /******************************************************************************************************************************************************
  163. ** @brief
  164. ** @param[in]
  165. ** @Param[out]
  166. ** @returns
  167. ******************************************************************************************************************************************************/
  168. /******************************************************************************************************************************************************
  169. ** end of file
  170. ******************************************************************************************************************************************************/