2016-08-16 02:45 AM
hi, i am using STM32F746G-Disco in that i have receiving a 16 byte of data from other device,which can be get at interrupt . problem: i have created two threads for GUI and Uart Thread, in that uart thread i have i amcontinuously polling for uart data has receivedcompletely. Is there is anypossibility for resume task from whenever complete packet received from interrupt given below. i have tried below code it was hangs some where can any one help me this issue regards rajesh i have two threads 1. GUI and uart thread /* uart thread that resumes from interrupt when data buffer fills in uart RX. */ static void
UartThread(
void const* argument )
{static
uint8_t taskState = FALSE;
if
(taskState == TRUE)
{
taskState = FALSE;
while
(1)
{
HAL_Delay(100);
BSP_LED_Toggle(LED_GREEN);
}
}
else
{
if
(HAL_UART_Receive_IT(&UartHandle, (uint8_t *) aRxBuffer, 16) != HAL_OK)
{
}
else
{
vTaskSuspend(NULL);
taskState = TRUE;
}
}
} /**** uart rx call back function *****/ voidHAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{if
(huart->RxXferCount == 0x00)
{
vTaskResume(uartTaskhandle);
}
else
{
#st32f46g2016-08-16 04:13 PM
Hi,
A couple of things. 1) you should declare taskState with the volatile keyword so that the compiler doesn't optimise it away, leaving you with taskState always equal to 'false' 2)Is vTaskSuspend() interrupt safe? The documentation doesn't say it is, which means you should assume that it is not. What you should do is either use a semaphore, or a queue. FreeRTOS has ISR safe Queue/Sem functions. The ISR posts to the Sem or Queue when it has data. The task will be blocked waiting on the Queue/Sem. It will unblock when data arrives and you can process it. If your data arriving via the USART is small in size, you could copy it into the Queue and process it safely in UartThread(). Glenn2016-08-17 10:48 AM
Suspend and resume only control whether a task is available for scheduling. It doesn't actually cause the task to execute. You should use an event to block the task when it's idle and unblock when it needs to complete the interrupt. A semaphore or direct notification in later versions should work for an interrupt completion.
Jack Peacock
2016-08-19 07:07 AM
Hi,
In my opinion you are using the wrong way for data transfer. There are 2 ways to solve the problem.1.) Use message queue. you define a queue with size of max transfer length and in callback you put the data into message queue and in the task you read so long from queue until you get a message then use the data from queue for doing your job.2.) Use binary semaphore. You define a baniary semaphore which is given by callback and taken by task which do the job. The job task hangs so long until the semaphore is given.Its not a good way to use suspend task for waiting for an event.RegardsOsto