--- /dev/null
+/*\r
+ FreeRTOS.org V4.0.5 - Copyright (C) 2003-2006 Richard Barry.\r
+\r
+ This file is part of the FreeRTOS.org distribution.\r
+\r
+ FreeRTOS.org is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ FreeRTOS.org is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with FreeRTOS.org; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+\r
+ A special exception to the GPL can be applied should you wish to distribute\r
+ a combined work that includes FreeRTOS.org, without being obliged to provide\r
+ the source code for any proprietary components. See the licensing section \r
+ of http://www.FreeRTOS.org for full details of how and when the exception\r
+ can be applied.\r
+\r
+ ***************************************************************************\r
+ See http://www.FreeRTOS.org for documentation, latest information, license \r
+ and contact details. Please ensure to read the configuration and relevant \r
+ port sections of the online documentation.\r
+ ***************************************************************************\r
+*/\r
+\r
+#ifndef FREERTOS_CONFIG_H\r
+#define FREERTOS_CONFIG_H\r
+\r
+#include <LPC2138.h>\r
+#define vPortYieldProcessor swi_handler\r
+\r
+/* For compatability with the LPC2106 header. */\r
+#define T0_IR T0IR\r
+#define T0_PR T0PR\r
+#define T0_MR0 T0MR0\r
+#define T0_MCR T0MCR\r
+#define T0_TCR T0TCR\r
+\r
+\r
+/*-----------------------------------------------------------\r
+ * Application specific definitions.\r
+ *\r
+ * These definitions should be adjusted for your particular hardware and\r
+ * application requirements.\r
+ *\r
+ * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE\r
+ * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. \r
+ *----------------------------------------------------------*/\r
+\r
+#define configUSE_PREEMPTION 1\r
+#define configUSE_IDLE_HOOK 0\r
+#define configUSE_TICK_HOOK 0\r
+/* In this case configCPU_CLOCK_HZ is actually set to the pclk frequency, not\r
+the CPU frequency. */\r
+#define configCPU_CLOCK_HZ ( 58982400UL ) /* =14.7456MHz xtal multiplied by 4 using the PLL. */\r
+#define configTICK_RATE_HZ ( ( portTickType ) 1000 )\r
+#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 6 )\r
+#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 128 )\r
+#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 18 * 1024 ) )\r
+#define configMAX_TASK_NAME_LEN ( 15 )\r
+#define configUSE_TRACE_FACILITY 1\r
+#define configUSE_16_BIT_TICKS 0\r
+#define configIDLE_SHOULD_YIELD 1\r
+\r
+/* Co-routine definitions. */\r
+#define configUSE_CO_ROUTINES 0\r
+#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )\r
+\r
+/* Set the following definitions to 1 to include the API function, or zero\r
+to exclude the API function. */\r
+\r
+#define INCLUDE_vTaskPrioritySet 1\r
+#define INCLUDE_uxTaskPriorityGet 1\r
+#define INCLUDE_vTaskDelete 1\r
+#define INCLUDE_vTaskCleanUpResources 0\r
+#define INCLUDE_vTaskSuspend 1\r
+#define INCLUDE_vTaskDelayUntil 1\r
+#define INCLUDE_vTaskDelay 1\r
+\r
+\r
+#endif /* FREERTOS_CONFIG_H */\r
--- /dev/null
+<!DOCTYPE CrossStudio_Project_File>
+<solution version="1" Name="RTOSDemo" >
+ <project Name="RTOSDemo" >
+ <configuration arm_target_loader_parameter="14745600" Target="LPC2138" arm_simulator_memory_simulation_parameter="LPC21;0x80000;0x10000" property_groups_file_path="$(StudioDir)/targets/Philips_LPC210X/propertyGroups.xml" oscillator_frequency="14.7456MHz" linker_memory_map_file="$(StudioDir)/targets/Philips_LPC210X/Philips_LPC2138_MemoryMap.xml" gcc_entry_point="reset_handler" arm_architecture="v4T" linker_additional_files="$(StudioDir)/lib/liblpc2000$(LibExt)$(LIB)" project_directory="" link_include_startup_code="No" project_type="Executable" Name="Common" arm_target_debug_interface_type="ARM7TDI" arm_core_type="ARM7TDMI-S" arm_simulator_memory_simulation_filename="$(StudioDir)/targets/Philips_LPC210X/LPC2000SimulatorMemory.dll" />
+ <configuration linker_section_placement_file="$(StudioDir)/targets/sram_placement.xml" target_reset_script="SRAMReset()" Name="RAM" Placement="RAM" />
+ <configuration arm_target_flash_loader_file_path="$(StudioDir)/targets/Philips_LPC210X/Release/Loader.elf" linker_section_placement_file="$(StudioDir)/targets/flash_placement.xml" target_reset_script="FLASHReset()" arm_target_flash_loader_type="Comms Channel Loader" Name="Flash" Placement="Flash" />
+ <folder Name="Source Files" >
+ <configuration filter="c;cpp;cxx;cc;h;s;asm;inc" Name="Common" />
+ <folder Name="RTOS Source" >
+ <file file_name="../../Source/tasks.c" Name="tasks.c" >
+ <configuration build_exclude_from_build="No" Name="THUMB Flash Debug" />
+ </file>
+ <file file_name="../../Source/list.c" Name="list.c" />
+ <file file_name="../../Source/queue.c" Name="queue.c" />
+ <file file_name="../../Source/portable/MemMang/heap_1.c" Name="heap_1.c" />
+ <file file_name="../../Source/portable/GCC/ARM7_LPC2000/portISR.c" Name="portISR.c" >
+ <configuration arm_instruction_set="ARM" Name="THUMB" />
+ </file>
+ <file file_name="../../Source/portable/GCC/ARM7_LPC2000/port.c" Name="port.c" />
+ </folder>
+ <folder Name="Demo Source" >
+ <file file_name="main.c" Name="main.c" />
+ <file file_name="../Common/Minimal/PollQ.c" Name="PollQ.c" />
+ <file file_name="../Common/Minimal/BlockQ.c" Name="BlockQ.c" />
+ <file file_name="../Common/Minimal/death.c" Name="death.c" />
+ <file file_name="../Common/Minimal/dynamic.c" Name="dynamic.c" />
+ <file file_name="../Common/Minimal/integer.c" Name="integer.c" />
+ <file file_name="../Common/Minimal/semtest.c" Name="semtest.c" />
+ <file file_name="mainISR.c" Name="mainISR.c" >
+ <configuration arm_instruction_set="ARM" Name="THUMB" />
+ </file>
+ <file file_name="../Common/Minimal/blocktim.c" Name="blocktim.c" />
+ </folder>
+ </folder>
+ <folder Name="System Files" >
+ <file file_name="$(StudioDir)/source/crt0.s" Name="crt0.s" />
+ <file file_name="$(StudioDir)/targets/Philips_LPC210X/Philips_LPC210X_Startup.s" Name="Philips_LPC210X_Startup.s" />
+ <file file_name="$(StudioDir)/targets/Philips_LPC210X/Philips_LPC210X_Target.js" Name="Philips_LPC210X_Target.js" >
+ <configuration Name="Common" file_type="Reset Script" />
+ </file>
+ </folder>
+ <file file_name="threads.js" Name="threads.js" />
+ </project>
+ <configuration inherited_configurations="ARM;Flash;Debug" Name="ARM Flash Debug" />
+ <configuration arm_library_instruction_set="ARM" c_preprocessor_definitions="__ARM" arm_instruction_set="ARM" hidden="Yes" Name="ARM" />
+ <configuration c_preprocessor_definitions="__FLASH_BUILD" hidden="Yes" Name="Flash" />
+ <configuration c_preprocessor_definitions="DEBUG" link_include_startup_code="No" gcc_optimization_level="None" build_debug_information="Yes" hidden="Yes" Name="Debug" />
+ <configuration inherited_configurations="ARM;Flash;Release" Name="ARM Flash Release" />
+ <configuration c_preprocessor_definitions="NDEBUG" link_include_startup_code="No" gcc_optimization_level="Level 1" build_debug_information="No" hidden="Yes" Name="Release" />
+ <configuration inherited_configurations="THUMB;Flash;Debug" Name="THUMB Flash Debug" />
+ <configuration arm_library_instruction_set="THUMB" c_preprocessor_definitions="__THUMB;THUMB_INTERWORK" arm_instruction_set="THUMB" hidden="Yes" Name="THUMB" />
+ <configuration inherited_configurations="THUMB;Flash;Release" Name="THUMB Flash Release" />
+ <configuration c_preprocessor_definitions="GCC_ARM7;SUPERVISOR_START;VECTORED_IRQ_INTERRUPTS" c_user_include_directories=".;..\\..\\Source\\include;..\\..\\Source\\GCC\\ARM7_LPC2000;..\\Common\\Include" Name="Common" c_system_include_directories="$(StudioDir)/include;$(StudioDir)/include/targets" />
+</solution>
--- /dev/null
+<!DOCTYPE CrossStudio_for_ARM_Session_File>
+<session>
+ <Autos>
+ <Watches active="0" />
+ </Autos>
+ <Bookmarks/>
+ <Breakpoints>
+ <BreakpointListItem actiontype="0" chainFrom="" line="144" length="0" triggertype="0" useHWbreakpoint="false" group="Breakpoints" breakdatatype="0" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="" filename="C:\E\Dev\_FreeRTOS\Demo\ARM7_LPC2138_Rowley\main.c" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="D_Abort" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="FIQ" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="IRQ" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="P_Abort" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="Reset" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="SWI" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="ARM Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="Undef" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="BusFault" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="ExceptionEntryReturnFault" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="HardFault" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="MemManage" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="3" mask="0" comparison="0" expression="Reset" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="UsageFault_CheckingError" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="UsageFault_Coprocessor" filename="" />
+ <BreakpointListItem actiontype="0" chainFrom="" line="-1" length="0" triggertype="0" useHWbreakpoint="false" group="Cortex-M3 Exceptions" breakdatatype="5" value="0" name="unnamed" counter="0" state="2" mask="0" comparison="0" expression="UsageFault_StateError" filename="" />
+ </Breakpoints>
+ <ExecutionCountWindow/>
+ <Memory1>
+ <MemoryWindow autoEvaluate="0" addressText="0x102248" numColumns="8" sizeText="128" dataSize="1" radix="16" addressSpace="" />
+ </Memory1>
+ <Memory2>
+ <MemoryWindow autoEvaluate="0" addressText="" numColumns="8" sizeText="" dataSize="1" radix="16" addressSpace="" />
+ </Memory2>
+ <Memory3>
+ <MemoryWindow autoEvaluate="0" addressText="" numColumns="8" sizeText="" dataSize="1" radix="16" addressSpace="" />
+ </Memory3>
+ <Memory4>
+ <MemoryWindow autoEvaluate="0" addressText="" numColumns="8" sizeText="" dataSize="1" radix="16" addressSpace="" />
+ </Memory4>
+ <Project>
+ <ProjectSessionItem path="RTOSDemo" name="unnamed" />
+ <ProjectSessionItem path="RTOSDemo;RTOSDemo" name="unnamed" />
+ <ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files" name="unnamed" />
+ <ProjectSessionItem path="RTOSDemo;RTOSDemo;Source Files;RTOS Source" name="unnamed" />
+ </Project>
+ <Register1>
+ <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="CPU - Current Mode" visibleGroups="CPU - Current Mode" decimalDisplays="" binaryDisplays="" />
+ </Register1>
+ <Register2>
+ <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
+ </Register2>
+ <Register3>
+ <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
+ </Register3>
+ <Register4>
+ <RegisterWindow unsignedDisplays="" asciiDisplays="" octalDisplays="" openGroups="" visibleGroups="" decimalDisplays="" binaryDisplays="" />
+ </Register4>
+ <SourceNavigatorWindow/>
+ <TraceWindow>
+ <Trace wrap="Yes" type="1" enabled="Yes" />
+ </TraceWindow>
+ <Watch1>
+ <Watches active="1" >
+ <Watchpoint evalMode="1" linenumber="0" evalType="1" radix="-1" name="pxCurrentTCB" expression="pxCurrentTCB" filename="" />
+ </Watches>
+ </Watch1>
+ <Watch2>
+ <Watches active="0" />
+ </Watch2>
+ <Watch3>
+ <Watches active="0" />
+ </Watch3>
+ <Watch4>
+ <Watches active="0" />
+ </Watch4>
+ <Files>
+ <SessionOpenFile useTextEdit="1" useBinaryEdit="0" x="19" debugPath="C:\Devtools\Rowley Associates Limited\CrossWorks for ARM 1.6\source\crt0.s" y="27" useHTMLEdit="0" path="C:\Devtools\Rowley Associates Limited\CrossWorks for ARM 1.6\source\crt0.s" left="0" selected="0" name="unnamed" top="60" />
+ <SessionOpenFile useTextEdit="1" useBinaryEdit="0" x="0" debugPath="C:\Devtools\Rowley Associates Limited\CrossWorks for ARM 1.6\targets\Philips_LPC210X\Philips_LPC210X_Startup.s" y="142" useHTMLEdit="0" path="C:\Devtools\Rowley Associates Limited\CrossWorks for ARM 1.6\targets\Philips_LPC210X\Philips_LPC210X_Startup.s" left="0" selected="0" name="unnamed" top="120" />
+ <SessionOpenFile useTextEdit="1" useBinaryEdit="0" x="0" debugPath="C:\E\Dev\FreeRTOS\Source\portable\GCC\ARM7_LPC2000\port.c" y="0" useHTMLEdit="0" path="C:\E\Dev\FreeRTOS\Source\portable\GCC\ARM7_LPC2000\port.c" left="0" selected="0" name="unnamed" top="0" />
+ <SessionOpenFile useTextEdit="1" useBinaryEdit="0" x="22" debugPath="C:\E\Dev\FreeRTOS\\Source\portable\GCC\ARM7_LPC2000\portmacro.h" y="223" useHTMLEdit="0" path="C:\E\Dev\FreeRTOS\\Source\portable\GCC\ARM7_LPC2000\portmacro.h" left="0" selected="0" name="unnamed" top="0" />
+ <SessionOpenFile useTextEdit="1" useBinaryEdit="0" x="57" debugPath="C:\E\Dev\FreeRTOS\Source\list.c" y="93" useHTMLEdit="0" path="C:\E\Dev\FreeRTOS\Source\list.c" left="0" selected="0" name="unnamed" top="72" />
+ <SessionOpenFile useTextEdit="1" useBinaryEdit="0" x="0" debugPath="C:\E\Dev\FreeRTOS\\Source\\include\list.h" y="0" useHTMLEdit="0" path="C:\E\Dev\FreeRTOS\\Source\\include\list.h" left="0" selected="0" name="unnamed" top="65" />
+ <SessionOpenFile useTextEdit="1" useBinaryEdit="0" x="0" debugPath="C:\E\Dev\FreeRTOS\Source\tasks.c" y="0" useHTMLEdit="0" path="C:\E\Dev\FreeRTOS\Source\tasks.c" left="0" selected="1" name="unnamed" top="156" />
+ </Files>
+ <ARMCrossStudioWindow activeProject="RTOSDemo" autoConnectTarget="/USB CrossConnect for ARM" debugSearchFileMap="" fileDialogInitialDirectory="C:\E\Dev\FreeRTOS\Demo\ARM7_LPC2138_Rowley" fileDialogDefaultFilter="*.js" autoConnectCapabilities="1407" debugSearchPath="" buildConfiguration="THUMB Flash Debug" />
+</session>
--- /dev/null
+/*\r
+ FreeRTOS.org V4.0.5 - Copyright (C) 2003-2006 Richard Barry.\r
+\r
+ This file is part of the FreeRTOS.org distribution.\r
+\r
+ FreeRTOS.org is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ FreeRTOS.org is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with FreeRTOS.org; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+\r
+ A special exception to the GPL can be applied should you wish to distribute\r
+ a combined work that includes FreeRTOS.org, without being obliged to provide\r
+ the source code for any proprietary components. See the licensing section \r
+ of http://www.FreeRTOS.org for full details of how and when the exception\r
+ can be applied.\r
+\r
+ ***************************************************************************\r
+ See http://www.FreeRTOS.org for documentation, latest information, license \r
+ and contact details. Please ensure to read the configuration and relevant \r
+ port sections of the online documentation.\r
+ ***************************************************************************\r
+*/\r
+\r
+/*\r
+ * This file contains a demo created to execute on the Rowley Associates\r
+ * LPC2138 CrossFire development board.\r
+ *\r
+ * main() creates all the demo application tasks, then starts the scheduler. \r
+ * The WEB documentation provides more details of the standard demo application \r
+ * tasks.\r
+ * \r
+ * Main.c also creates a task called "Check". This only executes every few \r
+ * seconds but has a high priority so is guaranteed to get processor time. \r
+ * Its function is to check that all the other tasks are still operational.\r
+ * Each standard demo task maintains a unique count that is incremented each \r
+ * time the task successfully completes its function. Should any error occur \r
+ * within such a task the count is permanently halted. The check task inspects \r
+ * the count of each task to ensure it has changed since the last time the \r
+ * check task executed. If all the count variables have changed all the tasks \r
+ * are still executing error free, and the check task writes "PASS" to the\r
+ * CrossStudio terminal IO window. Should any task contain an error at any time \r
+ * the error is latched and "FAIL" written to the terminal IO window.\r
+ *\r
+ * Finally, main() sets up an interrupt service routine and task to handle\r
+ * pushes of the button that is built into the CrossFire board. When the button\r
+ * is pushed the ISR wakes the button task - which generates a table of task\r
+ * status information which is also displayed on the terminal IO window. \r
+ *\r
+ * A print task is defined to ensure exclusive and consistent access to the \r
+ * terminal IO. This is the only task that is allowed to access the terminal.\r
+ * The check and button task therefore do not access the terminal directly but \r
+ * instead pass a pointer to the message they wish to display to the print task.\r
+ */\r
+\r
+/* Standard includes. */\r
+#include <__cross_studio_io.h>\r
+\r
+/* Scheduler includes. */\r
+#include "FreeRTOS.h"\r
+#include "Task.h"\r
+#include "queue.h"\r
+#include "semphr.h"\r
+\r
+/* Demo app includes. */\r
+#include "BlockQ.h"\r
+#include "death.h"\r
+#include "dynamic.h"\r
+#include "integer.h"\r
+#include "PollQ.h"\r
+#include "blocktim.h"\r
+\r
+/* Hardware configuration definitions. */\r
+#define mainBUS_CLK_FULL ( ( unsigned portCHAR ) 0x01 )\r
+#define mainLED_BIT 0x80000000\r
+#define mainP0_14__EINT_1 ( 2 << 28 )\r
+#define mainEINT_1_EDGE_SENSITIVE 2\r
+#define mainEINT_1_FALLING_EDGE_SENSITIVE 0\r
+#define mainEINT_1_CHANNEL 15\r
+#define mainEINT_1_VIC_CHANNEL_BIT ( 1 << mainEINT_1_CHANNEL )\r
+#define mainEINT_1_ENABLE_BIT ( 1 << 5 )\r
+\r
+/* Demo application definitions. */\r
+#define mainQUEUE_SIZE ( 3 )\r
+#define mainLED_DELAY ( ( portTickType ) 500 / portTICK_RATE_MS )\r
+#define mainCHECK_DELAY ( ( portTickType ) 5000 / portTICK_RATE_MS )\r
+#define mainLIST_BUFFER_SIZE 2048\r
+\r
+/* Task priorities. */\r
+#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 2 )\r
+#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )\r
+#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )\r
+#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )\r
+#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )\r
+#define mainPRINT_TASK_PRIORITY ( tskIDLE_PRIORITY + 0 )\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/* The semaphore used to wake the button task from within the external interrupt\r
+handler. */\r
+xSemaphoreHandle xButtonSemaphore;\r
+\r
+/* The queue that is used to send message to vPrintTask for display in the \r
+terminal output window. */\r
+xQueueHandle xPrintQueue;\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/*\r
+ * Simply flashes the on board LED every mainLED_DELAY milliseconds.\r
+ */\r
+static void vLEDTask( void *pvParameters );\r
+\r
+/*\r
+ * Checks the status of all the demo tasks then prints a message to the\r
+ * CrossStudio terminal IO windows. The message will be either PASS or FAIL\r
+ * depending on the status of the demo applications tasks. A FAIL status will\r
+ * be latched.\r
+ *\r
+ * Messages are not written directly to the terminal, but passed to vPrintTask\r
+ * via a queue.\r
+ */\r
+static void vCheckTask( void *pvParameters );\r
+\r
+/*\r
+ * Controls all terminal output. If a task wants to send a message to the\r
+ * terminal IO it posts a pointer to the text to vPrintTask via a queue. This\r
+ * ensures serial access to the terminal IO.\r
+ */\r
+static void vPrintTask( void *pvParameter );\r
+\r
+/*\r
+ * Simply waits for an interrupt to be generated from the built in button, then\r
+ * generates a table of tasks states that is then written by vPrintTask to the\r
+ * terminal output window within CrossStudio.\r
+ */\r
+static void vButtonHandlerTask( void *pvParameters );\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+int main( void )\r
+{\r
+ /* Setup the peripheral bus to be the same as the PLL output. */\r
+ VPBDIV = mainBUS_CLK_FULL;\r
+\r
+ /* Create the queue used to pass message to vPrintTask. */\r
+ xPrintQueue = xQueueCreate( mainQUEUE_SIZE, sizeof( portCHAR * ) );\r
+\r
+ /* Create the semaphore used to wake vButtonHandlerTask(). */\r
+ vSemaphoreCreateBinary( xButtonSemaphore );\r
+ xSemaphoreTake( xButtonSemaphore, 0 );\r
+\r
+ /* Start the standard demo tasks. */\r
+ vStartIntegerMathTasks( tskIDLE_PRIORITY );\r
+ vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );\r
+ vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );\r
+ vStartDynamicPriorityTasks();\r
+ vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );\r
+ vCreateBlockTimeTasks();\r
+\r
+ /* Start the tasks defined within this file. */\r
+ xTaskCreate( vLEDTask, "LED", configMINIMAL_STACK_SIZE, NULL, mainLED_TASK_PRIORITY, NULL );\r
+ xTaskCreate( vCheckTask, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );\r
+ xTaskCreate( vPrintTask, "Print", configMINIMAL_STACK_SIZE, NULL, mainPRINT_TASK_PRIORITY, NULL );\r
+ xTaskCreate( vButtonHandlerTask, "Button", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );\r
+\r
+ /* Start the scheduler. */\r
+ vTaskStartScheduler();\r
+\r
+ /* The scheduler should now running, so we will only ever reach here if we\r
+ ran out of heap space. */\r
+\r
+ return 0;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void vLEDTask( void *pvParameters )\r
+{\r
+ /* Configure IO. */\r
+ IO0DIR |= mainLED_BIT;\r
+ IO0SET = mainLED_BIT;\r
+\r
+ for( ;; )\r
+ {\r
+ /* Not very exiting - just delay... */\r
+ vTaskDelay( mainLED_DELAY );\r
+\r
+ /* ...set the IO ... */\r
+ IO0CLR = mainLED_BIT;\r
+\r
+ /* ...delay again... */\r
+ vTaskDelay( mainLED_DELAY );\r
+\r
+ /* ...then clear the IO. */\r
+ IO0SET = mainLED_BIT;\r
+ }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void vCheckTask( void *pvParameters )\r
+{\r
+portBASE_TYPE xErrorOccurred = pdFALSE;\r
+portTickType xLastExecutionTime;\r
+const portCHAR * const pcPassMessage = "PASS\n";\r
+const portCHAR * const pcFailMessage = "FAIL\n";\r
+\r
+ /* Initialise xLastExecutionTime so the first call to vTaskDelayUntil()\r
+ works correctly. */\r
+ xLastExecutionTime = xTaskGetTickCount();\r
+\r
+ for( ;; )\r
+ {\r
+ /* Perform this check every mainCHECK_DELAY milliseconds. */\r
+ vTaskDelayUntil( &xLastExecutionTime, mainCHECK_DELAY );\r
+\r
+ /* Has an error been found in any task? */\r
+\r
+ if( xAreIntegerMathsTaskStillRunning() != pdTRUE )\r
+ {\r
+ xErrorOccurred = pdTRUE;\r
+ }\r
+ \r
+ if( xArePollingQueuesStillRunning() != pdTRUE )\r
+ {\r
+ xErrorOccurred = pdTRUE;\r
+ }\r
+ \r
+ if( xAreSemaphoreTasksStillRunning() != pdTRUE )\r
+ {\r
+ xErrorOccurred = pdTRUE;\r
+ }\r
+ \r
+ if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )\r
+ {\r
+ xErrorOccurred = pdTRUE;\r
+ }\r
+ \r
+ if( xAreBlockingQueuesStillRunning() != pdTRUE )\r
+ {\r
+ xErrorOccurred = pdTRUE;\r
+ }\r
+\r
+ if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )\r
+ {\r
+ xErrorOccurred = pdTRUE;\r
+ }\r
+\r
+ /* Send either a pass or fail message. If an error is found it is\r
+ never cleared again. */\r
+ if( xErrorOccurred == pdTRUE )\r
+ {\r
+ xQueueSend( xPrintQueue, &pcFailMessage, portMAX_DELAY );\r
+ }\r
+ else\r
+ {\r
+ xQueueSend( xPrintQueue, &pcPassMessage, portMAX_DELAY );\r
+ }\r
+ }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void vPrintTask( void *pvParameters )\r
+{\r
+portCHAR *pcMessage;\r
+\r
+ for( ;; )\r
+ {\r
+ /* Wait for a message to arrive. */\r
+ while( xQueueReceive( xPrintQueue, &pcMessage, portMAX_DELAY ) != pdPASS );\r
+\r
+ /* Write the message to the terminal IO. */\r
+ debug_printf( "%s", pcMessage );\r
+ }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+static void vButtonHandlerTask( void *pvParameters )\r
+{\r
+static portCHAR cListBuffer[ mainLIST_BUFFER_SIZE ];\r
+const portCHAR *pcList = &( cListBuffer[ 0 ] );\r
+const portCHAR * const pcHeader = "\nTask State Priority Stack #\n************************************************";\r
+extern void (vButtonISR) ( void );\r
+\r
+ /* Configure the interrupt. */\r
+ portENTER_CRITICAL(); \r
+ {\r
+ /* Configure P0.14 to generate interrupts. */\r
+ PINSEL0 |= mainP0_14__EINT_1; \r
+ EXTMODE = mainEINT_1_EDGE_SENSITIVE;\r
+ EXTPOLAR = mainEINT_1_FALLING_EDGE_SENSITIVE;\r
+\r
+ /* Setup the VIC for EINT 1. */\r
+ VICIntSelect &= ~mainEINT_1_VIC_CHANNEL_BIT;\r
+ VICIntEnable |= mainEINT_1_VIC_CHANNEL_BIT;\r
+ VICVectAddr1 = ( portLONG ) vButtonISR;\r
+ VICVectCntl1 = mainEINT_1_ENABLE_BIT | mainEINT_1_CHANNEL;\r
+ }\r
+ portEXIT_CRITICAL();\r
+\r
+ for( ;; )\r
+ {\r
+ /* Wait for an interrupt. */\r
+ while( xSemaphoreTake( xButtonSemaphore, portMAX_DELAY ) != pdPASS );\r
+\r
+ /* Send the column headers to the print task for display. */\r
+ xQueueSend( xPrintQueue, &pcHeader, portMAX_DELAY );\r
+\r
+ /* Create the list of task states. */\r
+ vTaskList( cListBuffer );\r
+\r
+ /* Send the task status information to the print task for display. */\r
+ xQueueSend( xPrintQueue, &pcList, portMAX_DELAY );\r
+ }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
--- /dev/null
+/*\r
+ FreeRTOS.org V4.0.5 - Copyright (C) 2003-2006 Richard Barry.\r
+\r
+ This file is part of the FreeRTOS.org distribution.\r
+\r
+ FreeRTOS.org is free software; you can redistribute it and/or modify\r
+ it under the terms of the GNU General Public License as published by\r
+ the Free Software Foundation; either version 2 of the License, or\r
+ (at your option) any later version.\r
+\r
+ FreeRTOS.org is distributed in the hope that it will be useful,\r
+ but WITHOUT ANY WARRANTY; without even the implied warranty of\r
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
+ GNU General Public License for more details.\r
+\r
+ You should have received a copy of the GNU General Public License\r
+ along with FreeRTOS.org; if not, write to the Free Software\r
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA\r
+\r
+ A special exception to the GPL can be applied should you wish to distribute\r
+ a combined work that includes FreeRTOS.org, without being obliged to provide\r
+ the source code for any proprietary components. See the licensing section \r
+ of http://www.FreeRTOS.org for full details of how and when the exception\r
+ can be applied.\r
+\r
+ ***************************************************************************\r
+ See http://www.FreeRTOS.org for documentation, latest information, license \r
+ and contact details. Please ensure to read the configuration and relevant \r
+ port sections of the online documentation.\r
+ ***************************************************************************\r
+*/\r
+#include "FreeRTOS.h"\r
+#include "semphr.h"\r
+\r
+#define isrCLEAR_EINT_1 2\r
+\r
+/*\r
+ * Interrupt routine that simply wakes vButtonHandlerTask on each interrupt \r
+ * generated by a push of the built in button.\r
+ */\r
+void vButtonISR( void ) __attribute__ ((naked));\r
+extern xSemaphoreHandle xButtonSemaphore;\r
+\r
+void vButtonISR( void )\r
+{\r
+ portENTER_SWITCHING_ISR();\r
+ xSemaphoreGiveFromISR( xButtonSemaphore, pdFALSE );\r
+ EXTINT = isrCLEAR_EINT_1;\r
+ VICVectAddr = 0;\r
+ portEXIT_SWITCHING_ISR( pdTRUE );\r
+}\r
+\r
+\r
+\r
--- /dev/null
+function decode_stack(sp)\r
+{\r
+ var i;\r
+ var a = new Array();\r
+\r
+ var current_task;\r
+\r
+ current_task = Debug.evaluate("pxCurrentTCB");\r
+\r
+ if( current_task == 0 )\r
+ return;\r
+\r
+ sp += 4; /* skip stored ulCriticalNesting */\r
+ a[16] = Debug.evaluate("*(unsigned long*)" + sp); \r
+\r
+ for (i = 0; i <= 15; i++)\r
+ {\r
+ sp += 4;\r
+ a[i] = Debug.evaluate("*(unsigned long*)" + sp); \r
+ }\r
+\r
+ return a;\r
+}\r
+\r
+function add_task(task, state)\r
+{\r
+ var tcb, task_name;\r
+\r
+ var current_task;\r
+\r
+ current_task = Debug.evaluate("pxCurrentTCB");\r
+\r
+ if( current_task == 0 )\r
+ return;\r
+\r
+ tcb = Debug.evaluate("*(tskTCB *)" + task);\r
+ task_name = Debug.evaluate("(char*)&(*(tskTCB *)" + task + ").pcTaskName[0]");\r
+ Threads.add("#" + tcb.uxTCBNumber + " \"" + task_name + "\"", tcb.uxPriority, state, decode_stack(tcb.pxTopOfStack));\r
+}\r
+\r
+function add_list(list, state, current_task)\r
+{\r
+ var i, index, item, end;\r
+ var current_task;\r
+\r
+ current_task = Debug.evaluate("pxCurrentTCB");\r
+\r
+ if( current_task == 0 )\r
+ return;\r
+\r
+ if (list.uxNumberOfItems)\r
+ {\r
+ index = list.pxIndex;\r
+ end = list.xListEnd;\r
+ for (i = 0; i < list.uxNumberOfItems + 1; i++)\r
+ {\r
+ item = Debug.evaluate("*(xListItem *)" + index);\r
+ if (index != end)\r
+ {\r
+ task = item.pvOwner;\r
+ if (task) add_task(task, (task == current_task) ? "executing" : state);\r
+ }\r
+ index = item.pxNext;\r
+ }\r
+ }\r
+}\r
+\r
+function update() \r
+{\r
+ var i, current_task, list, lists, max_priority;\r
+\r
+ Threads.clear();\r
+\r
+ current_task = Debug.evaluate("pxCurrentTCB");\r
+\r
+ if( current_task == 0 )\r
+ return;\r
+\r
+ Threads.newqueue("Ready");\r
+ lists = Debug.evaluate("pxReadyTasksLists");\r
+ if (lists)\r
+ { \r
+ max_priority = Debug.evaluate("uxTopUsedPriority");\r
+ max_priority = Debug.evaluate("*(long *)" + max_priority);\r
+\r
+ for (i = 0; i <= max_priority; i++)\r
+ {\r
+ list = Debug.evaluate("((xList*)" + lists + ")[" + (max_priority - i) + "]");\r
+ add_list(list, "ready", current_task);\r
+ }\r
+ }\r
+\r
+ Threads.newqueue("Blocked");\r
+\r
+ list = Debug.evaluate("pxDelayedTaskList");\r
+ if (list)\r
+ {\r
+ list = Debug.evaluate("**(xList **)" + list);\r
+ add_list(list, "blocked");\r
+ }\r
+\r
+ list = Debug.evaluate("pxOverflowDelayedTaskList");\r
+ if (list)\r
+ {\r
+ list = Debug.evaluate("**(xList **)" + list);\r
+ add_list(list, "blocked");\r
+ }\r
+\r
+ Threads.newqueue("Suspended");\r
+\r
+ list = Debug.evaluate("xSuspendedTaskList");\r
+ if (list)\r
+ {\r
+ list = Debug.evaluate("*(xList *)" + list);\r
+ add_list(list, "suspended");\r
+ }\r
+}\r
+\r