]> git.sur5r.net Git - freertos/commitdiff
Add Rowley CrossFire LPC2138 demo files.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 27 Aug 2006 14:12:15 +0000 (14:12 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Sun, 27 Aug 2006 14:12:15 +0000 (14:12 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@29 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Demo/ARM7_LPC2138_Rowley/FreeRTOSConfig.h [new file with mode: 0644]
Demo/ARM7_LPC2138_Rowley/RTOSDemo.hzp [new file with mode: 0644]
Demo/ARM7_LPC2138_Rowley/RTOSDemo.hzs [new file with mode: 0644]
Demo/ARM7_LPC2138_Rowley/main.c [new file with mode: 0644]
Demo/ARM7_LPC2138_Rowley/mainISR.c [new file with mode: 0644]
Demo/ARM7_LPC2138_Rowley/threads.js [new file with mode: 0644]

diff --git a/Demo/ARM7_LPC2138_Rowley/FreeRTOSConfig.h b/Demo/ARM7_LPC2138_Rowley/FreeRTOSConfig.h
new file mode 100644 (file)
index 0000000..fc3b3e0
--- /dev/null
@@ -0,0 +1,88 @@
+/*\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
diff --git a/Demo/ARM7_LPC2138_Rowley/RTOSDemo.hzp b/Demo/ARM7_LPC2138_Rowley/RTOSDemo.hzp
new file mode 100644 (file)
index 0000000..347ec08
--- /dev/null
@@ -0,0 +1,54 @@
+<!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>
diff --git a/Demo/ARM7_LPC2138_Rowley/RTOSDemo.hzs b/Demo/ARM7_LPC2138_Rowley/RTOSDemo.hzs
new file mode 100644 (file)
index 0000000..9b458a7
--- /dev/null
@@ -0,0 +1,84 @@
+<!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>
diff --git a/Demo/ARM7_LPC2138_Rowley/main.c b/Demo/ARM7_LPC2138_Rowley/main.c
new file mode 100644 (file)
index 0000000..eb20551
--- /dev/null
@@ -0,0 +1,330 @@
+/*\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
diff --git a/Demo/ARM7_LPC2138_Rowley/mainISR.c b/Demo/ARM7_LPC2138_Rowley/mainISR.c
new file mode 100644 (file)
index 0000000..8ea6830
--- /dev/null
@@ -0,0 +1,54 @@
+/*\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
diff --git a/Demo/ARM7_LPC2138_Rowley/threads.js b/Demo/ARM7_LPC2138_Rowley/threads.js
new file mode 100644 (file)
index 0000000..819d7c6
--- /dev/null
@@ -0,0 +1,118 @@
+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