FreeRTOS Support Archive
The FreeRTOS support forum is used to obtain active support directly from Real
Time Engineers Ltd. In return for using our top quality software and services for
free, we request you play fair and do your bit to help others too! Sign up
to receive notifications of new support topics then help where you can.
This is a read only archive of threads posted to the FreeRTOS support forum.
The archive is updated every week, so will not always contain the very latest posts.
Use these archive pages to search previous posts. Use the Live FreeRTOS Forum
link to reply to a post, or start a new support thread.
[FreeRTOS Home] [Live FreeRTOS Forum] [FAQ] [Archive Top] [September 2015 Threads]
Hi I have a problem that it takes a long time to resume a task when i call ”xTaskResumeFromISR” from within a interrupt. It takes at least 7ms from that I call ”xTaskResumeFromISR” to that the task starts executing. The delay time slowly increases to over 100ms.
If i call vTaskResume from another task the task resumes immediately. I only have one interrupt on and only one other task that only contains a while loop and vTaskDelay(100/portTICKRATEMS);. (if I don’t have another task I can’t run the program for some reason)
program:
main:
{
xTaskCreate( taskB, ( signed char * ) "taskB", configMINIMALSTACKSIZE, NULL, 2, NULL );
xTaskCreate( CANControlTask, ( signed char * ) "CControl", configMINIMALSTACK_SIZE, NULL, 1, &canHandle );
// FreeRTOS start
vTaskStartScheduler();
}
void CANControlTask( void* pdata )
{
CANConfig();
while (1)
{
CANReceiveRoutine();
vTaskSuspend( NULL );
// ulTaskNotifyTake( pdTRUE, (10000/portTICKRATEMS) );
}
}
void CANRXInterrupt( void )
{
BaseType_t xHigherPriorityTaskWoken = pdTRUE;
IO_OkStatusLedOn();
if (CAN_GetITStatus(CANx, CAN_IT_FMP0) != RESET)
{
.......................................
xTaskResumeFromISR( canHandle );
// vTaskNotifyGiveFromISR( canHandle , &xHigherPriorityTaskWoken );
CAN_ClearITPendingBit(CANx, CAN_IT_FMP0);
}
}
Does anyone know why this happens and how to fix it?
Same thing happens when I use “ulTaskNotifyTake” and “vTaskNotifyGiveFromISR”
When I run my program In CoOS I don’t get this problem.
Info about platform: MCU: stm32f407: IDE: coocox 2.0.3. toolchain: gcc 4.8 2004. RTOS: FreeRTOS V8.2.2
Please read the documentation for the xTaskResumeFromISR() as it tells you two things:
1) Don't use the function to synchornise a task with an interrupt - it is dangerous and can lead to missed interrupts as it does not latch interrupts (like a semphore or task notification would). That might be what your problem is.
2) Use the function's return value to know if a context switch is required:
xYieldRequired = xTaskResumeFromISR( handle );
portYIELDFROMISR( xYieldRequired );
Yep that fixed it!!
I had totally missed that the “portYIELDFROMISR” function existed.
Thank you very much for a fast reply
:)
Buy the book, it will save you days of fiddling around !!!
Alain
Em 21-09-2015 09:50, Jimmie Hansson escreveu:
>
> Yep that fixed it!!
>
> I had totally missed that the “portYIELDFROMISR” function existed.
> Thank you very much for a fast reply
> :)
>
> ------------------------------------------------------------------------
>
> Resuming task from interrupt delay problem
> https://sourceforge.net/p/freertos/discussion/382005/thread/842d6424/?limit=250#941c
>
> ------------------------------------------------------------------------
>
> Sent from sourceforge.net because you indicated interest in
> https://sourceforge.net/p/freertos/discussion/382005/
>
> To unsubscribe from further messages, please visit
> https://sourceforge.net/auth/subscriptions/
>
Copyright (C) Amazon Web Services, Inc. or its affiliates. All rights reserved.