From FreeRTOS.org V4.7.1 all IAR projects for ARM devices are saved using the IAR Embedded Workbench V5.x format and will not open from V4.x versions. FreeRTOS.org V4.7.0 and earlier are still available from SourceForge and can be used with Embedded Workbench V4.x.
There are currently four FreeRTOS ports for the Philips LPC2000 ARM7 based embedded microcontroller. This page relates only to the port for the IAR development tools.
The port was developed on an MCB2100 development/prototyping board using a J-LINK USB JTAG interface (instructions are provided should you wish to use an alternative development board).
The MCB2100 is a fully featured and comprehensive prototyping board that allows easy access to the LPC2129 peripherals and includes 8 built in LEDs which are utilised by the FreeRTOS demo application.
As downloaded this demo application does not demonstrate the use of co-routines. See the co-routine documentation page for information on how co-routine functionality can be quickly added to this demonstration.
See also the FAQ My application does not run, what could be wrong?
The IAR Embedded Workbench project file for this demo can be found in the Demo/ARM7_LPC2129_IAR directory, which also contains main.c, the source file containing the main() function.
The Demo/ARM7_LPC2129_IAR/SrcIAR and the Demo/ARM7_LPC2129_IAR/resource directories
contain support files for the IAR Philips build environment.
Two configurations are provided within the project file - 'flash debug' with no optimisation, and 'flash bin' will full optimisation (barring the static clustering option).
The demo application creates 25 of the standard demo tasks, the idle task, and a 'Check' task. See the demo application section for details of the individual tasks. When executing correctly the demo application will behave as follows:
LED P1.23 is under control of the 'Check' task. Every three seconds the 'Check' task examines all the tasks in the system to ensure they are executing without error. It then toggles LED P1.23. If LED P1.23 is toggling every three seconds then no errors have ever been detected. The toggle rate increasing to 500ms indicates that the 'Check' task has discovered at least one error. This mechanism can be checked by removing the loopback connector from the serial port (described below), and in doing so deliberately generating an error.
The demo application uses the LEDs built into the prototyping board so no other hardware setup is required.

An alternative JTAG interface can be selected using the Debugger category within the project options dialogue box.
Each port #defines 'portBASE_TYPE' to equal the most efficient data type for that processor. This port defines portBASE_TYPE to be of type long.
Note that vPortEndScheduler() has not been implemented.
static __arm __irq void vAnISR( void )
{
/* ISR C code goes here. */
/* End the interrupt in the VIC. */
VICVectAddr = 0;
}
Often you will require an interrupt service routine to cause a context switch. For example a serial port character being received may wake a high priority task that was blocked waiting for the character. If the ISR interrupted a lower priority task then it should return immediately to the woken task. Limitations in the IAR inline assembler necessitate such interrupt service routines include an assembly file wrapper.
/* For simplicity the C function should operate in ARM mode.
Note that the __irq modifier is NOT used. */
__arm void vASwitchingISR( void )
{
portCHAR cContextSwitchRequired;
/* Write the ISR body here as per normal.
A boolean is used to say whether a context switch is required.
In this example assume we posted onto a queue and this caused a
task to be woken. */
cContextSwitchRequired = pdTRUE;
/* Immediately before the end of the ISR call the
portEND_SWITCHING_ISR() macro. */
portEND_SWITCHING_ISR( ( cContextSwitchRequired ) );
/* End the interrupt in the VIC. */
VICVectAddr = 0;
}
See the function vSerialISR() defined in Demo/ARM7_LPC2129_IAR/serial/serial.c for a complete example.
The entry point for the ISR has to be written in an assembly file. This just places a call to the C function between
calls to the portSAVE_CONTEXT() and portRESTORE_CONTEXT() macros respectively as per the following template:
EXTERN vASwitchingISR
PUBLIC vASwitchingISREntry
/* This header defines the save/restore macros. */
#include "ISR_Support.h"
vASwitchingISREntry:
portSAVE_CONTEXT ; Call portSAVE_CONTEXT macro first
bl vASwitchingISR ; Then call the function written in the C file.
portRESTORE_CONTEXT ; Call portRESTORE_CONTEXT last.
END
See the file Demo/ARM7_LPC2129_IAR/serial/serialIAR.S79 for a complete example.
NOTE! : The processor MUST be in supervisor mode when the scheduler is started (vTaskStartScheduler is called). The demo applications included in the FreeRTOS.org download switch to supervisor mode prior to main being called. If you are not using one of these demo application projects then ensure Supervisor mode is entered before calling vTaskStartScheduler().
Interrupt service routines always run in ARM mode. All other code will run in either ARM or THUMB mode depending on the build. It should be noted that some of the macros defined in portmacro.h can only be called from ARM mode code, and use from THUMB code will result in a compile time error. The Embedded Workbench project is configured for THUMB mode - see the LPC2006 GCC port for an example of the configuration required to use just ARM mode.
Demo/ARM7_LPC2129_IAR/Startup.s configures stacks for system/user, IRQ and SWI modes only.
SWI instructions are used by the real time kernel and can therefore not be used by the application code.