summaryrefslogtreecommitdiff
path: root/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL
diff options
context:
space:
mode:
authorYuval Adam <yuv.adm@gmail.com>2014-08-08 14:42:07 +0300
committerYuval Adam <yuv.adm@gmail.com>2014-08-08 14:42:07 +0300
commita6163888f3c56123b1db313743c6147ba498732c (patch)
treeff7d15d991d1d09ba6cbc0cec80924f57445bfdd /third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL
parentc3e4c9a25c2910d2d66d52215b3406b13d5b23d5 (diff)
Add third_party libs
Diffstat (limited to 'third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL')
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/FreeRTOSConfig.h112
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/main.c630
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/readme.txt3
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/FreeRTOSConfig.h112
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/main.c638
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/readme.txt3
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Opt51
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Uv2112
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOSConfig.h113
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/ParTest/ParTest.c146
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.c118
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.h122
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/init/Startup.s164
-rw-r--r--third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/main.c630
14 files changed, 2954 insertions, 0 deletions
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/FreeRTOSConfig.h
new file mode 100644
index 0000000..31afdcf
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/FreeRTOSConfig.h
@@ -0,0 +1,112 @@
+/*
+ FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
+
+
+ ***************************************************************************
+ * *
+ * FreeRTOS tutorial books are available in pdf and paperback. *
+ * Complete, revised, and edited pdf reference manuals are also *
+ * available. *
+ * *
+ * Purchasing FreeRTOS documentation will not only help you, by *
+ * ensuring you get running as quickly as possible and with an *
+ * in-depth knowledge of how to use FreeRTOS, it will also help *
+ * the FreeRTOS project to continue with its mission of providing *
+ * professional grade, cross platform, de facto standard solutions *
+ * for microcontrollers - completely free of charge! *
+ * *
+ * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
+ * *
+ * Thank you for using FreeRTOS, and thank you for your support! *
+ * *
+ ***************************************************************************
+
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ >>>NOTE<<< The modification to the GPL is included to allow you to
+ distribute a combined work that includes FreeRTOS without being obliged to
+ provide the source code for proprietary components outside of the FreeRTOS
+ kernel. FreeRTOS is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ ***************************************************************************
+ * *
+ * Having a problem? Start by reading the FAQ "My application does *
+ * not run, what could be wrong? *
+ * *
+ * http://www.FreeRTOS.org/FAQHelp.html *
+ * *
+ ***************************************************************************
+
+
+ http://www.FreeRTOS.org - Documentation, training, latest information,
+ license and contact details.
+
+ http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+ including FreeRTOS+Trace - an indispensable productivity tool.
+
+ Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
+ the code with commercial support, indemnification, and middleware, under
+ the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
+ provide a safety engineered and independently SIL3 certified version under
+ the SafeRTOS brand: http://www.SafeRTOS.com.
+*/
+
+#ifndef FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/*-----------------------------------------------------------
+ * Application specific definitions.
+ *
+ * These definitions should be adjusted for your particular hardware and
+ * application requirements.
+ *
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
+ *
+ * See http://www.freertos.org/a00110.html.
+ *----------------------------------------------------------*/
+
+#define configUSE_PREEMPTION 1
+#define configUSE_IDLE_HOOK 1
+#define configUSE_TICK_HOOK 0
+#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 )
+#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
+#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 )
+#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1468 ) )
+#define configMAX_TASK_NAME_LEN ( 3 )
+#define configUSE_TRACE_FACILITY 0
+#define configUSE_16_BIT_TICKS 0
+#define configIDLE_SHOULD_YIELD 0
+#define configUSE_CO_ROUTINES 1
+
+#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 )
+#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 0
+#define INCLUDE_uxTaskPriorityGet 0
+#define INCLUDE_vTaskDelete 0
+#define INCLUDE_vTaskCleanUpResources 0
+#define INCLUDE_vTaskSuspend 0
+#define INCLUDE_vTaskDelayUntil 0
+#define INCLUDE_vTaskDelay 1
+
+
+
+
+#endif /* FREERTOS_CONFIG_H */
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/main.c
new file mode 100644
index 0000000..560d41d
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/main.c
@@ -0,0 +1,630 @@
+/*
+ FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
+
+
+ ***************************************************************************
+ * *
+ * FreeRTOS tutorial books are available in pdf and paperback. *
+ * Complete, revised, and edited pdf reference manuals are also *
+ * available. *
+ * *
+ * Purchasing FreeRTOS documentation will not only help you, by *
+ * ensuring you get running as quickly as possible and with an *
+ * in-depth knowledge of how to use FreeRTOS, it will also help *
+ * the FreeRTOS project to continue with its mission of providing *
+ * professional grade, cross platform, de facto standard solutions *
+ * for microcontrollers - completely free of charge! *
+ * *
+ * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
+ * *
+ * Thank you for using FreeRTOS, and thank you for your support! *
+ * *
+ ***************************************************************************
+
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ >>>NOTE<<< The modification to the GPL is included to allow you to
+ distribute a combined work that includes FreeRTOS without being obliged to
+ provide the source code for proprietary components outside of the FreeRTOS
+ kernel. FreeRTOS is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ ***************************************************************************
+ * *
+ * Having a problem? Start by reading the FAQ "My application does *
+ * not run, what could be wrong? *
+ * *
+ * http://www.FreeRTOS.org/FAQHelp.html *
+ * *
+ ***************************************************************************
+
+
+ http://www.FreeRTOS.org - Documentation, training, latest information,
+ license and contact details.
+
+ http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+ including FreeRTOS+Trace - an indispensable productivity tool.
+
+ Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
+ the code with commercial support, indemnification, and middleware, under
+ the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
+ provide a safety engineered and independently SIL3 certified version under
+ the SafeRTOS brand: http://www.SafeRTOS.com.
+*/
+
+/*
+ * This demo application creates six co-routines and two tasks (three including
+ * the idle task). The co-routines execute as part of the idle task hook.
+ *
+ * Five of the created co-routines are the standard 'co-routine flash'
+ * co-routines contained within the Demo/Common/Minimal/crflash.c file and
+ * documented on the FreeRTOS.org WEB site.
+ *
+ * The 'LCD Task' rotates a string on the LCD, delaying between each character
+ * as necessitated by the slow interface, and delaying between each string just
+ * long enough to enable the text to be read.
+ *
+ * The sixth co-routine and final task control the transmission and reception
+ * of a string to UART 0. The co-routine periodically sends the first
+ * character of the string to the UART, with the UART's TxEnd interrupt being
+ * used to transmit the remaining characters. The UART's RxEnd interrupt
+ * receives the characters and places them on a queue to be processed by the
+ * 'COMs Rx' task. An error is latched should an unexpected character be
+ * received, or any character be received out of sequence.
+ *
+ * A loopback connector is required to ensure that each character transmitted
+ * on the UART is also received on the same UART. For test purposes the UART
+ * FIFO's are not utalised in order to maximise the interrupt overhead. Also
+ * a pseudo random interval is used between the start of each transmission in
+ * order that the resultant interrupts are more randomly distributed and
+ * therefore more likely to highlight any problems.
+ *
+ * The flash co-routines control LED's zero to four. LED five is toggled each
+ * time the string is transmitted on the UART. LED six is toggled each time
+ * the string is CORRECTLY received on the UART. LED seven is latched on should
+ * an error be detected in any task or co-routine.
+ *
+ * In addition the idle task makes repetative calls to
+ * prvSetAndCheckRegisters(). This simply loads the general purpose registers
+ * with a known value, then checks each register to ensure the held value is
+ * still correct. As a low priority task this checking routine is likely to
+ * get repeatedly swapped in and out. A register being found to contain an
+ * incorrect value is therefore indicative of an error in the task switching
+ * mechansim.
+ *
+ */
+
+/* Scheduler include files. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "queue.h"
+#include "croutine.h"
+
+/* Demo application include files. */
+#include "partest.h"
+#include "crflash.h"
+
+/* Library include files. */
+#include "LM3Sxxx.h"
+#include "pdc.h"
+
+/* The time to delay between writing each character to the LCD. */
+#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS )
+
+/* The time to delay between writing each string to the LCD. */
+#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS )
+
+/* The number of flash co-routines to create. */
+#define mainNUM_FLASH_CO_ROUTINES ( 5 )
+
+/* The length of the queue used to pass received characters to the Comms Rx
+task. */
+#define mainRX_QUEUE_LEN ( 5 )
+
+/* The priority of the co-routine used to initiate the transmission of the
+string on UART 0. */
+#define mainTX_CO_ROUTINE_PRIORITY ( 1 )
+
+/* Only one co-routine is created so its index is not important. */
+#define mainTX_CO_ROUTINE_INDEX ( 0 )
+
+/* The time between transmissions of the string on UART 0. This is pseudo
+random in order to generate a bit or randomness to when the interrupts occur.*/
+#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS )
+#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f )
+#define mainOFFSET_TIME ( ( portTickType ) 3 )
+
+/* The time the Comms Rx task should wait to receive a character. This should
+be slightly longer than the time between transmissions. If we do not receive
+a character after this time then there must be an error in the transmission or
+the timing of the transmission. */
+#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 )
+
+/* The task priorites. */
+#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY )
+#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
+
+/* The LED's toggled by the various tasks. */
+#define mainCOMMS_FAIL_LED ( 7 )
+#define mainCOMMS_RX_LED ( 6 )
+#define mainCOMMS_TX_LED ( 5 )
+
+/* The baud rate used by the UART comms tasks/co-routine. */
+#define mainBAUD_RATE ( 57600 )
+
+/* FIFO setting for the UART. The FIFO is not used to create a better test. */
+#define mainFIFO_SET ( 0x10 )
+
+/* The string that is transmitted on the UART contains sequentially the
+characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */
+#define mainFIRST_TX_CHAR '0'
+#define mainLAST_TX_CHAR 'z'
+
+/* Just used to walk through the program memory in order that some random data
+can be generated. */
+#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) )
+#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 )
+
+/*-----------------------------------------------------------*/
+
+/*
+ * The task that rotates text on the LCD.
+ */
+static void vLCDTask( void * pvParameters );
+
+/*
+ * The task that receives the characters from UART 0.
+ */
+static void vCommsRxTask( void * pvParameters );
+
+/*
+ * The co-routine that periodically initiates the transmission of the string on
+ * the UART.
+ */
+static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex );
+
+/*
+ * Writes a string the the LCD.
+ */
+static void prvWriteString( const char *pcString );
+
+/*
+ * Initialisation routine for the UART.
+ */
+static void vSerialInit( void );
+
+/*
+ * Thread safe write to the PDC.
+ */
+static void prvPDCWrite( char cAddress, char cData );
+
+/*
+ * Function to simply set a known value into the general purpose registers
+ * then read them back to ensure they remain set correctly. An incorrect value
+ * being indicative of an error in the task switching mechanism.
+ */
+void prvSetAndCheckRegisters( void );
+
+/*
+ * Latch the LED that indicates that an error has occurred.
+ */
+void vSetErrorLED( void );
+
+/*
+ * Sets up the PLL and ports used by the demo.
+ */
+static void prvSetupHardware( void );
+
+/*-----------------------------------------------------------*/
+
+/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines
+defined within this file. */
+unsigned portBASE_TYPE uxErrorStatus = pdPASS;
+
+/* The next character to transmit. */
+static char cNextChar;
+
+/* The queue used to transmit characters from the interrupt to the Comms Rx
+task. */
+static xQueueHandle xCommsQueue;
+
+/*-----------------------------------------------------------*/
+
+int main( void )
+{
+ /* Create the queue used to communicate between the UART ISR and the Comms
+ Rx task. */
+ xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) );
+
+ /* Setup the ports used by the demo and the clock. */
+ prvSetupHardware();
+
+ /* Create the co-routines that flash the LED's. */
+ vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES );
+
+ /* Create the co-routine that initiates the transmission of characters
+ on the UART. */
+ xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX );
+
+ /* Create the LCD and Comms Rx tasks. */
+ xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL );
+ xTaskCreate( vCommsRxTask, "CMS", configMINIMAL_STACK_SIZE, NULL, mainCOMMS_RX_TASK_PRIORITY, NULL );
+
+ /* Start the scheduler running the tasks and co-routines just created. */
+ vTaskStartScheduler();
+
+ /* Should not get here unless we did not have enough memory to start the
+ scheduler. */
+ for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupHardware( void )
+{
+ /* Setup the PLL. */
+ SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ );
+
+ /* Initialise the hardware used to talk to the LCD, LED's and UART. */
+ PDCInit();
+ vParTestInitialise();
+ vSerialInit();
+}
+/*-----------------------------------------------------------*/
+
+void vApplicationIdleHook( void )
+{
+ /* The co-routines are executed in the idle task using the idle task
+ hook. */
+ for( ;; )
+ {
+ /* Schedule the co-routines. */
+ vCoRoutineSchedule();
+
+ /* Run the register check function between each co-routine. */
+ prvSetAndCheckRegisters();
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvWriteString( const char *pcString )
+{
+ /* Write pcString to the LED, pausing between each character. */
+ prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR);
+ while( *pcString )
+ {
+ vTaskDelay( mainCHAR_WRITE_DELAY );
+ prvPDCWrite( PDC_LCD_RAM, *pcString );
+ pcString++;
+ }
+}
+/*-----------------------------------------------------------*/
+
+void vLCDTask( void * pvParameters )
+{
+unsigned portBASE_TYPE uxIndex;
+const unsigned char ucCFGData[] = {
+ 0x30, /* Set data bus to 8-bits. */
+ 0x30,
+ 0x30,
+ 0x3C, /* Number of lines/font. */
+ 0x08, /* Display off. */
+ 0x01, /* Display clear. */
+ 0x06, /* Entry mode [cursor dir][shift]. */
+ 0x0C /* Display on [display on][curson on][blinking on]. */
+ };
+
+/* The strings that are written to the LCD. */
+const char *pcStringsToDisplay[] = {
+ "Stellaris",
+ "Demo",
+ "One",
+ "www.FreeRTOS.org",
+ ""
+ };
+
+ /* Configure the LCD. */
+ uxIndex = 0;
+ while( uxIndex < sizeof( ucCFGData ) )
+ {
+ prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] );
+ uxIndex++;
+ vTaskDelay( mainCHAR_WRITE_DELAY );
+ }
+
+ /* Turn the LCD Backlight on. */
+ prvPDCWrite( PDC_CSR, 0x01 );
+
+ /* Clear display. */
+ vTaskDelay( mainCHAR_WRITE_DELAY );
+ prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR );
+
+ uxIndex = 0;
+ for( ;; )
+ {
+ /* Display the string on the LCD. */
+ prvWriteString( pcStringsToDisplay[ uxIndex ] );
+
+ /* Move on to the next string - wrapping if necessary. */
+ uxIndex++;
+ if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 )
+ {
+ uxIndex = 0;
+ /* Longer pause on the last string to be sent. */
+ vTaskDelay( mainSTRING_WRITE_DELAY * 2 );
+ }
+
+ /* Wait until it is time to move onto the next string. */
+ vTaskDelay( mainSTRING_WRITE_DELAY );
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void vCommsRxTask( void * pvParameters )
+{
+static char cRxedChar, cExpectedChar;
+
+ /* Set the char we expect to receive to the start of the string. */
+ cExpectedChar = mainFIRST_TX_CHAR;
+
+ for( ;; )
+ {
+ /* Wait for a character to be received. */
+ xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY );
+
+ /* Was the character recived (if any) the expected character. */
+ if( cRxedChar != cExpectedChar )
+ {
+ /* Got an unexpected character. This can sometimes occur when
+ reseting the system using the debugger leaving characters already
+ in the UART regsters. */
+ uxErrorStatus = pdFAIL;
+
+ /* Resync by waiting for the end of the current string. */
+ while( cRxedChar != mainLAST_TX_CHAR )
+ {
+ while( !xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, portMAX_DELAY ) );
+ }
+
+ /* The next expected character is the start of the string again. */
+ cExpectedChar = mainFIRST_TX_CHAR;
+ }
+ else
+ {
+ if( cExpectedChar == mainLAST_TX_CHAR )
+ {
+ /* We have reached the end of the string - we now expect to
+ receive the first character in the string again. The LED is
+ toggled to indicate that the entire string was received without
+ error. */
+ vParTestToggleLED( mainCOMMS_RX_LED );
+ cExpectedChar = mainFIRST_TX_CHAR;
+ }
+ else
+ {
+ /* We got the expected character, we now expect to receive the
+ next character in the string. */
+ cExpectedChar++;
+ }
+ }
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+{
+portTickType xDelayPeriod;
+static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES;
+
+ /* Co-routine MUST start with a call to crSTART. */
+ crSTART( xHandle );
+
+ for(;;)
+ {
+ /* Was the previously transmitted string received correctly? */
+ if( uxErrorStatus != pdPASS )
+ {
+ /* An error was encountered so set the error LED. */
+ vSetErrorLED();
+ }
+
+ /* The next character to Tx is the first in the string. */
+ cNextChar = mainFIRST_TX_CHAR;
+
+ UARTIntDisable( UART0_BASE, UART_INT_TX );
+ {
+ /* Send the first character. */
+ if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) )
+ {
+ HWREG( UART0_BASE + UART_O_DR ) = cNextChar;
+ }
+
+ /* Move the variable to the char to Tx on so the ISR transmits
+ the next character in the string once this one has completed. */
+ cNextChar++;
+ }
+ UARTIntEnable(UART0_BASE, UART_INT_TX);
+
+ /* Toggle the LED to show a new string is being transmitted. */
+ vParTestToggleLED( mainCOMMS_TX_LED );
+
+ /* Delay before we start the string off again. A pseudo-random delay
+ is used as this will provide a better test. */
+ xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes );
+
+ pulRandomBytes++;
+ if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY )
+ {
+ pulRandomBytes = mainFIRST_PROGRAM_BYTES;
+ }
+
+ /* Make sure we don't wait too long... */
+ xDelayPeriod &= mainMAX_TX_DELAY;
+
+ /* ...but we do want to wait. */
+ if( xDelayPeriod < mainMIN_TX_DELAY )
+ {
+ xDelayPeriod = mainMIN_TX_DELAY;
+ }
+
+ /* Block for the random(ish) time. */
+ crDELAY( xHandle, xDelayPeriod );
+ }
+
+ /* Co-routine MUST end with a call to crEND. */
+ crEND();
+}
+/*-----------------------------------------------------------*/
+
+static void vSerialInit( void )
+{
+ /* Enable the UART. GPIOA has already been initialised. */
+ SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
+
+ /* Set GPIO A0 and A1 as peripheral function. They are used to output the
+ UART signals. */
+ GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW );
+
+ /* Configure the UART for 8-N-1 operation. */
+ UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE );
+
+ /* We dont want to use the fifo. This is for test purposes to generate
+ as many interrupts as possible. */
+ HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET;
+
+ /* Enable both Rx and Tx interrupts. */
+ HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX );
+ IntEnable( INT_UART0 );
+}
+/*-----------------------------------------------------------*/
+
+void vUART_ISR(void)
+{
+unsigned long ulStatus;
+char cRxedChar;
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+ /* What caused the interrupt. */
+ ulStatus = UARTIntStatus( UART0_BASE, pdTRUE );
+
+ /* Clear the interrupt. */
+ UARTIntClear( UART0_BASE, ulStatus );
+
+ /* Was an Rx interrpt pending? */
+ if( ulStatus & UART_INT_RX )
+ {
+ if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) )
+ {
+ /* Get the char from the buffer and post it onto the queue of
+ Rxed chars. Posting the character should wake the task that is
+ blocked on the queue waiting for characters. */
+ cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR );
+ xQueueSendFromISR( xCommsQueue, &cRxedChar, &xHigherPriorityTaskWoken );
+ }
+ }
+
+ /* Was a Tx interrupt pending? */
+ if( ulStatus & UART_INT_TX )
+ {
+ /* Send the next character in the string. We are not using the FIFO. */
+ if( cNextChar <= mainLAST_TX_CHAR )
+ {
+ if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) )
+ {
+ HWREG( UART0_BASE + UART_O_DR ) = cNextChar;
+ }
+ cNextChar++;
+ }
+ }
+
+ /* If a task was woken by the character being received then we force
+ a context switch to occur in case the task is of higher priority than
+ the currently executing task (i.e. the task that this interrupt
+ interrupted.) */
+ portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
+}
+/*-----------------------------------------------------------*/
+
+static void prvPDCWrite( char cAddress, char cData )
+{
+ vTaskSuspendAll();
+ {
+ PDCWrite( cAddress, cData );
+ }
+ xTaskResumeAll();
+}
+/*-----------------------------------------------------------*/
+
+void vSetErrorLED( void )
+{
+ vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE );
+}
+/*-----------------------------------------------------------*/
+
+__asm void prvSetAndCheckRegisters( void )
+{
+ extern vSetErrorLED
+
+ /* Fill the general purpose registers with known values. */
+ mov r11, #10
+ add r0, r11, #1
+ add r1, r11, #2
+ add r2, r11, #3
+ add r3, r11, #4
+ add r4, r11, #5
+ add r5, r11, #6
+ add r6, r11, #7
+ add r7, r11, #8
+ add r8, r11, #9
+ add r9, r11, #10
+ add r10, r11, #11
+ add r12, r11, #12
+
+ /* Check the values are as expected. */
+ cmp r11, #10
+ bne set_error_led
+ cmp r0, #11
+ bne set_error_led
+ cmp r1, #12
+ bne set_error_led
+ cmp r2, #13
+ bne set_error_led
+ cmp r3, #14
+ bne set_error_led
+ cmp r4, #15
+ bne set_error_led
+ cmp r5, #16
+ bne set_error_led
+ cmp r6, #17
+ bne set_error_led
+ cmp r7, #18
+ bne set_error_led
+ cmp r8, #19
+ bne set_error_led
+ cmp r9, #20
+ bne set_error_led
+ cmp r10, #21
+ bne set_error_led
+ cmp r12, #22
+ bne set_error_led
+ bx lr
+
+set_error_led;
+ push {r14}
+ ldr r1, =vSetErrorLED
+ blx r1
+ pop {r14}
+ bx lr;
+}
+/*-----------------------------------------------------------*/
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/readme.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/readme.txt
new file mode 100644
index 0000000..10334b9
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo1/readme.txt
@@ -0,0 +1,3 @@
+Move these two fines into the Demo/CORTEX_LM3S102_KEIL directory to run Demo 1.
+
+See the port documentation on the www.FreeRTOS.org site for more information.
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/FreeRTOSConfig.h
new file mode 100644
index 0000000..29902dd
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/FreeRTOSConfig.h
@@ -0,0 +1,112 @@
+/*
+ FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
+
+
+ ***************************************************************************
+ * *
+ * FreeRTOS tutorial books are available in pdf and paperback. *
+ * Complete, revised, and edited pdf reference manuals are also *
+ * available. *
+ * *
+ * Purchasing FreeRTOS documentation will not only help you, by *
+ * ensuring you get running as quickly as possible and with an *
+ * in-depth knowledge of how to use FreeRTOS, it will also help *
+ * the FreeRTOS project to continue with its mission of providing *
+ * professional grade, cross platform, de facto standard solutions *
+ * for microcontrollers - completely free of charge! *
+ * *
+ * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
+ * *
+ * Thank you for using FreeRTOS, and thank you for your support! *
+ * *
+ ***************************************************************************
+
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ >>>NOTE<<< The modification to the GPL is included to allow you to
+ distribute a combined work that includes FreeRTOS without being obliged to
+ provide the source code for proprietary components outside of the FreeRTOS
+ kernel. FreeRTOS is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ ***************************************************************************
+ * *
+ * Having a problem? Start by reading the FAQ "My application does *
+ * not run, what could be wrong? *
+ * *
+ * http://www.FreeRTOS.org/FAQHelp.html *
+ * *
+ ***************************************************************************
+
+
+ http://www.FreeRTOS.org - Documentation, training, latest information,
+ license and contact details.
+
+ http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+ including FreeRTOS+Trace - an indispensable productivity tool.
+
+ Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
+ the code with commercial support, indemnification, and middleware, under
+ the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
+ provide a safety engineered and independently SIL3 certified version under
+ the SafeRTOS brand: http://www.SafeRTOS.com.
+*/
+
+#ifndef FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/*-----------------------------------------------------------
+ * Application specific definitions.
+ *
+ * These definitions should be adjusted for your particular hardware and
+ * application requirements.
+ *
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
+ *
+ * See http://www.freertos.org/a00110.html.
+ *----------------------------------------------------------*/
+
+#define configUSE_PREEMPTION 1
+#define configUSE_IDLE_HOOK 1
+#define configUSE_TICK_HOOK 0
+#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 )
+#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
+#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 )
+#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1240 ) )
+#define configMAX_TASK_NAME_LEN ( 3 )
+#define configUSE_TRACE_FACILITY 0
+#define configUSE_16_BIT_TICKS 0
+#define configIDLE_SHOULD_YIELD 0
+#define configUSE_CO_ROUTINES 1
+
+#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 )
+#define configMAX_CO_ROUTINE_PRIORITIES ( 3 )
+
+/* Set the following definitions to 1 to include the API function, or zero
+to exclude the API function. */
+
+#define INCLUDE_vTaskPrioritySet 0
+#define INCLUDE_uxTaskPriorityGet 0
+#define INCLUDE_vTaskDelete 0
+#define INCLUDE_vTaskCleanUpResources 0
+#define INCLUDE_vTaskSuspend 0
+#define INCLUDE_vTaskDelayUntil 0
+#define INCLUDE_vTaskDelay 1
+
+
+
+
+#endif /* FREERTOS_CONFIG_H */
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/main.c
new file mode 100644
index 0000000..41d822a
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/main.c
@@ -0,0 +1,638 @@
+/*
+ FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
+
+
+ ***************************************************************************
+ * *
+ * FreeRTOS tutorial books are available in pdf and paperback. *
+ * Complete, revised, and edited pdf reference manuals are also *
+ * available. *
+ * *
+ * Purchasing FreeRTOS documentation will not only help you, by *
+ * ensuring you get running as quickly as possible and with an *
+ * in-depth knowledge of how to use FreeRTOS, it will also help *
+ * the FreeRTOS project to continue with its mission of providing *
+ * professional grade, cross platform, de facto standard solutions *
+ * for microcontrollers - completely free of charge! *
+ * *
+ * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
+ * *
+ * Thank you for using FreeRTOS, and thank you for your support! *
+ * *
+ ***************************************************************************
+
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ >>>NOTE<<< The modification to the GPL is included to allow you to
+ distribute a combined work that includes FreeRTOS without being obliged to
+ provide the source code for proprietary components outside of the FreeRTOS
+ kernel. FreeRTOS is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ ***************************************************************************
+ * *
+ * Having a problem? Start by reading the FAQ "My application does *
+ * not run, what could be wrong? *
+ * *
+ * http://www.FreeRTOS.org/FAQHelp.html *
+ * *
+ ***************************************************************************
+
+
+ http://www.FreeRTOS.org - Documentation, training, latest information,
+ license and contact details.
+
+ http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+ including FreeRTOS+Trace - an indispensable productivity tool.
+
+ Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
+ the code with commercial support, indemnification, and middleware, under
+ the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
+ provide a safety engineered and independently SIL3 certified version under
+ the SafeRTOS brand: http://www.SafeRTOS.com.
+*/
+
+/*
+ * This demo application creates seven co-routines and one task (two including
+ * the idle task). The co-routines execute as part of the idle task hook.
+ *
+ * Five of the created co-routines are the standard 'co-routine flash'
+ * co-routines contained within the Demo/Common/Minimal/crflash.c file and
+ * documented on the FreeRTOS.org WEB site.
+ *
+ * The 'LCD Task' rotates a string on the LCD, delaying between each character
+ * as necessitated by the slow interface, and delaying between each string just
+ * long enough to enable the text to be read.
+ *
+ * The sixth co-routine controls the transmission of a string to UART 0. The
+ * co-routine periodically sends the first character of the string to the UART,
+ * with the UART's TxEnd interrupt being used to transmit the remaining
+ * characters. The UART's RxEnd interrupt receives the characters and places
+ * them on a queue to be processed by the seventh and final co-routine. An
+ * error is latched should an unexpected character be received, or any
+ * character be received out of sequence.
+ *
+ * A loopback connector is required to ensure that each character transmitted
+ * on the UART is also received on the same UART. For test purposes the UART
+ * FIFO's are not utalised in order to maximise the interrupt overhead. Also
+ * a pseudo random interval is used between the start of each transmission in
+ * order that the resultant interrupts are more randomly distributed and
+ * therefore more likely to highlight any problems.
+ *
+ * The flash co-routines control LED's zero to four. LED five is toggled each
+ * time the string is transmitted on the UART. LED six is toggled each time
+ * the string is CORRECTLY received on the UART. LED seven is latched on should
+ * an error be detected in any task or co-routine.
+ *
+ * In addition the idle task makes repetative calls to
+ * prvSetAndCheckRegisters(). This simply loads the general purpose registers
+ * with a known value, then checks each register to ensure the held value is
+ * still correct. As a low priority task this checking routine is likely to
+ * get repeatedly swapped in and out. A register being found to contain an
+ * incorrect value is therefore indicative of an error in the task switching
+ * mechansim.
+ *
+ */
+
+/* Scheduler include files. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "queue.h"
+#include "croutine.h"
+
+/* Demo application include files. */
+#include "partest.h"
+#include "crflash.h"
+
+/* Library include files. */
+#include "LM3Sxxx.h"
+#include "pdc.h"
+
+/* The time to delay between writing each character to the LCD. */
+#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS )
+
+/* The time to delay between writing each string to the LCD. */
+#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS )
+
+/* The number of flash co-routines to create. */
+#define mainNUM_FLASH_CO_ROUTINES ( 5 )
+
+/* The length of the queue used to pass received characters to the Comms Rx
+task. */
+#define mainRX_QUEUE_LEN ( 5 )
+
+/* The priority of the co-routine used to initiate the transmission of the
+string on UART 0. */
+#define mainTX_CO_ROUTINE_PRIORITY ( 1 )
+
+/* The priority of the co-routine used to receive characters from the UART. */
+#define mainRX_CO_ROUTINE_PRIORITY ( 2 )
+
+/* Only one co-routine is created so its index is not important. */
+#define mainTX_CO_ROUTINE_INDEX ( 0 )
+#define mainRX_CO_ROUTINE_INDEX ( 0 )
+
+/* The time between transmissions of the string on UART 0. This is pseudo
+random in order to generate a bit or randomness to when the interrupts occur.*/
+#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS )
+#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f )
+#define mainOFFSET_TIME ( ( portTickType ) 3 )
+
+/* The time the Comms Rx task should wait to receive a character. This should
+be slightly longer than the time between transmissions. If we do not receive
+a character after this time then there must be an error in the transmission or
+the timing of the transmission. */
+#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 )
+
+/* The task priorites. */
+#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY )
+#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
+
+/* The LED's toggled by the various tasks. */
+#define mainCOMMS_FAIL_LED ( 7 )
+#define mainCOMMS_RX_LED ( 6 )
+#define mainCOMMS_TX_LED ( 5 )
+
+/* The baud rate used by the UART comms tasks/co-routine. */
+#define mainBAUD_RATE ( 57600 )
+
+/* FIFO setting for the UART. The FIFO is not used to create a better test. */
+#define mainFIFO_SET ( 0x10 )
+
+/* The string that is transmitted on the UART contains sequentially the
+characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */
+#define mainFIRST_TX_CHAR '0'
+#define mainLAST_TX_CHAR 'z'
+
+/* Just used to walk through the program memory in order that some random data
+can be generated. */
+#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) )
+#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 )
+
+/*-----------------------------------------------------------*/
+
+/*
+ * The task that rotates text on the LCD.
+ */
+static void vLCDTask( void * pvParameters );
+
+/*
+ * The task that receives the characters from UART 0.
+ */
+static void vCommsRxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex );
+
+/*
+ * The co-routine that periodically initiates the transmission of the string on
+ * the UART.
+ */
+static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex );
+
+/*
+ * Writes a string the the LCD.
+ */
+static void prvWriteString( const char *pcString );
+
+/*
+ * Initialisation routine for the UART.
+ */
+static void vSerialInit( void );
+
+/*
+ * Thread safe write to the PDC.
+ */
+static void prvPDCWrite( char cAddress, char cData );
+
+/*
+ * Function to simply set a known value into the general purpose registers
+ * then read them back to ensure they remain set correctly. An incorrect value
+ * being indicative of an error in the task switching mechanism.
+ */
+void prvSetAndCheckRegisters( void );
+
+/*
+ * Latch the LED that indicates that an error has occurred.
+ */
+void vSetErrorLED( void );
+
+/*
+ * Sets up the PLL and ports used by the demo.
+ */
+static void prvSetupHardware( void );
+
+/*-----------------------------------------------------------*/
+
+/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines
+defined within this file. */
+unsigned portBASE_TYPE uxErrorStatus = pdPASS;
+
+/* The next character to transmit. */
+static char cNextChar;
+
+/* The queue used to transmit characters from the interrupt to the Comms Rx
+task. */
+static xQueueHandle xCommsQueue;
+
+/*-----------------------------------------------------------*/
+
+int main( void )
+{
+ /* Create the queue used to communicate between the UART ISR and the Comms
+ Rx task. */
+ xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) );
+
+ /* Setup the ports used by the demo and the clock. */
+ prvSetupHardware();
+
+ /* Create the co-routines that flash the LED's. */
+ vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES );
+
+ /* Create the co-routine that initiates the transmission of characters
+ on the UART. */
+ xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX );
+
+ /* Create the co-routine that receives characters from the UART. */
+ xCoRoutineCreate( vCommsRxCoRoutine, mainRX_CO_ROUTINE_PRIORITY, mainRX_CO_ROUTINE_INDEX );
+
+ /* Create the LCD task. */
+ xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL );
+
+ /* Start the scheduler running the tasks and co-routines just created. */
+ vTaskStartScheduler();
+
+ /* Should not get here unless we did not have enough memory to start the
+ scheduler. */
+ for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupHardware( void )
+{
+ /* Setup the PLL. */
+ SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ );
+
+ /* Initialise the hardware used to talk to the LCD, LED's and UART. */
+ PDCInit();
+ vParTestInitialise();
+ vSerialInit();
+}
+/*-----------------------------------------------------------*/
+
+void vApplicationIdleHook( void )
+{
+ /* The co-routines are executed in the idle task using the idle task
+ hook. */
+ for( ;; )
+ {
+ /* Schedule the co-routines. */
+ vCoRoutineSchedule();
+
+ /* Run the register check function between each co-routine. */
+ prvSetAndCheckRegisters();
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvWriteString( const char *pcString )
+{
+ /* Write pcString to the LED, pausing between each character. */
+ prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR);
+ while( *pcString )
+ {
+ vTaskDelay( mainCHAR_WRITE_DELAY );
+ prvPDCWrite( PDC_LCD_RAM, *pcString );
+ pcString++;
+ }
+}
+/*-----------------------------------------------------------*/
+
+void vLCDTask( void * pvParameters )
+{
+unsigned portBASE_TYPE uxIndex;
+const unsigned char ucCFGData[] = {
+ 0x30, /* Set data bus to 8-bits. */
+ 0x30,
+ 0x30,
+ 0x3C, /* Number of lines/font. */
+ 0x08, /* Display off. */
+ 0x01, /* Display clear. */
+ 0x06, /* Entry mode [cursor dir][shift]. */
+ 0x0C /* Display on [display on][curson on][blinking on]. */
+ };
+
+/* The strings that are written to the LCD. */
+const char *pcStringsToDisplay[] = {
+ "Stellaris",
+ "Demo",
+ "Two",
+ "www.FreeRTOS.org",
+ ""
+ };
+
+ /* Configure the LCD. */
+ uxIndex = 0;
+ while( uxIndex < sizeof( ucCFGData ) )
+ {
+ prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] );
+ uxIndex++;
+ vTaskDelay( mainCHAR_WRITE_DELAY );
+ }
+
+ /* Turn the LCD Backlight on. */
+ prvPDCWrite( PDC_CSR, 0x01 );
+
+ /* Clear display. */
+ vTaskDelay( mainCHAR_WRITE_DELAY );
+ prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR );
+
+ uxIndex = 0;
+ for( ;; )
+ {
+ /* Display the string on the LCD. */
+ prvWriteString( pcStringsToDisplay[ uxIndex ] );
+
+ /* Move on to the next string - wrapping if necessary. */
+ uxIndex++;
+ if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 )
+ {
+ uxIndex = 0;
+ /* Longer pause on the last string to be sent. */
+ vTaskDelay( mainSTRING_WRITE_DELAY * 2 );
+ }
+
+ /* Wait until it is time to move onto the next string. */
+ vTaskDelay( mainSTRING_WRITE_DELAY );
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void vCommsRxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+{
+static char cRxedChar, cExpectedChar = mainFIRST_TX_CHAR;
+portBASE_TYPE xResult;
+
+ crSTART( xHandle );
+
+ for( ;; )
+ {
+ /* Wait for a character to be received. */
+ crQUEUE_RECEIVE( xHandle, xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY, &xResult );
+
+ /* Was the character recived (if any) the expected character. */
+ if( ( cRxedChar != cExpectedChar ) || ( xResult != pdPASS ) )
+ {
+ /* Got an unexpected character. This can sometimes occur when
+ reseting the system using the debugger leaving characters already
+ in the UART regsters. */
+ uxErrorStatus = pdFAIL;
+
+ /* Resync by waiting for the end of the current string. */
+ while( cRxedChar != mainLAST_TX_CHAR )
+ {
+ crQUEUE_RECEIVE( xHandle, xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY, &xResult );
+ }
+
+ /* The next expected character is the start of the string again. */
+ cExpectedChar = mainFIRST_TX_CHAR;
+ }
+ else
+ {
+ if( cExpectedChar == mainLAST_TX_CHAR )
+ {
+ /* We have reached the end of the string - we now expect to
+ receive the first character in the string again. The LED is
+ toggled to indicate that the entire string was received without
+ error. */
+ vParTestToggleLED( mainCOMMS_RX_LED );
+ cExpectedChar = mainFIRST_TX_CHAR;
+ }
+ else
+ {
+ /* We got the expected character, we now expect to receive the
+ next character in the string. */
+ cExpectedChar++;
+ }
+ }
+ }
+
+ crEND();
+}
+/*-----------------------------------------------------------*/
+
+static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+{
+portTickType xDelayPeriod;
+static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES;
+
+ /* Co-routine MUST start with a call to crSTART. */
+ crSTART( xHandle );
+
+ for(;;)
+ {
+ /* Was the previously transmitted string received correctly? */
+ if( uxErrorStatus != pdPASS )
+ {
+ /* An error was encountered so set the error LED. */
+ vSetErrorLED();
+ }
+
+ /* The next character to Tx is the first in the string. */
+ cNextChar = mainFIRST_TX_CHAR;
+
+ UARTIntDisable( UART0_BASE, UART_INT_TX );
+ {
+ /* Send the first character. */
+ if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) )
+ {
+ HWREG( UART0_BASE + UART_O_DR ) = cNextChar;
+ }
+
+ /* Move the variable to the char to Tx on so the ISR transmits
+ the next character in the string once this one has completed. */
+ cNextChar++;
+ }
+ UARTIntEnable(UART0_BASE, UART_INT_TX);
+
+ /* Toggle the LED to show a new string is being transmitted. */
+ vParTestToggleLED( mainCOMMS_TX_LED );
+
+ /* Delay before we start the string off again. A pseudo-random delay
+ is used as this will provide a better test. */
+ xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes );
+
+ pulRandomBytes++;
+ if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY )
+ {
+ pulRandomBytes = mainFIRST_PROGRAM_BYTES;
+ }
+
+ /* Make sure we don't wait too long... */
+ xDelayPeriod &= mainMAX_TX_DELAY;
+
+ /* ...but we do want to wait. */
+ if( xDelayPeriod < mainMIN_TX_DELAY )
+ {
+ xDelayPeriod = mainMIN_TX_DELAY;
+ }
+
+ /* Block for the random(ish) time. */
+ crDELAY( xHandle, xDelayPeriod );
+ }
+
+ /* Co-routine MUST end with a call to crEND. */
+ crEND();
+}
+/*-----------------------------------------------------------*/
+
+static void vSerialInit( void )
+{
+ /* Enable the UART. GPIOA has already been initialised. */
+ SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
+
+ /* Set GPIO A0 and A1 as peripheral function. They are used to output the
+ UART signals. */
+ GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW );
+
+ /* Configure the UART for 8-N-1 operation. */
+ UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE );
+
+ /* We dont want to use the fifo. This is for test purposes to generate
+ as many interrupts as possible. */
+ HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET;
+
+ /* Enable both Rx and Tx interrupts. */
+ HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX );
+ IntEnable( INT_UART0 );
+}
+/*-----------------------------------------------------------*/
+
+void vUART_ISR(void)
+{
+unsigned long ulStatus;
+char cRxedChar;
+portBASE_TYPE xTaskWokenByPost = pdFALSE;
+
+ /* What caused the interrupt. */
+ ulStatus = UARTIntStatus( UART0_BASE, pdTRUE );
+
+ /* Clear the interrupt. */
+ UARTIntClear( UART0_BASE, ulStatus );
+
+ /* Was an Rx interrpt pending? */
+ if( ulStatus & UART_INT_RX )
+ {
+ if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) )
+ {
+ /* Get the char from the buffer and post it onto the queue of
+ Rxed chars. Posting the character should wake the task that is
+ blocked on the queue waiting for characters. */
+ cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR );
+ xTaskWokenByPost = crQUEUE_SEND_FROM_ISR( xCommsQueue, &cRxedChar, xTaskWokenByPost );
+ }
+ }
+
+ /* Was a Tx interrupt pending? */
+ if( ulStatus & UART_INT_TX )
+ {
+ /* Send the next character in the string. We are not using the FIFO. */
+ if( cNextChar <= mainLAST_TX_CHAR )
+ {
+ if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) )
+ {
+ HWREG( UART0_BASE + UART_O_DR ) = cNextChar;
+ }
+ cNextChar++;
+ }
+ }
+
+ if( xTaskWokenByPost )
+ {
+ /* We are posting to a co-routine rather than a task so don't bother
+ causing a task switch. */
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvPDCWrite( char cAddress, char cData )
+{
+ vTaskSuspendAll();
+ {
+ PDCWrite( cAddress, cData );
+ }
+ xTaskResumeAll();
+}
+/*-----------------------------------------------------------*/
+
+void vSetErrorLED( void )
+{
+ vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE );
+}
+/*-----------------------------------------------------------*/
+
+__asm void prvSetAndCheckRegisters( void )
+{
+ extern vSetErrorLED
+
+ /* Fill the general purpose registers with known values. */
+ mov r11, #10
+ add r0, r11, #1
+ add r1, r11, #2
+ add r2, r11, #3
+ add r3, r11, #4
+ add r4, r11, #5
+ add r5, r11, #6
+ add r6, r11, #7
+ add r7, r11, #8
+ add r8, r11, #9
+ add r9, r11, #10
+ add r10, r11, #11
+ add r12, r11, #12
+
+ /* Check the values are as expected. */
+ cmp r11, #10
+ bne set_error_led
+ cmp r0, #11
+ bne set_error_led
+ cmp r1, #12
+ bne set_error_led
+ cmp r2, #13
+ bne set_error_led
+ cmp r3, #14
+ bne set_error_led
+ cmp r4, #15
+ bne set_error_led
+ cmp r5, #16
+ bne set_error_led
+ cmp r6, #17
+ bne set_error_led
+ cmp r7, #18
+ bne set_error_led
+ cmp r8, #19
+ bne set_error_led
+ cmp r9, #20
+ bne set_error_led
+ cmp r10, #21
+ bne set_error_led
+ cmp r12, #22
+ bne set_error_led
+ bx lr
+
+set_error_led;
+ push {r14}
+ ldr r1, =vSetErrorLED
+ blx r1
+ pop {r14}
+ bx lr;
+}
+/*-----------------------------------------------------------*/
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/readme.txt b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/readme.txt
new file mode 100644
index 0000000..2ddb358
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/Demo2/readme.txt
@@ -0,0 +1,3 @@
+Move these two fines into the Demo/CORTEX_LM3S102_KEIL directory to run Demo 2.
+
+See the port documentation on the www.FreeRTOS.org site for more information.
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Opt b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Opt
new file mode 100644
index 0000000..cdd7176
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Opt
@@ -0,0 +1,51 @@
+### uVision2 Project, (C) Keil Software
+### Do not modify !
+
+ cExt (*.c)
+ aExt (*.s*; *.src; *.a*)
+ oExt (*.obj)
+ lExt (*.lib)
+ tExt (*.txt; *.h; *.inc)
+ pExt (*.plm)
+ CppX (*.cpp)
+ DaveTm { 0,0,0,0,0,0,0,0 }
+
+Target (LM3S1xx), 0x0004 // Tools: 'ARM-ADS'
+GRPOPT 1,(Source),0,0,0
+GRPOPT 2,(Demo),0,0,0
+
+OPTFFF 1,1,1,0,0,0,0,0,<..\..\Source\croutine.c><croutine.c>
+OPTFFF 1,2,1,0,0,0,0,0,<..\..\Source\list.c><list.c>
+OPTFFF 1,3,1,0,0,0,0,0,<..\..\Source\queue.c><queue.c>
+OPTFFF 1,4,1,0,0,0,0,0,<..\..\Source\tasks.c><tasks.c>
+OPTFFF 1,5,1,0,0,0,0,0,<..\..\Source\portable\MemMang\heap_1.c><heap_1.c>
+OPTFFF 1,6,1,0,0,0,0,0,<..\..\Source\portable\RVDS\ARM_CM3\port.c><port.c>
+OPTFFF 2,7,1,0,0,0,0,0,<.\main.c><main.c>
+OPTFFF 2,8,2,0,0,0,0,0,<.\init\Startup.s><Startup.s>
+OPTFFF 2,9,1,0,0,0,0,0,<..\Common\Minimal\crflash.c><crflash.c>
+OPTFFF 2,10,1,0,0,0,0,0,<.\ParTest\ParTest.c><ParTest.c>
+OPTFFF 2,11,1,0,0,0,0,0,<.\include\pdc.c><pdc.c>
+OPTFFF 2,12,4,0,0,0,0,0,<..\Common\drivers\LuminaryMicro\Keil\driverlib.lib><driverlib.lib>
+
+
+TARGOPT 1, (LM3S1xx)
+ ADSCLK=20000000
+ OPTTT 1,1,1,0
+ OPTHX 1,65535,0,0,0
+ OPTLX 79,66,8,<.\uvision\>
+ OPTOX 16
+ OPTLT 1,1,1,0,1,1,0,1,0,0,0,0
+ OPTXL 1,1,1,1,1,1,1,0,0
+ OPTFL 1,0,1
+ OPTAX 0
+ OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S101)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S101)
+ OPTDBG 49150,1,()()()()()()()()()() (BIN\UL2CM3.DLL)()()()
+ OPTKEY 0,(DLGTARM)((1010=-1,-1,-1,-1,0)(1007=-1,-1,-1,-1,0)(1008=-1,-1,-1,-1,0)(1009=-1,-1,-1,-1,0)(110=-1,-1,-1,-1,0)(100=-1,-1,-1,-1,0)(101=-1,-1,-1,-1,0)(102=-1,-1,-1,-1,0)(161=-1,-1,-1,-1,0)(162=-1,-1,-1,-1,0)(150=-1,-1,-1,-1,0)(1012=-1,-1,-1,-1,0)(1014=-1,-1,-1,-1,0)(1016=-1,-1,-1,-1,0))
+ OPTKEY 0,(ARMDBGFLAGS)()
+ OPTKEY 0,(DLGUARM)((105=-1,-1,-1,-1,0)(106=-1,-1,-1,-1,0)(107=-1,-1,-1,-1,0))
+ OPTKEY 0,(UL2CM3)(-UU0226F8E -O14 -S0 -C0 -N00("ARM CoreSight JTAG-DP") -D00(1BA00477) -L00(4) -TO18 -TC10000000 -TP21 -TDS8007 -TDT0 -TDC1F -TIEFFFFFFFF -TIP7 -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_8 -FS00 -FL02000)
+ OPTDF 0x80
+ OPTLE <>
+ OPTLC <>
+EndOpt
+
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Uv2 b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Uv2
new file mode 100644
index 0000000..e72477a
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOS.Uv2
@@ -0,0 +1,112 @@
+### uVision2 Project, (C) Keil Software
+### Do not modify !
+
+Target (LM3S1xx), 0x0004 // Tools: 'ARM-ADS'
+
+Group (Source)
+Group (Demo)
+
+File 1,1,<..\..\Source\croutine.c><croutine.c>
+File 1,1,<..\..\Source\list.c><list.c>
+File 1,1,<..\..\Source\queue.c><queue.c>
+File 1,1,<..\..\Source\tasks.c><tasks.c>
+File 1,1,<..\..\Source\portable\MemMang\heap_1.c><heap_1.c>
+File 1,1,<..\..\Source\portable\RVDS\ARM_CM3\port.c><port.c>
+File 2,1,<.\main.c><main.c>
+File 2,2,<.\init\Startup.s><Startup.s>
+File 2,1,<..\Common\Minimal\crflash.c><crflash.c>
+File 2,1,<.\ParTest\ParTest.c><ParTest.c>
+File 2,1,<.\include\pdc.c><pdc.c>
+File 2,4,<..\Common\drivers\LuminaryMicro\Keil\driverlib.lib><driverlib.lib>
+
+
+Options 1,0,0 // Target 'LM3S1xx'
+ Device (LM3S101)
+ Vendor (Luminary Micro)
+ Cpu (IRAM(0x20000000-0x200007FF) IROM(0-0x1FFF) CLOCK(20000000) CPUTYPE("Cortex-M3"))
+ FlashUt ()
+ StupF ("STARTUP\Luminary\Startup.s" ("Luminary Startup Code"))
+ FlashDR (UL2CM3(-U40296420 -O7 -S0 -C0 -FO7 -FD20000000 -FC800 -FN1 -FF0LM3S_8 -FS00 -FL02000))
+ DevID (4079)
+ Rgf (LM3Sxxx.H)
+ Mem ()
+ C ()
+ A ()
+ RL ()
+ OH ()
+ DBC_IFX ()
+ DBC_CMS ()
+ DBC_AMS ()
+ DBC_LMS ()
+ UseEnv=0
+ EnvBin ()
+ EnvInc ()
+ EnvLib ()
+ EnvReg (ÿLuminary\)
+ OrgReg (ÿLuminary\)
+ TgStat=16
+ OutDir (.\uvision\)
+ OutName (RTOSDemo)
+ GenApp=1
+ GenLib=0
+ GenHex=0
+ Debug=1
+ Browse=1
+ LstDir (.\uvision\)
+ HexSel=1
+ MG32K=0
+ TGMORE=0
+ RunUsr 0 0 <>
+ RunUsr 1 0 <>
+ BrunUsr 0 0 <>
+ BrunUsr 1 0 <>
+ CrunUsr 0 0 <>
+ CrunUsr 1 0 <>
+ SVCSID <>
+ GLFLAGS=1790
+ ADSFLGA { 243,31,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ ACPUTYP ("Cortex-M3")
+ RVDEV ()
+ ADSTFLGA { 0,12,0,2,99,0,0,66,0,0,0,0,0,0,0,0,0,0,0,0 }
+ OCMADSOCM { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ OCMADSIRAM { 0,0,0,0,32,0,8,0,0 }
+ OCMADSIROM { 1,0,0,0,0,0,32,0,0 }
+ OCMADSXRAM { 0,0,0,0,0,0,0,0,0 }
+ OCR_RVCT { 1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,32,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,32,0,8,0,0,0,0,0,0,0,0,0,0,0 }
+ RV_STAVEC ()
+ ADSCCFLG { 8,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ ADSCMISC ()
+ ADSCDEFN (RVDS_ARMCM3_LM3S102)
+ ADSCUDEF ()
+ ADSCINCD (C:\Keil\ARM\RV30\LIB\Luminary;..\CORTEX_LM3S102_KEIL;..\..\Source\portable\RVDS\ARM_CM3;..\..\Source\include;..\Common\include;.\include)
+ ADSASFLG { 65,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ ADSAMISC (--diag_suppress 1581)
+ ADSADEFN ()
+ ADSAUDEF ()
+ ADSAINCD ()
+ PropFld { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ IncBld=1
+ AlwaysBuild=0
+ GenAsm=0
+ AsmAsm=0
+ PublicsOnly=0
+ StopCode=3
+ CustArgs ()
+ LibMods ()
+ ADSLDFG { 16,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 }
+ ADSLDTA (0x00000000)
+ ADSLDDA (0x20000000)
+ ADSLDSC ()
+ ADSLDIB ()
+ ADSLDIC ()
+ ADSLDMC (--entry Reset_Handler)
+ ADSLDIF ()
+ ADSLDDW (6306)
+ OPTDL (SARMCM3.DLL)()(DLM.DLL)(-pLM3S101)(SARMCM3.DLL)()(TLM.DLL)(-pLM3S101)
+ OPTDBG 49150,1,()()()()()()()()()() (BIN\UL2CM3.DLL)()()()
+ FLASH1 { 1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0 }
+ FLASH2 (BIN\UL2CM3.DLL)
+ FLASH3 ("" ())
+ FLASH4 ()
+EndOpt
+
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOSConfig.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOSConfig.h
new file mode 100644
index 0000000..aaea9d7
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/FreeRTOSConfig.h
@@ -0,0 +1,113 @@
+/*
+ FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
+
+
+ ***************************************************************************
+ * *
+ * FreeRTOS tutorial books are available in pdf and paperback. *
+ * Complete, revised, and edited pdf reference manuals are also *
+ * available. *
+ * *
+ * Purchasing FreeRTOS documentation will not only help you, by *
+ * ensuring you get running as quickly as possible and with an *
+ * in-depth knowledge of how to use FreeRTOS, it will also help *
+ * the FreeRTOS project to continue with its mission of providing *
+ * professional grade, cross platform, de facto standard solutions *
+ * for microcontrollers - completely free of charge! *
+ * *
+ * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
+ * *
+ * Thank you for using FreeRTOS, and thank you for your support! *
+ * *
+ ***************************************************************************
+
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ >>>NOTE<<< The modification to the GPL is included to allow you to
+ distribute a combined work that includes FreeRTOS without being obliged to
+ provide the source code for proprietary components outside of the FreeRTOS
+ kernel. FreeRTOS is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ ***************************************************************************
+ * *
+ * Having a problem? Start by reading the FAQ "My application does *
+ * not run, what could be wrong? *
+ * *
+ * http://www.FreeRTOS.org/FAQHelp.html *
+ * *
+ ***************************************************************************
+
+
+ http://www.FreeRTOS.org - Documentation, training, latest information,
+ license and contact details.
+
+ http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+ including FreeRTOS+Trace - an indispensable productivity tool.
+
+ Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
+ the code with commercial support, indemnification, and middleware, under
+ the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
+ provide a safety engineered and independently SIL3 certified version under
+ the SafeRTOS brand: http://www.SafeRTOS.com.
+*/
+
+#ifndef FREERTOS_CONFIG_H
+#define FREERTOS_CONFIG_H
+
+/*-----------------------------------------------------------
+ * Application specific definitions.
+ *
+ * These definitions should be adjusted for your particular hardware and
+ * application requirements.
+ *
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
+ *
+ * See http://www.freertos.org/a00110.html.
+ *----------------------------------------------------------*/
+
+#define configUSE_PREEMPTION 1
+#define configUSE_IDLE_HOOK 1
+#define configUSE_TICK_HOOK 0
+#define configCPU_CLOCK_HZ ( ( unsigned long ) 20000000 )
+#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
+#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 59 )
+#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 1468 ) )
+#define configMAX_TASK_NAME_LEN ( 3 )
+#define configUSE_TRACE_FACILITY 0
+#define configUSE_16_BIT_TICKS 0
+#define configIDLE_SHOULD_YIELD 0
+#define configUSE_CO_ROUTINES 1
+
+#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 2 )
+#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 0
+#define INCLUDE_uxTaskPriorityGet 0
+#define INCLUDE_vTaskDelete 0
+#define INCLUDE_vTaskCleanUpResources 0
+#define INCLUDE_vTaskSuspend 0
+#define INCLUDE_vTaskDelayUntil 0
+#define INCLUDE_vTaskDelay 1
+
+#define configKERNEL_INTERRUPT_PRIORITY 255
+#define configMAX_SYSCALL_INTERRUPT_PRIORITY 191 /* equivalent to 0xa0, or priority 5. */
+
+
+#endif /* FREERTOS_CONFIG_H */
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/ParTest/ParTest.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/ParTest/ParTest.c
new file mode 100644
index 0000000..8b3eebb
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/ParTest/ParTest.c
@@ -0,0 +1,146 @@
+/*
+ FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
+
+
+ ***************************************************************************
+ * *
+ * FreeRTOS tutorial books are available in pdf and paperback. *
+ * Complete, revised, and edited pdf reference manuals are also *
+ * available. *
+ * *
+ * Purchasing FreeRTOS documentation will not only help you, by *
+ * ensuring you get running as quickly as possible and with an *
+ * in-depth knowledge of how to use FreeRTOS, it will also help *
+ * the FreeRTOS project to continue with its mission of providing *
+ * professional grade, cross platform, de facto standard solutions *
+ * for microcontrollers - completely free of charge! *
+ * *
+ * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
+ * *
+ * Thank you for using FreeRTOS, and thank you for your support! *
+ * *
+ ***************************************************************************
+
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ >>>NOTE<<< The modification to the GPL is included to allow you to
+ distribute a combined work that includes FreeRTOS without being obliged to
+ provide the source code for proprietary components outside of the FreeRTOS
+ kernel. FreeRTOS is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ ***************************************************************************
+ * *
+ * Having a problem? Start by reading the FAQ "My application does *
+ * not run, what could be wrong? *
+ * *
+ * http://www.FreeRTOS.org/FAQHelp.html *
+ * *
+ ***************************************************************************
+
+
+ http://www.FreeRTOS.org - Documentation, training, latest information,
+ license and contact details.
+
+ http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+ including FreeRTOS+Trace - an indispensable productivity tool.
+
+ Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
+ the code with commercial support, indemnification, and middleware, under
+ the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
+ provide a safety engineered and independently SIL3 certified version under
+ the SafeRTOS brand: http://www.SafeRTOS.com.
+*/
+
+/*-----------------------------------------------------------
+ * Simple parallel port IO routines.
+ *-----------------------------------------------------------*/
+
+/*
+*/
+
+
+#include "FreeRTOS.h"
+#include "task.h"
+#include "partest.h"
+
+#include "pdc.h"
+
+#define partstPINS (GPIO_PIN_0 | GPIO_PIN_1 | GPIO_PIN_2 | GPIO_PIN_3 Z | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6 | GPIO_PIN_7)
+
+#define partstALL_OUTPUTS_OFF ( ( unsigned char ) 0x00 )
+#define partstMAX_OUTPUT_LED ( ( unsigned char ) 8 )
+
+static volatile unsigned char ucOutputValue = partstALL_OUTPUTS_OFF;
+
+void vParTestInitialise( void )
+{
+ PDCInit();
+ PDCWrite( PDC_LED, ucOutputValue );
+}
+/*-----------------------------------------------------------*/
+
+void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
+{
+unsigned char ucBit = ( unsigned char ) 1;
+
+ vTaskSuspendAll();
+ {
+ if( uxLED < partstMAX_OUTPUT_LED )
+ {
+ ucBit = ( ( unsigned char ) 1 ) << uxLED;
+
+ if( xValue == pdFALSE )
+ {
+ ucBit ^= ( unsigned char ) 0xff;
+ ucOutputValue &= ucBit;
+ }
+ else
+ {
+ ucOutputValue |= ucBit;
+ }
+
+ PDCWrite( PDC_LED, ucOutputValue );
+ }
+ }
+ xTaskResumeAll();
+}
+/*-----------------------------------------------------------*/
+
+void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
+{
+unsigned char ucBit;
+
+ vTaskSuspendAll();
+ {
+ if( uxLED < partstMAX_OUTPUT_LED )
+ {
+ ucBit = ( ( unsigned char ) 1 ) << uxLED;
+
+ if( ucOutputValue & ucBit )
+ {
+ ucOutputValue &= ~ucBit;
+ }
+ else
+ {
+ ucOutputValue |= ucBit;
+ }
+
+ PDCWrite( PDC_LED, ucOutputValue );
+ }
+ }
+ xTaskResumeAll();
+}
+
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.c
new file mode 100644
index 0000000..d1c5444
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.c
@@ -0,0 +1,118 @@
+//*****************************************************************************
+//
+// pdc.c - Driver for the Peripheral Device Controller (PDC) on the Stellaris
+// development board.
+//
+// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved.
+//
+// Software License Agreement
+//
+// Luminary Micro, Inc. (LMI) is supplying this software for use solely and
+// exclusively on LMI's Stellaris Family of microcontroller products.
+//
+// The software is owned by LMI and/or its suppliers, and is protected under
+// applicable copyright laws. All rights are reserved. Any use in violation
+// of the foregoing restrictions may subject the user to criminal sanctions
+// under applicable laws, as well as to civil liability for the breach of the
+// terms and conditions of this license.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
+// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+//*****************************************************************************
+
+#include "LM3Sxxx.h"
+#include "pdc.h"
+
+//*****************************************************************************
+//
+//! Initializes the connection to the PDC.
+//!
+//! This function will enable clocking to the SSI and GPIO A modules, configure
+//! the GPIO pins to be used for an SSI interface, and it will configure the
+//! SSI as a 1Mb master device, operating in MOTO mode. It will also enable
+//! the SSI module, and will enable the chip select for the PDC on the
+//! Stellaris development board.
+//!
+//! This function is contained in <tt>utils/pdc.c</tt>, with
+//! <tt>utils/pdc.h</tt> containing the API definition for use by applications.
+//!
+//! \return None.
+//
+//*****************************************************************************
+void
+PDCInit(void)
+{
+ //
+ // Enable the peripherals used to drive the PDC.
+ //
+ SysCtlPeripheralEnable(SYSCTL_PERIPH_SSI);
+ SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
+
+ //
+ // Configure the appropriate pins to be SSI instead of GPIO.
+ //
+ GPIODirModeSet(GPIO_PORTA_BASE, SSI_CLK | SSI_TX | SSI_RX,
+ GPIO_DIR_MODE_HW);
+ GPIODirModeSet(GPIO_PORTA_BASE, SSI_CS, GPIO_DIR_MODE_OUT);
+ GPIOPadConfigSet(GPIO_PORTA_BASE, SSI_CLK, GPIO_STRENGTH_4MA,
+ GPIO_PIN_TYPE_STD_WPU);
+
+ //
+ // Configure the SSI port.
+ //
+ SSIConfig(SSI_BASE, SSI_FRF_MOTO_MODE_0, SSI_MODE_MASTER, 1000000, 8);
+ SSIEnable(SSI_BASE);
+
+ //
+ // Reset the PDC SSI state machine. The chip select needs to be held low
+ // for 100ns; the procedure call overhead more than accounts for this time.
+ //
+ GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, 0);
+ GPIOPinWrite(GPIO_PORTA_BASE, PDC_CS, PDC_CS);
+}
+
+//*****************************************************************************
+//
+//! Write a PDC register.
+//!
+//! \param ucAddr specifies the PDC register to write.
+//! \param ucData specifies the data to write.
+//!
+//! This function will perform the SSI transfers required to write a register
+//! in the PDC on the Stellaris development board.
+//!
+//! This function is contained in <tt>utils/pdc.c</tt>, with
+//! <tt>utils/pdc.h</tt> containing the API definition for use by applications.
+//!
+//! \return None.
+//
+//*****************************************************************************
+void
+PDCWrite(unsigned char ucAddr, unsigned char ucData)
+{
+ unsigned long ulTemp;
+
+ //
+ // Send address and write command.
+ //
+ SSIDataPut(SSI_BASE, (ucAddr & 0x0F) | PDC_WR);
+
+ //
+ // Write the data.
+ //
+ SSIDataPut(SSI_BASE, ucData);
+
+ //
+ // Flush data read during address write.
+ //
+ SSIDataGet(SSI_BASE, &ulTemp);
+
+ //
+ // Flush data read during data write.
+ //
+ SSIDataGet(SSI_BASE, &ulTemp);
+}
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.h b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.h
new file mode 100644
index 0000000..6380806
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/include/pdc.h
@@ -0,0 +1,122 @@
+//*****************************************************************************
+//
+// pdc.h - Stellaris development board Peripheral Device Controller definitions
+// and prototypes.
+//
+// Copyright (c) 2005,2006 Luminary Micro, Inc. All rights reserved.
+//
+// Software License Agreement
+//
+// Luminary Micro, Inc. (LMI) is supplying this software for use solely and
+// exclusively on LMI's Stellaris Family of microcontroller products.
+//
+// The software is owned by LMI and/or its suppliers, and is protected under
+// applicable copyright laws. All rights are reserved. Any use in violation
+// of the foregoing restrictions may subject the user to criminal sanctions
+// under applicable laws, as well as to civil liability for the breach of the
+// terms and conditions of this license.
+//
+// THIS SOFTWARE IS PROVIDED "AS IS". NO WARRANTIES, WHETHER EXPRESS, IMPLIED
+// OR STATUTORY, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF
+// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE APPLY TO THIS SOFTWARE.
+// LMI SHALL NOT, IN ANY CIRCUMSTANCES, BE LIABLE FOR SPECIAL, INCIDENTAL, OR
+// CONSEQUENTIAL DAMAGES, FOR ANY REASON WHATSOEVER.
+//
+//*****************************************************************************
+
+#ifndef __PDC_H__
+#define __PDC_H__
+
+#ifdef __cplusplus
+extern "C"
+{
+#endif
+
+//*****************************************************************************
+//
+// The registers within the peripheral device controller.
+//
+//*****************************************************************************
+#define PDC_VER 0x0 // Version register
+#define PDC_CSR 0x1 // Command/Status register
+#define PDC_DSW 0x4 // DIP Switch register
+#define PDC_LED 0x5 // LED register
+#define PDC_LCD_CSR 0x6 // LCD Command/Status register
+#define PDC_LCD_RAM 0x7 // LCD RAM register
+#define PDC_GPXDAT 0x8 // GPIO X Data register
+#define PDC_GPXDIR 0x9 // GPIO X Direction register
+#define PDC_GPYDAT 0xA // GPIO Y Data register
+#define PDC_GPYDIR 0xB // GPIO Y Direction register
+#define PDC_GPZDAT 0xC // GPIO Z Data register
+#define PDC_GPZDIR 0xD // GPIO Z Direction register
+
+//*****************************************************************************
+//
+// Flags indicating a read or write to the peripheral device controller.
+//
+//*****************************************************************************
+#define PDC_RD 0x80 // PDC read command
+#define PDC_WR 0x00 // PDC write command
+
+//*****************************************************************************
+//
+// LCD panel (Crystalfontz CFAH1602B) commands, RS = 0
+//
+//*****************************************************************************
+#define LCD_CLEAR 0x01 // Clear display (0 fill DDRAM).
+#define LCD_HOME 0x02 // Cursor home.
+#define LCD_MODE 0x04 // Set entry mode (cursor dir)
+#define LCD_ON 0x08 // Set display, cursor, blinking
+ // on/off
+#define LCD_CUR 0x10 // Cursor, display shift
+#define LCD_IF 0x20 // Set interface data length,
+ // lines, font
+#define LCD_CGADDR 0x40 // Set CGRAM AC address
+#define LCD_DDADDR 0x80 // Set DDRAM AC address
+
+//*****************************************************************************
+//
+// LCD Status bit
+//
+//*****************************************************************************
+#define LCD_B_BUSY 0x80 // Busy flag.
+
+//*****************************************************************************
+//
+// The GPIO port A pin numbers for the various SSI signals.
+//
+//*****************************************************************************
+#define SSI_CS GPIO_PIN_3
+#define PDC_CS GPIO_PIN_3
+#define SSI_CLK GPIO_PIN_2
+#define SSI_TX GPIO_PIN_5
+#define SSI_RX GPIO_PIN_4
+
+//*****************************************************************************
+//
+// Function Prototypes
+//
+//*****************************************************************************
+extern void PDCInit(void);
+extern unsigned char PDCRead(unsigned char ucAddr);
+extern void PDCWrite(unsigned char ucAddr, unsigned char ucData);
+extern unsigned char PDCDIPRead(void);
+extern void PDCLEDWrite(unsigned char ucLED);
+extern unsigned char PDCLEDRead(void);
+extern void PDCLCDInit(void);
+extern void PDCLCDBacklightOn(void);
+extern void PDCLCDBacklightOff(void);
+extern void PDCLCDClear(void);
+extern void PDCLCDCreateChar(unsigned char ucChar, unsigned char *pucData);
+extern void PDCLCDSetPos(unsigned char ucX, unsigned char ucY);
+extern void PDCLCDWrite(const char *pcStr, unsigned long ulCount);
+extern unsigned char PDCGPIODirRead(unsigned char ucIdx);
+extern void PDCGPIODirWrite(unsigned char ucIdx, unsigned char ucValue);
+extern unsigned char PDCGPIORead(unsigned char ucIdx);
+extern void PDCGPIOWrite(unsigned char ucIdx, unsigned char ucValue);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif // __PDC_H__
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/init/Startup.s b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/init/Startup.s
new file mode 100644
index 0000000..d5dea8b
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/init/Startup.s
@@ -0,0 +1,164 @@
+;/*****************************************************************************/
+;/* STARTUP.S: Startup file for Luminary Micro LM3Sxxx */
+;/*****************************************************************************/
+;/* <<< Use Configuration Wizard in Context Menu >>> */
+;/*****************************************************************************/
+;/* This file is part of the uVision/ARM development tools. */
+;/* Copyright (c) 2005-2006 Keil Software. All rights reserved. */
+;/* This software may only be used under the terms of a valid, current, */
+;/* end user licence from KEIL for a compatible version of KEIL software */
+;/* development tools. Nothing else gives you the right to use this software. */
+;/*****************************************************************************/
+
+
+;/*
+; * The STARTUP.S code is executed after CPU Reset.
+; */
+
+
+;// <h> Stack Configuration
+;// <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;// </h>
+
+Stack_Size EQU 51
+
+ AREA STACK, NOINIT, READWRITE, ALIGN=3
+Stack_Mem SPACE Stack_Size
+
+
+;// <h> Heap Configuration
+;// <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
+;// </h>
+
+Heap_Size EQU 0x00000000
+
+ AREA HEAP, NOINIT, READWRITE, ALIGN=3
+Heap_Mem SPACE Heap_Size
+
+
+; System Control Register Addresses
+SYSCTL_BASE EQU 0x400FE000 ; System Control Base Address
+PBORCTL_OFS EQU 0x0030 ; Power-On & Brown-Out Reset Control
+LDOPC_OFS EQU 0x0034 ; LDO Power
+SRCR0_OFS EQU 0x0040 ; Software Reset Control 0
+SRCR1_OFS EQU 0x0044 ; Software Reset Control 1
+SRCR2_OFS EQU 0x0048 ; Software Reset Control 2
+RCC_OFS EQU 0x0060 ; Run-Mode Clock Control
+RCGC0_OFS EQU 0x0100 ; Run-Mode Clock Gating Control 0
+RCGC1_OFS EQU 0x0104 ; Run-Mode Clock Gating Control 1
+RCGC2_OFS EQU 0x0108 ; Run-Mode Clock Gating Control 2
+SCGC0_OFS EQU 0x0110 ; Sleep-Mode Clock Gating Control 0
+SCGC1_OFS EQU 0x0114 ; Sleep-Mode Clock Gating Control 1
+SCGC2_OFS EQU 0x0118 ; Sleep-Mode Clock Gating Control 2
+DCGC0_OFS EQU 0x0120 ; Deep-Sleep-Mode Clock Gating Control 0
+DCGC1_OFS EQU 0x0124 ; Deep-Sleep-Mode Clock Gating Control 1
+DCGC2_OFS EQU 0x0128 ; Deep-Sleep-Mode Clock Gating Control 2
+
+
+ PRESERVE8
+
+
+; Area Definition and Entry Point
+; Startup Code must be linked first at Address 0.
+
+ AREA RESET, CODE, READONLY
+ THUMB
+
+ IMPORT xPortPendSVHandler
+ IMPORT xPortSysTickHandler
+ IMPORT vUART_ISR
+ IMPORT vPortSVCHandler
+
+; Vector Table
+ EXPORT __Vectors
+__Vectors DCD Stack_Mem + Stack_Size ; Top of Stack
+ DCD Reset_Handler ; Reset Handler
+ DCD NmiSR ; NMI Handler
+ DCD DefaultISR ; Hard Fault Handler
+ DCD DefaultISR ; MPU Fault Handler
+ DCD DefaultISR ; Bus Fault Handler
+ DCD DefaultISR ; Usage Fault Handler
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD 0 ; Reserved
+ DCD vPortSVCHandler ; SVCall Handler
+ DCD DefaultISR ; Debug Monitor Handler
+ DCD 0 ; Reserved
+ DCD xPortPendSVHandler ; PendSV Handler
+ DCD xPortSysTickHandler ; SysTick Handler
+ DCD DefaultISR ; GPIO Port A Handler
+ DCD DefaultISR ; GPIO Port B Handler
+ DCD DefaultISR ; GPIO Port C Handler
+ DCD DefaultISR ; GPIO Port D Handler
+ DCD DefaultISR ; GPIO Port E Handler
+ DCD vUART_ISR ; UART0 Rx/Tx Handler
+ DCD DefaultISR ; UART1 Rx/Tx Handler
+ DCD DefaultISR ; SSI Rx/Tx Handler
+ DCD DefaultISR ; I2C Master/Slave Handler
+ DCD DefaultISR ; PWM Fault Handler
+ DCD DefaultISR ; PWM Generator 0 Handler
+ DCD DefaultISR ; PWM Generator 1 Handler
+ DCD DefaultISR ; PWM Generator 2 Handler
+ DCD DefaultISR ; Quadrature Encoder Handler
+ DCD DefaultISR ; ADC Sequence 0 Handler
+ DCD DefaultISR ; ADC Sequence 1 Handler
+ DCD DefaultISR ; ADC Sequence 2 Handler
+ DCD DefaultISR ; ADC Sequence 3 Handler
+ DCD DefaultISR ; Watchdog Timer Handler
+ DCD DefaultISR ; Timer 0 Subtimer A Handler
+ DCD DefaultISR ; Timer 0 Subtimer B Handler
+ DCD DefaultISR ; Timer 1 Subtimer A Handler
+ DCD DefaultISR ; Timer 1 Subtimer B Handler
+ DCD DefaultISR ; Timer 2 Subtimer A Handler
+ DCD DefaultISR ; Timer 2 Subtimer B Handler
+ DCD DefaultISR ; Analog Comparator 0 Handler
+ DCD DefaultISR ; Analog Comparator 1 Handler
+ DCD DefaultISR ; Analog Comparator 2 Handler
+ DCD DefaultISR ; System Control Handler
+ DCD DefaultISR ; Flash Control Handler
+
+; Dummy Handlers are implemented as infinite loops which can be modified.
+
+NmiSR B NmiSR
+FaultISR B FaultISR
+ EXPORT FaultISR
+DefaultISR B DefaultISR
+
+
+; Reset Handler
+
+ EXPORT Reset_Handler
+Reset_Handler
+
+; Enable Clock Gating for Peripherals
+; LDR R0, =SYSCTL_BASE ; System Control Base Address
+; MVN R1, #0 ; Value 0xFFFFFFFF
+; STR R1, [R0,#RCGC0_OFS] ; Run-Mode Clock Gating Ctrl 0
+; STR R1, [R0,#RCGC1_OFS] ; Run-Mode Clock Gating Ctrl 1
+; STR R1, [R0,#RCGC2_OFS] ; Run-Mode Clock Gating Ctrl 2
+
+; Enter the C code
+
+ IMPORT __main
+ LDR R0, =__main
+ BX R0
+
+
+; User Initial Stack & Heap
+ AREA |.text|, CODE, READONLY
+
+ IMPORT __use_two_region_memory
+ EXPORT __user_initial_stackheap
+__user_initial_stackheap
+
+ LDR R0, = Heap_Mem
+ LDR R1, =(Stack_Mem + Stack_Size)
+ LDR R2, = (Heap_Mem + Heap_Size)
+ LDR R3, = Stack_Mem
+ BX LR
+
+ ALIGN
+
+
+ END
diff --git a/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/main.c b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/main.c
new file mode 100644
index 0000000..560d41d
--- /dev/null
+++ b/third_party/FreeRTOS/Demo/CORTEX_LM3S102_KEIL/main.c
@@ -0,0 +1,630 @@
+/*
+ FreeRTOS V7.1.1 - Copyright (C) 2012 Real Time Engineers Ltd.
+
+
+ ***************************************************************************
+ * *
+ * FreeRTOS tutorial books are available in pdf and paperback. *
+ * Complete, revised, and edited pdf reference manuals are also *
+ * available. *
+ * *
+ * Purchasing FreeRTOS documentation will not only help you, by *
+ * ensuring you get running as quickly as possible and with an *
+ * in-depth knowledge of how to use FreeRTOS, it will also help *
+ * the FreeRTOS project to continue with its mission of providing *
+ * professional grade, cross platform, de facto standard solutions *
+ * for microcontrollers - completely free of charge! *
+ * *
+ * >>> See http://www.FreeRTOS.org/Documentation for details. <<< *
+ * *
+ * Thank you for using FreeRTOS, and thank you for your support! *
+ * *
+ ***************************************************************************
+
+
+ This file is part of the FreeRTOS distribution.
+
+ FreeRTOS is free software; you can redistribute it and/or modify it under
+ the terms of the GNU General Public License (version 2) as published by the
+ Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
+ >>>NOTE<<< The modification to the GPL is included to allow you to
+ distribute a combined work that includes FreeRTOS without being obliged to
+ provide the source code for proprietary components outside of the FreeRTOS
+ kernel. FreeRTOS is distributed in the hope that it will be useful, but
+ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ more details. You should have received a copy of the GNU General Public
+ License and the FreeRTOS license exception along with FreeRTOS; if not it
+ can be viewed here: http://www.freertos.org/a00114.html and also obtained
+ by writing to Richard Barry, contact details for whom are available on the
+ FreeRTOS WEB site.
+
+ 1 tab == 4 spaces!
+
+ ***************************************************************************
+ * *
+ * Having a problem? Start by reading the FAQ "My application does *
+ * not run, what could be wrong? *
+ * *
+ * http://www.FreeRTOS.org/FAQHelp.html *
+ * *
+ ***************************************************************************
+
+
+ http://www.FreeRTOS.org - Documentation, training, latest information,
+ license and contact details.
+
+ http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
+ including FreeRTOS+Trace - an indispensable productivity tool.
+
+ Real Time Engineers ltd license FreeRTOS to High Integrity Systems, who sell
+ the code with commercial support, indemnification, and middleware, under
+ the OpenRTOS brand: http://www.OpenRTOS.com. High Integrity Systems also
+ provide a safety engineered and independently SIL3 certified version under
+ the SafeRTOS brand: http://www.SafeRTOS.com.
+*/
+
+/*
+ * This demo application creates six co-routines and two tasks (three including
+ * the idle task). The co-routines execute as part of the idle task hook.
+ *
+ * Five of the created co-routines are the standard 'co-routine flash'
+ * co-routines contained within the Demo/Common/Minimal/crflash.c file and
+ * documented on the FreeRTOS.org WEB site.
+ *
+ * The 'LCD Task' rotates a string on the LCD, delaying between each character
+ * as necessitated by the slow interface, and delaying between each string just
+ * long enough to enable the text to be read.
+ *
+ * The sixth co-routine and final task control the transmission and reception
+ * of a string to UART 0. The co-routine periodically sends the first
+ * character of the string to the UART, with the UART's TxEnd interrupt being
+ * used to transmit the remaining characters. The UART's RxEnd interrupt
+ * receives the characters and places them on a queue to be processed by the
+ * 'COMs Rx' task. An error is latched should an unexpected character be
+ * received, or any character be received out of sequence.
+ *
+ * A loopback connector is required to ensure that each character transmitted
+ * on the UART is also received on the same UART. For test purposes the UART
+ * FIFO's are not utalised in order to maximise the interrupt overhead. Also
+ * a pseudo random interval is used between the start of each transmission in
+ * order that the resultant interrupts are more randomly distributed and
+ * therefore more likely to highlight any problems.
+ *
+ * The flash co-routines control LED's zero to four. LED five is toggled each
+ * time the string is transmitted on the UART. LED six is toggled each time
+ * the string is CORRECTLY received on the UART. LED seven is latched on should
+ * an error be detected in any task or co-routine.
+ *
+ * In addition the idle task makes repetative calls to
+ * prvSetAndCheckRegisters(). This simply loads the general purpose registers
+ * with a known value, then checks each register to ensure the held value is
+ * still correct. As a low priority task this checking routine is likely to
+ * get repeatedly swapped in and out. A register being found to contain an
+ * incorrect value is therefore indicative of an error in the task switching
+ * mechansim.
+ *
+ */
+
+/* Scheduler include files. */
+#include "FreeRTOS.h"
+#include "task.h"
+#include "queue.h"
+#include "croutine.h"
+
+/* Demo application include files. */
+#include "partest.h"
+#include "crflash.h"
+
+/* Library include files. */
+#include "LM3Sxxx.h"
+#include "pdc.h"
+
+/* The time to delay between writing each character to the LCD. */
+#define mainCHAR_WRITE_DELAY ( 2 / portTICK_RATE_MS )
+
+/* The time to delay between writing each string to the LCD. */
+#define mainSTRING_WRITE_DELAY ( 400 / portTICK_RATE_MS )
+
+/* The number of flash co-routines to create. */
+#define mainNUM_FLASH_CO_ROUTINES ( 5 )
+
+/* The length of the queue used to pass received characters to the Comms Rx
+task. */
+#define mainRX_QUEUE_LEN ( 5 )
+
+/* The priority of the co-routine used to initiate the transmission of the
+string on UART 0. */
+#define mainTX_CO_ROUTINE_PRIORITY ( 1 )
+
+/* Only one co-routine is created so its index is not important. */
+#define mainTX_CO_ROUTINE_INDEX ( 0 )
+
+/* The time between transmissions of the string on UART 0. This is pseudo
+random in order to generate a bit or randomness to when the interrupts occur.*/
+#define mainMIN_TX_DELAY ( 40 / portTICK_RATE_MS )
+#define mainMAX_TX_DELAY ( ( portTickType ) 0x7f )
+#define mainOFFSET_TIME ( ( portTickType ) 3 )
+
+/* The time the Comms Rx task should wait to receive a character. This should
+be slightly longer than the time between transmissions. If we do not receive
+a character after this time then there must be an error in the transmission or
+the timing of the transmission. */
+#define mainCOMMS_RX_DELAY ( mainMAX_TX_DELAY + 20 )
+
+/* The task priorites. */
+#define mainLCD_TASK_PRIORITY ( tskIDLE_PRIORITY )
+#define mainCOMMS_RX_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 )
+
+/* The LED's toggled by the various tasks. */
+#define mainCOMMS_FAIL_LED ( 7 )
+#define mainCOMMS_RX_LED ( 6 )
+#define mainCOMMS_TX_LED ( 5 )
+
+/* The baud rate used by the UART comms tasks/co-routine. */
+#define mainBAUD_RATE ( 57600 )
+
+/* FIFO setting for the UART. The FIFO is not used to create a better test. */
+#define mainFIFO_SET ( 0x10 )
+
+/* The string that is transmitted on the UART contains sequentially the
+characters from mainFIRST_TX_CHAR to mainLAST_TX_CHAR. */
+#define mainFIRST_TX_CHAR '0'
+#define mainLAST_TX_CHAR 'z'
+
+/* Just used to walk through the program memory in order that some random data
+can be generated. */
+#define mainTOTAL_PROGRAM_MEMORY ( ( unsigned long * ) ( 8 * 1024 ) )
+#define mainFIRST_PROGRAM_BYTES ( ( unsigned long * ) 4 )
+
+/*-----------------------------------------------------------*/
+
+/*
+ * The task that rotates text on the LCD.
+ */
+static void vLCDTask( void * pvParameters );
+
+/*
+ * The task that receives the characters from UART 0.
+ */
+static void vCommsRxTask( void * pvParameters );
+
+/*
+ * The co-routine that periodically initiates the transmission of the string on
+ * the UART.
+ */
+static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex );
+
+/*
+ * Writes a string the the LCD.
+ */
+static void prvWriteString( const char *pcString );
+
+/*
+ * Initialisation routine for the UART.
+ */
+static void vSerialInit( void );
+
+/*
+ * Thread safe write to the PDC.
+ */
+static void prvPDCWrite( char cAddress, char cData );
+
+/*
+ * Function to simply set a known value into the general purpose registers
+ * then read them back to ensure they remain set correctly. An incorrect value
+ * being indicative of an error in the task switching mechanism.
+ */
+void prvSetAndCheckRegisters( void );
+
+/*
+ * Latch the LED that indicates that an error has occurred.
+ */
+void vSetErrorLED( void );
+
+/*
+ * Sets up the PLL and ports used by the demo.
+ */
+static void prvSetupHardware( void );
+
+/*-----------------------------------------------------------*/
+
+/* Error flag set to pdFAIL if an error is encountered in the tasks/co-routines
+defined within this file. */
+unsigned portBASE_TYPE uxErrorStatus = pdPASS;
+
+/* The next character to transmit. */
+static char cNextChar;
+
+/* The queue used to transmit characters from the interrupt to the Comms Rx
+task. */
+static xQueueHandle xCommsQueue;
+
+/*-----------------------------------------------------------*/
+
+int main( void )
+{
+ /* Create the queue used to communicate between the UART ISR and the Comms
+ Rx task. */
+ xCommsQueue = xQueueCreate( mainRX_QUEUE_LEN, sizeof( char ) );
+
+ /* Setup the ports used by the demo and the clock. */
+ prvSetupHardware();
+
+ /* Create the co-routines that flash the LED's. */
+ vStartFlashCoRoutines( mainNUM_FLASH_CO_ROUTINES );
+
+ /* Create the co-routine that initiates the transmission of characters
+ on the UART. */
+ xCoRoutineCreate( vSerialTxCoRoutine, mainTX_CO_ROUTINE_PRIORITY, mainTX_CO_ROUTINE_INDEX );
+
+ /* Create the LCD and Comms Rx tasks. */
+ xTaskCreate( vLCDTask, "LCD", configMINIMAL_STACK_SIZE, NULL, mainLCD_TASK_PRIORITY, NULL );
+ xTaskCreate( vCommsRxTask, "CMS", configMINIMAL_STACK_SIZE, NULL, mainCOMMS_RX_TASK_PRIORITY, NULL );
+
+ /* Start the scheduler running the tasks and co-routines just created. */
+ vTaskStartScheduler();
+
+ /* Should not get here unless we did not have enough memory to start the
+ scheduler. */
+ for( ;; );
+}
+/*-----------------------------------------------------------*/
+
+static void prvSetupHardware( void )
+{
+ /* Setup the PLL. */
+ SysCtlClockSet( SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ );
+
+ /* Initialise the hardware used to talk to the LCD, LED's and UART. */
+ PDCInit();
+ vParTestInitialise();
+ vSerialInit();
+}
+/*-----------------------------------------------------------*/
+
+void vApplicationIdleHook( void )
+{
+ /* The co-routines are executed in the idle task using the idle task
+ hook. */
+ for( ;; )
+ {
+ /* Schedule the co-routines. */
+ vCoRoutineSchedule();
+
+ /* Run the register check function between each co-routine. */
+ prvSetAndCheckRegisters();
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void prvWriteString( const char *pcString )
+{
+ /* Write pcString to the LED, pausing between each character. */
+ prvPDCWrite(PDC_LCD_CSR, LCD_CLEAR);
+ while( *pcString )
+ {
+ vTaskDelay( mainCHAR_WRITE_DELAY );
+ prvPDCWrite( PDC_LCD_RAM, *pcString );
+ pcString++;
+ }
+}
+/*-----------------------------------------------------------*/
+
+void vLCDTask( void * pvParameters )
+{
+unsigned portBASE_TYPE uxIndex;
+const unsigned char ucCFGData[] = {
+ 0x30, /* Set data bus to 8-bits. */
+ 0x30,
+ 0x30,
+ 0x3C, /* Number of lines/font. */
+ 0x08, /* Display off. */
+ 0x01, /* Display clear. */
+ 0x06, /* Entry mode [cursor dir][shift]. */
+ 0x0C /* Display on [display on][curson on][blinking on]. */
+ };
+
+/* The strings that are written to the LCD. */
+const char *pcStringsToDisplay[] = {
+ "Stellaris",
+ "Demo",
+ "One",
+ "www.FreeRTOS.org",
+ ""
+ };
+
+ /* Configure the LCD. */
+ uxIndex = 0;
+ while( uxIndex < sizeof( ucCFGData ) )
+ {
+ prvPDCWrite( PDC_LCD_CSR, ucCFGData[ uxIndex ] );
+ uxIndex++;
+ vTaskDelay( mainCHAR_WRITE_DELAY );
+ }
+
+ /* Turn the LCD Backlight on. */
+ prvPDCWrite( PDC_CSR, 0x01 );
+
+ /* Clear display. */
+ vTaskDelay( mainCHAR_WRITE_DELAY );
+ prvPDCWrite( PDC_LCD_CSR, LCD_CLEAR );
+
+ uxIndex = 0;
+ for( ;; )
+ {
+ /* Display the string on the LCD. */
+ prvWriteString( pcStringsToDisplay[ uxIndex ] );
+
+ /* Move on to the next string - wrapping if necessary. */
+ uxIndex++;
+ if( *( pcStringsToDisplay[ uxIndex ] ) == 0x00 )
+ {
+ uxIndex = 0;
+ /* Longer pause on the last string to be sent. */
+ vTaskDelay( mainSTRING_WRITE_DELAY * 2 );
+ }
+
+ /* Wait until it is time to move onto the next string. */
+ vTaskDelay( mainSTRING_WRITE_DELAY );
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void vCommsRxTask( void * pvParameters )
+{
+static char cRxedChar, cExpectedChar;
+
+ /* Set the char we expect to receive to the start of the string. */
+ cExpectedChar = mainFIRST_TX_CHAR;
+
+ for( ;; )
+ {
+ /* Wait for a character to be received. */
+ xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, mainCOMMS_RX_DELAY );
+
+ /* Was the character recived (if any) the expected character. */
+ if( cRxedChar != cExpectedChar )
+ {
+ /* Got an unexpected character. This can sometimes occur when
+ reseting the system using the debugger leaving characters already
+ in the UART regsters. */
+ uxErrorStatus = pdFAIL;
+
+ /* Resync by waiting for the end of the current string. */
+ while( cRxedChar != mainLAST_TX_CHAR )
+ {
+ while( !xQueueReceive( xCommsQueue, ( void * ) &cRxedChar, portMAX_DELAY ) );
+ }
+
+ /* The next expected character is the start of the string again. */
+ cExpectedChar = mainFIRST_TX_CHAR;
+ }
+ else
+ {
+ if( cExpectedChar == mainLAST_TX_CHAR )
+ {
+ /* We have reached the end of the string - we now expect to
+ receive the first character in the string again. The LED is
+ toggled to indicate that the entire string was received without
+ error. */
+ vParTestToggleLED( mainCOMMS_RX_LED );
+ cExpectedChar = mainFIRST_TX_CHAR;
+ }
+ else
+ {
+ /* We got the expected character, we now expect to receive the
+ next character in the string. */
+ cExpectedChar++;
+ }
+ }
+ }
+}
+/*-----------------------------------------------------------*/
+
+static void vSerialTxCoRoutine( xCoRoutineHandle xHandle, unsigned portBASE_TYPE uxIndex )
+{
+portTickType xDelayPeriod;
+static unsigned long *pulRandomBytes = mainFIRST_PROGRAM_BYTES;
+
+ /* Co-routine MUST start with a call to crSTART. */
+ crSTART( xHandle );
+
+ for(;;)
+ {
+ /* Was the previously transmitted string received correctly? */
+ if( uxErrorStatus != pdPASS )
+ {
+ /* An error was encountered so set the error LED. */
+ vSetErrorLED();
+ }
+
+ /* The next character to Tx is the first in the string. */
+ cNextChar = mainFIRST_TX_CHAR;
+
+ UARTIntDisable( UART0_BASE, UART_INT_TX );
+ {
+ /* Send the first character. */
+ if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) )
+ {
+ HWREG( UART0_BASE + UART_O_DR ) = cNextChar;
+ }
+
+ /* Move the variable to the char to Tx on so the ISR transmits
+ the next character in the string once this one has completed. */
+ cNextChar++;
+ }
+ UARTIntEnable(UART0_BASE, UART_INT_TX);
+
+ /* Toggle the LED to show a new string is being transmitted. */
+ vParTestToggleLED( mainCOMMS_TX_LED );
+
+ /* Delay before we start the string off again. A pseudo-random delay
+ is used as this will provide a better test. */
+ xDelayPeriod = xTaskGetTickCount() + ( *pulRandomBytes );
+
+ pulRandomBytes++;
+ if( pulRandomBytes > mainTOTAL_PROGRAM_MEMORY )
+ {
+ pulRandomBytes = mainFIRST_PROGRAM_BYTES;
+ }
+
+ /* Make sure we don't wait too long... */
+ xDelayPeriod &= mainMAX_TX_DELAY;
+
+ /* ...but we do want to wait. */
+ if( xDelayPeriod < mainMIN_TX_DELAY )
+ {
+ xDelayPeriod = mainMIN_TX_DELAY;
+ }
+
+ /* Block for the random(ish) time. */
+ crDELAY( xHandle, xDelayPeriod );
+ }
+
+ /* Co-routine MUST end with a call to crEND. */
+ crEND();
+}
+/*-----------------------------------------------------------*/
+
+static void vSerialInit( void )
+{
+ /* Enable the UART. GPIOA has already been initialised. */
+ SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
+
+ /* Set GPIO A0 and A1 as peripheral function. They are used to output the
+ UART signals. */
+ GPIODirModeSet( GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1, GPIO_DIR_MODE_HW );
+
+ /* Configure the UART for 8-N-1 operation. */
+ UARTConfigSet( UART0_BASE, mainBAUD_RATE, UART_CONFIG_WLEN_8 | UART_CONFIG_PAR_NONE | UART_CONFIG_STOP_ONE );
+
+ /* We dont want to use the fifo. This is for test purposes to generate
+ as many interrupts as possible. */
+ HWREG( UART0_BASE + UART_O_LCR_H ) &= ~mainFIFO_SET;
+
+ /* Enable both Rx and Tx interrupts. */
+ HWREG( UART0_BASE + UART_O_IM ) |= ( UART_INT_TX | UART_INT_RX );
+ IntEnable( INT_UART0 );
+}
+/*-----------------------------------------------------------*/
+
+void vUART_ISR(void)
+{
+unsigned long ulStatus;
+char cRxedChar;
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE;
+
+ /* What caused the interrupt. */
+ ulStatus = UARTIntStatus( UART0_BASE, pdTRUE );
+
+ /* Clear the interrupt. */
+ UARTIntClear( UART0_BASE, ulStatus );
+
+ /* Was an Rx interrpt pending? */
+ if( ulStatus & UART_INT_RX )
+ {
+ if( ( HWREG(UART0_BASE + UART_O_FR ) & UART_FR_RXFF ) )
+ {
+ /* Get the char from the buffer and post it onto the queue of
+ Rxed chars. Posting the character should wake the task that is
+ blocked on the queue waiting for characters. */
+ cRxedChar = ( char ) HWREG( UART0_BASE + UART_O_DR );
+ xQueueSendFromISR( xCommsQueue, &cRxedChar, &xHigherPriorityTaskWoken );
+ }
+ }
+
+ /* Was a Tx interrupt pending? */
+ if( ulStatus & UART_INT_TX )
+ {
+ /* Send the next character in the string. We are not using the FIFO. */
+ if( cNextChar <= mainLAST_TX_CHAR )
+ {
+ if( !( HWREG( UART0_BASE + UART_O_FR ) & UART_FR_TXFF ) )
+ {
+ HWREG( UART0_BASE + UART_O_DR ) = cNextChar;
+ }
+ cNextChar++;
+ }
+ }
+
+ /* If a task was woken by the character being received then we force
+ a context switch to occur in case the task is of higher priority than
+ the currently executing task (i.e. the task that this interrupt
+ interrupted.) */
+ portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );
+}
+/*-----------------------------------------------------------*/
+
+static void prvPDCWrite( char cAddress, char cData )
+{
+ vTaskSuspendAll();
+ {
+ PDCWrite( cAddress, cData );
+ }
+ xTaskResumeAll();
+}
+/*-----------------------------------------------------------*/
+
+void vSetErrorLED( void )
+{
+ vParTestSetLED( mainCOMMS_FAIL_LED, pdTRUE );
+}
+/*-----------------------------------------------------------*/
+
+__asm void prvSetAndCheckRegisters( void )
+{
+ extern vSetErrorLED
+
+ /* Fill the general purpose registers with known values. */
+ mov r11, #10
+ add r0, r11, #1
+ add r1, r11, #2
+ add r2, r11, #3
+ add r3, r11, #4
+ add r4, r11, #5
+ add r5, r11, #6
+ add r6, r11, #7
+ add r7, r11, #8
+ add r8, r11, #9
+ add r9, r11, #10
+ add r10, r11, #11
+ add r12, r11, #12
+
+ /* Check the values are as expected. */
+ cmp r11, #10
+ bne set_error_led
+ cmp r0, #11
+ bne set_error_led
+ cmp r1, #12
+ bne set_error_led
+ cmp r2, #13
+ bne set_error_led
+ cmp r3, #14
+ bne set_error_led
+ cmp r4, #15
+ bne set_error_led
+ cmp r5, #16
+ bne set_error_led
+ cmp r6, #17
+ bne set_error_led
+ cmp r7, #18
+ bne set_error_led
+ cmp r8, #19
+ bne set_error_led
+ cmp r9, #20
+ bne set_error_led
+ cmp r10, #21
+ bne set_error_led
+ cmp r12, #22
+ bne set_error_led
+ bx lr
+
+set_error_led;
+ push {r14}
+ ldr r1, =vSetErrorLED
+ blx r1
+ pop {r14}
+ bx lr;
+}
+/*-----------------------------------------------------------*/