Guest User

Untitled

a guest
Dec 13th, 2017
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.24 KB | None | 0 0
  1. #define RXBUFFERSIZE 64
  2. #define PARSESIZE 128
  3.  
  4. char aRxBuffer[RXBUFFERSIZE];
  5. char parsebuffer[PARSESIZE];
  6. volatile size_t writes,write_length;
  7.  
  8. static int BufferCmp(char* pBuffer1,char* pBuffer2,size_t pBufferLength)
  9. {
  10. while(pBufferLength--)
  11. {
  12. if(*pBuffer1 != *pBuffer2)
  13. {
  14.  
  15. return -1;
  16. }
  17. pBuffer1++;
  18. pBuffer2++;
  19. }
  20. return 0;
  21. }
  22.  
  23.  
  24. static void* BufferSearch(char* bf1,size_t size,char* bf2,size_t length)
  25. {
  26. const unsigned char* haystack=(const unsigned char*)bf1;
  27. const unsigned char* needle=(const unsigned char*)bf2;
  28.  
  29. if(length==0)
  30. return 0;
  31. while(length <= size)
  32. {
  33. if(!BufferCmp(haystack,needle,length))
  34. return (void*) haystack;
  35. haystack++;
  36. size--;
  37. }
  38. return NULL;
  39. }
  40.  
  41.  
  42. void DMA1_Stream1_IRQHandler(void)
  43. {
  44. volatile size_t len,copyindex;
  45. uint8_t* ptr;
  46.  
  47. if(DMA1->LISR & DMA_FLAG_TCIF1)
  48. DMA1->LIFCR = DMA_FLAG_TCIF1;
  49.  
  50. len = (uint32_t)RXBUFFERSIZE - DMA1_Stream1->NDTR;
  51. copyindex=(uint32_t)PARSESIZE - writes;
  52.  
  53. if(copyindex > len)
  54. copyindex=len;
  55. else if(copyindex < len)
  56. {
  57. writes=0;
  58. copyindex=len;
  59. }
  60.  
  61. ptr=aRxBuffer;
  62. memcpy(&parsebuffer[writes],ptr,len);
  63.  
  64. writes+=copyindex;
  65. write_length += len;
  66. len-=copyindex;
  67. ptr+=copyindex;
  68.  
  69. BaseType_t xHigherPriorityTaskWoken;
  70.  
  71. xHigherPriorityTaskWoken=pdFALSE;
  72.  
  73. xSemaphoreGiveFromISR(parse,&xHigherPriorityTaskWoken);
  74.  
  75. DMA1->LIFCR=DMA_FLAG_DMEIF1 | DMA_FLAG_FEIF1 | DMA_FLAG_TEIF1 | DMA_FLAG_TCIF1 | DMA_FLAG_HTIF1;
  76. DMA1_Stream1->M0AR=(uint32_t)aRxBuffer;
  77. DMA1_Stream1->NDTR=(uint32_t)RXBUFFERSIZE;
  78. DMA1_Stream1->CR |= DMA_SxCR_EN;
  79.  
  80.  
  81.  
  82. portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
  83. }
  84.  
  85. void vTask_parse(void* pvParameters)
  86. {
  87. const TickType_t MaxBlock =pdMS_TO_TICKS(20);
  88. char comm[2]={'O','K'};
  89. for(;;)
  90. {
  91. //GPIOG->ODR ^= GPIO_Pin_13;
  92. if(xSemaphoreTake(parse,MaxBlock)==pdPASS)
  93. {
  94.  
  95. if(!synced)
  96. {
  97. __disable_irq();
  98. if(!BufferSearch(&parsebuffer[0],PARSESIZE,comm,2))
  99. {
  100. Putc_ax('r');
  101. //GPIOG->ODR ^= GPIO_Pin_13;
  102. }
  103. else
  104. {
  105. Puts_term("Syncedrn"); //Message to the terminal USART
  106. synced=1;
  107. GPIOG->ODR ^= GPIO_Pin_13;
  108. }
  109. __enable_irq();
  110. }
  111. }
  112. }
  113. }
  114.  
  115. int main()
  116. {
  117. parse=xSemaphoreCreateBinary();
  118. GPIO_Config();
  119. synced=0;
  120. USART6_Config(); //Initializes the Terminal usart
  121. USART3DMA_Config();
  122.  
  123. xTaskCreate(vTask_parse,"parse",256,NULL,1,NULL);
  124. xTaskCreate(vTask2,"vTask2",100,NULL,1,NULL);
  125.  
  126. vTaskStartScheduler();
  127.  
  128. for(;;);
  129. }
Add Comment
Please, Sign In to add comment