queue.c 7.3 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. /******************************************************************************************************************************************************
  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, 0xFFFFFFFF, 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. que_ubIndexIncrease(Q, &(Q->stLog[Q->ubRear].ErrorIndex));
  73. Q->ubRear = (Q->ubRear + 1) % QUEUE_SIZE;
  74. if (que_fgFull(Q) != FALSE) //队列满,覆盖队头数据
  75. {
  76. Q->ubHead = (Q->ubHead + 1) % QUEUE_SIZE;
  77. return (UBYTE)0;
  78. }
  79. else
  80. {
  81. return (UBYTE)1;
  82. }
  83. }
  84. /******************************************************************************************************************************************************
  85. ** \brief
  86. ** \return if queue is empty return 0 ,if not return 1
  87. ******************************************************************************************************************************************************/
  88. static UBYTE que_voDelete(FLASH_ERROR_QUEUE *Q, ERROR_LOG *dat)
  89. {
  90. if (que_fgEmpty(Q) != FALSE)
  91. {
  92. return (UBYTE)0;
  93. }
  94. *dat = Q->stLog[Q->ubHead];
  95. Q->ubHead = (Q->ubHead + 1) % QUEUE_SIZE;
  96. return (UBYTE)1;
  97. }
  98. /******************************************************************************************************************************************************
  99. ** \brief
  100. ******************************************************************************************************************************************************/
  101. UBYTE que_ubPushIn(FLASH_ERROR_QUEUE *Q, const ERROR_LOG *rxdata, UBYTE length)
  102. {
  103. for (UBYTE i = 0; i < length; i++)
  104. {
  105. que_voEnter(Q, *rxdata);
  106. rxdata++; /* parasoft-suppress MISRA2004-17_1 "本项目无法更改,后续避免未指向数组的指针运算" */ /* parasoft-suppress MISRA2004-17_4 "本项目无法更改,后续避免非数组索引指针运算" */
  107. }
  108. return (UBYTE)1;
  109. }
  110. /******************************************************************************************************************************************************
  111. ** \brief Variable Defination
  112. ******************************************************************************************************************************************************/
  113. UBYTE que_ubPopOut(FLASH_ERROR_QUEUE *Q, ERROR_LOG buf[], UBYTE length)
  114. {
  115. if (que_fgEmpty(Q) != FALSE)
  116. {
  117. return (UBYTE)0;
  118. }
  119. for (UBYTE i = 0; i < length; i++)
  120. {
  121. que_voDelete(Q, &buf[i]);
  122. }
  123. return (UBYTE)1;
  124. }
  125. /******************************************************************************************************************************************************
  126. ** \brief
  127. ******************************************************************************************************************************************************/
  128. void que_ubIndexIncrease(FLASH_ERROR_QUEUE *Q, UWORD* ErrorIndex)
  129. {
  130. UBYTE i;
  131. UWORD Temp16;
  132. UWORD Index_pre = 0;
  133. for(i=0; i< QUEUE_SIZE; i++)
  134. {
  135. Temp16 = Q->stLog[i].ErrorIndex;
  136. if(Temp16 == 0xFFFF)
  137. {
  138. //确定当前故障的序列号
  139. if(i == 0)
  140. {
  141. *ErrorIndex = 1;
  142. }
  143. else
  144. {
  145. *ErrorIndex = Q->stLog[i-1].ErrorIndex + 1;
  146. }
  147. return ;
  148. }
  149. else if(Index_pre > Temp16)
  150. {
  151. *ErrorIndex = Index_pre + 1;
  152. return ;
  153. }
  154. else
  155. {
  156. Index_pre = Temp16;
  157. }
  158. }
  159. *ErrorIndex = Index_pre + 1;
  160. }
  161. /******************************************************************************************************************************************************
  162. ** @brief
  163. ** @param[in]
  164. ** @Param[out]
  165. ** @returns
  166. ******************************************************************************************************************************************************/
  167. /******************************************************************************************************************************************************
  168. ** end of file
  169. ******************************************************************************************************************************************************/