Hello,
I´ve got some “problems” with the named topic. I using a task to calculate some date which i get from an ISR. When the task is blocked with vTaskDelay it works without problems, but i want to start the task only when it get a ready state from the ISR.
This is realized with xSemaphoreGiveFromISR() and in the task with an if – request and xSemaphoreTake(). The problem is, that i can´t stop this task, when it once jumped into the task, which uses the xSemaphoreTake().
In the ISR there is also a context switch with portEND_SWITCHING_ISR() because the unblocked task has the highest priority.
The second problem is, it seems, that after starting the scheduler he goes to the blocked task and don´t stop at the “if – semaphore – request”?
Does any know this problem? I using the Version 5.2.0 of FreeRTOS
Stephan
Using an ISR – Semaphore to unblock a task
Using an ISR – Semaphore to unblock a task
Hello,
according to the first problem, i have found the reason. It has nothing to do with FreeRTOS…
But how can i avoid, that the task will run one time after starting the scheduler?
But how can i avoid, that the task will run one time after starting the scheduler?
Using an ISR – Semaphore to unblock a task
Take the semaphore before entering the task loop.
void atask( void *p )
{
xSemaphoreTake(sem,0); // dont block
while(1)
{
xSemaphoreTake(sem,max_delay); // now you will block here because the semaphore is not available
// do something
}
}
Using an ISR – Semaphore to unblock a task
Thank you for this information, it works…