Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define RXBUFFERSIZE 64
- #define PARSESIZE 128
- char aRxBuffer[RXBUFFERSIZE];
- char parsebuffer[PARSESIZE];
- volatile size_t writes,write_length;
- static int BufferCmp(char* pBuffer1,char* pBuffer2,size_t pBufferLength)
- {
- while(pBufferLength--)
- {
- if(*pBuffer1 != *pBuffer2)
- {
- return -1;
- }
- pBuffer1++;
- pBuffer2++;
- }
- return 0;
- }
- static void* BufferSearch(char* bf1,size_t size,char* bf2,size_t length)
- {
- const unsigned char* haystack=(const unsigned char*)bf1;
- const unsigned char* needle=(const unsigned char*)bf2;
- if(length==0)
- return 0;
- while(length <= size)
- {
- if(!BufferCmp(haystack,needle,length))
- return (void*) haystack;
- haystack++;
- size--;
- }
- return NULL;
- }
- void DMA1_Stream1_IRQHandler(void)
- {
- volatile size_t len,copyindex;
- uint8_t* ptr;
- if(DMA1->LISR & DMA_FLAG_TCIF1)
- DMA1->LIFCR = DMA_FLAG_TCIF1;
- len = (uint32_t)RXBUFFERSIZE - DMA1_Stream1->NDTR;
- copyindex=(uint32_t)PARSESIZE - writes;
- if(copyindex > len)
- copyindex=len;
- else if(copyindex < len)
- {
- writes=0;
- copyindex=len;
- }
- ptr=aRxBuffer;
- memcpy(&parsebuffer[writes],ptr,len);
- writes+=copyindex;
- write_length += len;
- len-=copyindex;
- ptr+=copyindex;
- BaseType_t xHigherPriorityTaskWoken;
- xHigherPriorityTaskWoken=pdFALSE;
- xSemaphoreGiveFromISR(parse,&xHigherPriorityTaskWoken);
- DMA1->LIFCR=DMA_FLAG_DMEIF1 | DMA_FLAG_FEIF1 | DMA_FLAG_TEIF1 | DMA_FLAG_TCIF1 | DMA_FLAG_HTIF1;
- DMA1_Stream1->M0AR=(uint32_t)aRxBuffer;
- DMA1_Stream1->NDTR=(uint32_t)RXBUFFERSIZE;
- DMA1_Stream1->CR |= DMA_SxCR_EN;
- portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
- }
- void vTask_parse(void* pvParameters)
- {
- const TickType_t MaxBlock =pdMS_TO_TICKS(20);
- char comm[2]={'O','K'};
- for(;;)
- {
- //GPIOG->ODR ^= GPIO_Pin_13;
- if(xSemaphoreTake(parse,MaxBlock)==pdPASS)
- {
- if(!synced)
- {
- __disable_irq();
- if(!BufferSearch(&parsebuffer[0],PARSESIZE,comm,2))
- {
- Putc_ax('r');
- //GPIOG->ODR ^= GPIO_Pin_13;
- }
- else
- {
- Puts_term("Syncedrn"); //Message to the terminal USART
- synced=1;
- GPIOG->ODR ^= GPIO_Pin_13;
- }
- __enable_irq();
- }
- }
- }
- }
- int main()
- {
- parse=xSemaphoreCreateBinary();
- GPIO_Config();
- synced=0;
- USART6_Config(); //Initializes the Terminal usart
- USART3DMA_Config();
- xTaskCreate(vTask_parse,"parse",256,NULL,1,NULL);
- xTaskCreate(vTask2,"vTask2",100,NULL,1,NULL);
- vTaskStartScheduler();
- for(;;);
- }
Add Comment
Please, Sign In to add comment