printf problem while multitasking

scottnortman wrote on Thursday, January 04, 2007:

I am now trying to use stdio facilities in my application.

I am using the serial.c demo file which implements a basic interrupt driven API.  I’ve implemented a semaphore to control access to the serial functions across multiple tasks.

This works:

static void task1( void *pv )
{

    for(;:wink:
    {
       
        vTaskDelay( 100 );

        if( xSemaphoreTake( xSerialSemaphore, 10 )
        {
            printf("task1\r\n");
            xSemaphoreGive( xSerialSemaphore );
        }
}

static void task2( void *pv )
{
    for(;:wink:
    {       
        vTaskDelay( 200);

        if( xSemaphoreTake( xSerialSemaphore, 10 )
        {
            printf("task2\r\n");
            xSemaphoreGive( xSerialSemaphore );
        }
}

But this does NOT:

static void task1( void *pv )
{

    for(;:wink:
    {
       
        vTaskDelay( 100 );

        if( xSemaphoreTake( xSerialSemaphore, 10 )
        {
            printf("%c\r\n", 0x31); //changed here
            xSemaphoreGive( xSerialSemaphore );
        }
}

static void task2( void *pv )
{
    for(;:wink:
    {       
        vTaskDelay( 200);

        if( xSemaphoreTake( xSerialSemaphore, 10 )
        {
            printf("task2\r\n");
            xSemaphoreGive( xSerialSemaphore );
        }
}

Any suggestions / thoughts?

–Scott

nobody wrote on Thursday, January 04, 2007:

printf can take a looooot of stack, especially if using gcc.  Can you confirm that this is not just overflowing the stack.

I have also seen implementation where printf was not reentrant.  I think this was mplab C18 compiler.

Dave.

scottnortman wrote on Thursday, January 04, 2007:

Thanks, that appeared to fix the issue…  I just increased the stack size.

–Scott