PIC32MX lwIP + FreeRTOS port again

akhe wrote on Wednesday, November 26, 2008:

I received and send frames now which is a success. There is a problem though in the Tctcpip thread. It appears to be FreeRTOS related so I ask here. Quite complex to explain the problem byt here we go.

In the tcpip thread the code waits for a frame. This is done with

sys_mbox_fetch(mbox, (void *)&msg);

which is defined in the sys_arch.c  When called I get an exception.

I have checked that the mbox has been initialized and can trace the fault to a list iteration in vListInsert (called in vTaskPlaceOnEventList)

for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext )
        {
            /* There is nothing to do here, we are just iterating to the
            wanted insertion position. */
        }

As I can see the list pointers are messed up as this point giving the exception. I have not been able to figure out why yet.

Call stack is

- tcpip_thread
- sys_mbox_fetch
- sys_arch_mbox_fetch
- xQueueGenericReceive
- vTaskPlaceOnEventList

Any hints appreciated.

Cheers
/Ake

rtel wrote on Wednesday, November 26, 2008:

Most likely cause of this is stack overflow - the lwIP threads can use quite a bit of stack, especially when using standard GCC C library functions such as sprintf() [you can use cut down versions that are more stack friendly on embedded systems].

Check the task that implements your lwIP functionality AND any task that is created using sys_thread_new() within sys_arch.c.  Put a break point in sys_thread_new() to ensure you catch each time it is called.

Regards.

akhe wrote on Wednesday, November 26, 2008:

Hi Richard,

you are right of course.

Thanks a lot.

/Ake