execution ends in prvTaskExitError(void) function.

karthik366 wrote on Monday, March 24, 2014:

i am running freertos with 3 tasks on msp430 initially and now i ported the code to stm32l152cb(stm32l152xb family) but here the execution ends in prvTaskExitError(void) how to solve this problem , the function definition is
static void prvTaskExitError( void )
{
/* A function that implements a task must not exit or attempt to return to
its caller as there is nothing to return to. If a task wants to exit it
should instead call vTaskDelete( NULL ).

Artificially force an assert() to be triggered if configASSERT() is
defined, then stop here so application writers can catch the error. */
configASSERT( uxCriticalNesting == ~0UL );
portDISABLE_INTERRUPTS();
for( ;; );

}

Does this mean that my tasks exit in between by returning some value.one of the tasks handles usart interrupts and other tasks resolve them. please throw some light on this

rtel wrote on Monday, March 24, 2014:

prvTaskExitError() will be called if a task attempts to exit from its implementing function. See http://www.freertos.org/implementing-a-FreeRTOS-task.html

As you are using an STM32 make sure you call have configASSERT() defined and that you call NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 ). See:
http://www.freertos.org/RTOS-Cortex-M3-M4.html

Regards.

karthik366 wrote on Tuesday, March 25, 2014:

yes i am using NVIC_PriorityGroupConfig( NVIC_PriorityGroup_4 ).
you mean #define configASSERT( x ) in FreeRTOS.h file? i didnt get it , where can i find some example of such assertion function.
thanks for reply

rtel wrote on Tuesday, March 25, 2014:

The easiest way to cause your program to halt when assert is called is to just add the following line to FreeRTOSConfig.h

#define configASSERT( x ) if( x == 0 ) { taskDISABLE_INTERRUPTS(); for(;;); }

The traditional way of defining assert() is to pass the file name and line number into a function, in which case you would define as follows in FreeRTOSConfig.h:

void vAssertCalled( const char * pcFile, unsigned long ulLine );
#define configASSERT(x) if((x)==0 ) vAssertCalled( __FILE__, __LINE__ );

...and in a C file provide the implementation of the function, something like this.
void vAssertCalled( const char * pcFile, 
                    unsigned long ulLine )
{
volatile unsigned long ul = 0;

    taskENTER_CRITICAL();
    {
        while( ul == 0 )
        {
            portNOP();
        }
    }
    taskEXIT_CRITICAL();
}


Regards.