Tick wrong on Crossworks 2 for ARM?

goertzen wrote on Wednesday, July 29, 2009:

I am working with Crossworks 2 for ARM, an Olimex 2378 demo board, and FreeRTOS 5.4.0.  The demo for ARM7_LPC2368_Rowley would not compile at all, so I started my own simple FreeRTOS project.  I eventually got it running, but only when interrupts are disabled (my sole task runs happily forever).

What appears to be happening is that irq_handler in vic_irq_handlers.s expects vNonPreemptiveTick() to exit differently than it does.  vNonPreemptiveTick() reloads processor context and ends up in the middle of irq_handler in system mode, which eventually leads to another context reload from garbage and a prefetch abort.

Any advice on how to make this work right?  I am new to Crossworks, ARM, and FreeRTOS.

Thanks,
Dan.

edwards3 wrote on Wednesday, July 29, 2009:

There are bugs in GCC interworking code in CW2. Try compiling to ARM mode only.

goertzen wrote on Wednesday, July 29, 2009:

Everything was ARM mode.

I got things going by removing this line from portISR.c

void vNonPreemptiveTick( void ) __attribute__ ((interrupt ("IRQ")));

The same approach did not work for vPreemtiveTick().  It looks like irq_handler has to be different to allow this to work.

So am I correct in assuming that the port for ARM7_LPC2368_Rowley is meant for Crossworks 1.x?  Will I find an irq_handler there that is more compatible with FreeRTOS?

Thanks,
Dan.