LPC2129 - GCC - No Timer Interrupt

polarm wrote on Saturday, October 18, 2008:


I am trying to get FreeRTOS running on a LPC2129 using the GCC port. I am using a custom board, running an LPC2129 with a 12Mhz oscillator.

I checked I am able to run simple programs, that drive LEDs and write on the serial port. I can also step in my code using the debugger.

I compile using the GCC port and heap1.c. I have defined the following macro to compile: GCC_ARM7.

Here is what is in FreeRTOSConfig.h

    FreeRTOS.org V5.0.4 - Copyright (C) 2003-2008 Richard Barry.

    This file is part of the FreeRTOS.org distribution.

    FreeRTOS.org is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    FreeRTOS.org is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with FreeRTOS.org; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

    A special exception to the GPL can be applied should you wish to distribute
    a combined work that includes FreeRTOS.org, without being obliged to provide
    the source code for any proprietary components.  See the licensing section
    of http://www.FreeRTOS.org for full details of how and when the exception
    can be applied.

    *                                                                         *
    * SAVE TIME AND MONEY!  We can port FreeRTOS.org to your own hardware,    *
    * and even write all or part of your application on your behalf.          *
    * See http://www.OpenRTOS.com for details of the services we provide to   *
    * expedite your project.                                                  *
    *                                                                         *

    Please ensure to read the configuration and relevant port sections of the
    online documentation.

    http://www.FreeRTOS.org - Documentation, latest information, license and
    contact details.

    http://www.SafeRTOS.com - A version that is certified for use in safety
    critical systems.

    http://www.OpenRTOS.com - Commercial support, development, porting,
    licensing and training services.


#include <lpc21xx.h>

* Application specific definitions.
* These definitions should be adjusted for your particular hardware and
* application requirements.
* See http://www.freertos.org/a00110.html.

#define configUSE_PREEMPTION        1
#define configUSE_IDLE_HOOK            0
#define configUSE_TICK_HOOK            0
#define configCPU_CLOCK_HZ            ( ( unsigned portLONG ) 60000000 )    /* =12.0MHz xtal multiplied by 5 using the PLL. */
#define configTICK_RATE_HZ            ( ( portTickType ) 1000 )
#define configMAX_PRIORITIES        ( ( unsigned portBASE_TYPE ) 5 )
#define configMINIMAL_STACK_SIZE    ( ( unsigned portSHORT ) 1000 )
#define configTOTAL_HEAP_SIZE        ( ( size_t ) 10*1024 )
#define configMAX_TASK_NAME_LEN        ( 16 )
#define configUSE_TRACE_FACILITY    0
#define configUSE_16_BIT_TICKS        0
#define configIDLE_SHOULD_YIELD        1

/* Co-routine definitions. */
#define configUSE_CO_ROUTINES         0
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )

/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. */

#define INCLUDE_vTaskPrioritySet        1
#define INCLUDE_uxTaskPriorityGet        1
#define INCLUDE_vTaskDelete                1
#define INCLUDE_vTaskCleanUpResources    0
#define INCLUDE_vTaskSuspend            1
#define INCLUDE_vTaskDelayUntil            1
#define INCLUDE_vTaskDelay                1

#endif /* FREERTOS_CONFIG_H */

This is the startup code I use:

static void SerialPortTask( void *pvParameters );

int main(void)
   /*Initialize the Hardware, PCB, serial ports etc */

   /* Initialize the stdout capability (serial port) */

   SysIoPrintf("\r\nmain invoked");

   xTaskCreate( SerialPortTask, "Serial", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY + 2, NULL );

   return 0;
} /* main */

static void SerialPortTask( void *pvParameters )
      SysIoPrintf("\r\nThe serial task");
      vTaskDelay( ( ( portTickType ) 1000 / portTICK_RATE_MS ) );
} /* SerialPortTask */

I ran the code step by step to see that eventually vTaskStartScheduler() reaches a point where it proceeds with a context switch, to start the first task. The program ends here I’m unable to debugger further, but I guess this is ok.
Eventually I never see any timer interrupt happening. The timer 0 interrupt is never asserted. Also, the SerialPortTask never gets called.

The same behavior happens when I leave the code free-running.

I tried enabling global interrupts from Lpc2129CanEvaluationInit() and just before calling vTaskStartScheduler() but this did not help.

Any idea why I cannot see any interrupt happening?


davedoors wrote on Sunday, October 19, 2008:

Are you in Supervisor mode when main() is called?

polarm wrote on Sunday, October 19, 2008:


That I’m not sure… I keep the default settings at reset.

rtel wrote on Sunday, October 19, 2008:

Normally this will be done in the C startup file.  Are you using a C startup file from the FreeRTOS.org download?  If so then you will probably have it set correctly.

If you look in the startup file you should see that it sets the processor into each mode (IRQ, Supervisor, FIQ, etc.) and while in each mode sets the stack pointer to be used by that mode.  FreeRTOS.org requires stacks to be setup for Supervisor and IRQ mode as a minimum as the stacks used by the tasks are setup when the task is created.

Check that in this code sequence the asm code leaves the processor in Supervisor mode prior to calling main().

You can also stop on the debugger while in main and inspect the CPSR register to determine which mode you are in.  You cannot start the scheduler unless you are in Supervisor mode.


polarm wrote on Sunday, October 19, 2008:


Thanks for the heads up. I did switch to supervisor mode, and I could observe a few timer interrupts happening… Though they died after a few instances…

I am thinking my GCC/eclipse/ARM-USB-OCD-JTAG install may not be right… I wouldn’t mind starting something from scratch, specific to freeRTOS.

Any recommendations for this setup with regards to running freeRTOS?