MsgQueue.c 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. /********************************************************************************
  2. * File Name: MsgQueue.c
  3. * Function Describe: 共享消息数据缓冲区的消息队列
  4. * Explain:
  5. 此消息队列是一个环形数据结构,可以接受消息入队列,并提取消息出队列,队列最多可容纳MSG_QUEUE_NUM_MAX个消息
  6. 每个消息队列使用一个环形结构的消息数据缓冲区,该消息队列内的所有消息将共用此数据缓冲区
  7. 适用于串口接收的数据处理,尤其适用于与模块的串口接收数据处理。
  8. 用法:
  9. 先定义消息队列SUT_MSG_QUEUE实例,并定义存放消息数据缓冲区实例
  10. 然后用MsgQueueInit初始化消息队列
  11. 用MsgQueuePost将消息入队列,入队列时将拷贝消息的数据内容到SUT_MSG_QUEUE实例的数据缓冲区中。
  12. 用MsgQueueAccept将从队列中取消息,取消息时将从数据缓冲区中拷贝数据到指定的其他非环形缓冲区,以便处理消息
  13. * Writer: ShiLiangWen
  14. * Date: 2015-7-2
  15. *******************************************************************************/
  16. #define THIS_FILE_ID 5
  17. /********************************************************************************/
  18. #include "includes.h"
  19. unsigned char msgBuffer[MSG_DATA_BUF_LEN];
  20. SUT_MSG_QUEUE msgQue;
  21. /********************************************************************************************
  22. *
  23. *********************************************************************************************/
  24. void MsgQueueSet(void)
  25. {
  26. MsgQueueInit((void *)msgBuffer,MSG_DATA_BUF_LEN);
  27. }
  28. /********************************************************************************************
  29. *
  30. *********************************************************************************************/
  31. void MsgQueueInit(char *pDataBuffer,unsigned short DataBufferLenMax)
  32. {
  33. int i;
  34. SUT_MSG_QUEUE *pMsgQueue = &msgQue;
  35. pMsgQueue->MsgIn=0;
  36. pMsgQueue->MsgNum=0;
  37. pMsgQueue->MsgOut=0;
  38. for(i=0;i<MSG_QUEUE_NUM_MAX;i++){
  39. pMsgQueue->MsgQueue[i].DataStartIndex=0;
  40. pMsgQueue->MsgQueue[i].MsgLen=0;
  41. }
  42. //
  43. pMsgQueue->DataBuffer=pDataBuffer;
  44. for(i=0;i<DataBufferLenMax;i++)pMsgQueue->DataBuffer[i]=0;
  45. pMsgQueue->DataBufferLenMax=DataBufferLenMax;
  46. pMsgQueue->DataBufferIn=0;
  47. pMsgQueue->DataBufferOut=0;
  48. pMsgQueue->DataBufferLen=0;
  49. }
  50. /********************************************************************************************
  51. *
  52. *********************************************************************************************/
  53. int MsgQueuePost(char *pData,unsigned short DataLen)
  54. {
  55. SUT_MSG_QUEUE *pMsgQueue = &msgQue;
  56. unsigned short i;
  57. //队列满,不允许再入队列
  58. //SlwTrace(INF, "in MSQ\r\n");
  59. if(pMsgQueue->MsgNum>=MSG_QUEUE_NUM_MAX){
  60. SlwTrace(INF, "MsgQueue full!\r\n");
  61. return -1;
  62. }
  63. //数据缓冲区不够,不允许入队列
  64. if((DataLen+pMsgQueue->DataBufferLen)>pMsgQueue->DataBufferLenMax){
  65. SlwTrace(INF,"DataBuffer full!\r\n");
  66. return -2;
  67. }
  68. //消息入队列
  69. pMsgQueue->MsgQueue[pMsgQueue->MsgIn].DataStartIndex=pMsgQueue->DataBufferIn;
  70. pMsgQueue->MsgQueue[pMsgQueue->MsgIn].MsgLen=DataLen;
  71. //消息数据入缓冲区
  72. for(i=0;i<DataLen;i++){
  73. pMsgQueue->DataBuffer[pMsgQueue->DataBufferIn]=pData[i];
  74. pMsgQueue->DataBufferIn++;
  75. if(pMsgQueue->DataBufferIn>=MSG_DATA_BUF_LEN)pMsgQueue->DataBufferIn=0;
  76. pMsgQueue->DataBufferLen++;
  77. }
  78. //消息个数增加
  79. pMsgQueue->MsgIn++;
  80. if(pMsgQueue->MsgIn>=MSG_QUEUE_NUM_MAX)pMsgQueue->MsgIn=0;
  81. pMsgQueue->MsgNum++;
  82. return 0;
  83. }
  84. /********************************************************************************************
  85. 提取pMsgQueue消息,并放入pBuf中,给定pBuf空间长度为BufLen
  86. 返回r:
  87. r=0 --无消息
  88. r>0 --有消息,并已拷贝消息数据到pData,r为消息数据长度
  89. r<0 --有消息,但接受数据缓冲区长度不够
  90. *********************************************************************************************/
  91. int MsgQueueAccept(char *pBuf,unsigned short BufLen)
  92. {
  93. SUT_MSG_QUEUE *pMsgQueue = &msgQue;
  94. unsigned short i,j;
  95. char data;
  96. SUT_MESSAGE msg;
  97. if(pMsgQueue->MsgNum==0)return 0;
  98. //SlwTrace(INF, "out MSQ\r\n");
  99. if(g_ucModemTaskEn==1)
  100. {
  101. printf("STOP GO XH\r\n");
  102. while(1){
  103. os_dly_wait(20);
  104. }
  105. }
  106. msg.MsgLen = pMsgQueue->MsgQueue[pMsgQueue->MsgOut].MsgLen;
  107. msg.DataStartIndex = pMsgQueue->MsgQueue[pMsgQueue->MsgOut].DataStartIndex;
  108. j=0;
  109. for(i=0;i<msg.MsgLen;i++){
  110. if(0==pMsgQueue->DataBufferLen)break;
  111. data=pMsgQueue->DataBuffer[pMsgQueue->DataBufferOut];
  112. pMsgQueue->DataBufferOut++;
  113. if(pMsgQueue->DataBufferOut>=pMsgQueue->DataBufferLenMax)pMsgQueue->DataBufferOut=0;
  114. pMsgQueue->DataBufferLen--;
  115. if(j<BufLen)pBuf[j++]=data;
  116. }
  117. pMsgQueue->MsgOut++;
  118. if(pMsgQueue->MsgOut>=MSG_QUEUE_NUM_MAX)pMsgQueue->MsgOut=0;
  119. pMsgQueue->MsgNum--;
  120. if(i!=msg.MsgLen){
  121. return -2;//Databuffer len error!
  122. }
  123. if(msg.MsgLen>BufLen){
  124. return -1;
  125. }else{
  126. return msg.MsgLen;
  127. }
  128. }
  129. /********************************************************************************************
  130. *
  131. *********************************************************************************************/