diff --git a/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources b/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources
index fb75059b9..be6f8a5d5 100644
Binary files a/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources and b/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.core.resources/.safetable/org.eclipse.core.resources differ
diff --git a/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs b/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs
index b301eb8b2..1cfed308d 100644
--- a/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs
+++ b/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.core.runtime/.settings/org.eclipse.cdt.managedbuilder.core.prefs
@@ -1,3 +1,3 @@
-#Sun Nov 16 19:17:14 GMT 2008
+#Sun Nov 16 20:38:31 GMT 2008
eclipse.preferences.version=1
-properties/RTOSDemo.null.38326818/0.1348192838=\#\r\n\#Sun Nov 16 19\:17\:14 GMT 2008\r\norg.eclipse.cdt.build.core.settings.holder.1053974197\=\\\#\\r\\n\\\#Sun Nov 16 19\\\:17\\\:14 GMT 2008\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.settings.holder.804763436\=\\\#\\r\\n\\\#Sun Nov 16 19\\\:17\\\:14 GMT 2008\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.settings.holder.libs.1997217404\=\\\#\\r\\n\\\#Sun Nov 16 19\\\:17\\\:14 GMT 2008\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.settings.holder.99587291\=\\\#\\r\\n\\\#Sun Nov 16 19\\\:17\\\:14 GMT 2008\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.prefbase.toolchain.1423010524\=\\\#\\r\\n\\\#Sun Nov 16 19\\\:17\\\:14 GMT 2008\\r\\nrebuildState\\\=false\\r\\n\r\n0.1348192838\=\\\#\\r\\n\\\#Sun Nov 16 19\\\:17\\\:14 GMT 2008\\r\\nrcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\n
+properties/RTOSDemo.null.38326818/0.1348192838=\#\r\n\#Sun Nov 16 20\:38\:31 GMT 2008\r\norg.eclipse.cdt.build.core.settings.holder.1053974197\=\\\#\\r\\n\\\#Sun Nov 16 20\\\:38\\\:31 GMT 2008\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.settings.holder.804763436\=\\\#\\r\\n\\\#Sun Nov 16 20\\\:38\\\:31 GMT 2008\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.settings.holder.libs.1997217404\=\\\#\\r\\n\\\#Sun Nov 16 20\\\:38\\\:31 GMT 2008\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.settings.holder.99587291\=\\\#\\r\\n\\\#Sun Nov 16 20\\\:38\\\:31 GMT 2008\\r\\nrebuildState\\\=false\\r\\n\r\norg.eclipse.cdt.build.core.prefbase.toolchain.1423010524\=\\\#\\r\\n\\\#Sun Nov 16 20\\\:38\\\:31 GMT 2008\\r\\nrebuildState\\\=false\\r\\n\r\n0.1348192838\=\\\#\\r\\n\\\#Sun Nov 16 20\\\:38\\\:31 GMT 2008\\r\\nrcState\\\=0\\r\\nrebuildState\\\=false\\r\\n\r\n
diff --git a/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/RTOSDemo.launch b/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/RTOSDemo.launch
index 3381d666e..de18a664a 100644
--- a/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/RTOSDemo.launch
+++ b/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.debug.core/.launches/RTOSDemo.launch
@@ -13,7 +13,7 @@
-
+
diff --git a/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml b/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml
index f1c49cd01..f68cbad37 100644
--- a/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml
+++ b/Demo/ColdFire_MCF52233_Eclipse/.metadata/.plugins/org.eclipse.ui.workbench/workingsets.xml
@@ -1,69 +1,68 @@
-
-
-
-
-
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
-
-
-
-
-
+
+
-
+
+
+
+
+
+
-
-
-
-
-
-
-
+
+
-
+
+
+
-
-
-
-
-
-
-
-
+
+
-
-
-
-
-
-
-
+
+
+
-
-
+
+
+
+
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/FreeRTOSConfig.h b/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/FreeRTOSConfig.h
index a3e04a9f2..38b08fe00 100644
--- a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/FreeRTOSConfig.h
+++ b/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/FreeRTOSConfig.h
@@ -97,13 +97,20 @@ to exclude the API function. */
#define INCLUDE_vTaskDelay 1
#define INCLUDE_uxTaskGetStackHighWaterMark 1
+/* Port specific definitions. */
#define configYIELD_INTERRUPT_VECTOR 16UL
#define configKERNEL_INTERRUPT_PRIORITY 1
#define configMAX_SYSCALL_INTERRUPT_PRIORITY 4
+/* The function that initialises the tick and context switch interrupts. This
+function is part of the application side (rather than kernel) to allow users to
+change the peripherals and vectors being used should they conflict in any way
+with the application itself. */
void vApplicationSetupInterrupts( void );
-/* Ethernet configuration. */
+/* Ethernet configuration. **************************/
+
+/* Defines the MAC address to be used. */
#define configMAC_0 0x00
#define configMAC_1 0x04
#define configMAC_2 0x9F
@@ -111,27 +118,29 @@ void vApplicationSetupInterrupts( void );
#define configMAC_4 0xAB
#define configMAC_5 0x2B
+/* Defines the IP address to be used. */
#define configIP_ADDR0 192
#define configIP_ADDR1 168
#define configIP_ADDR2 0
#define configIP_ADDR3 11
-#define configGW_ADDR0 172
-#define configGW_ADDR1 25
-#define configGW_ADDR2 218
-#define configGW_ADDR3 3
+/* Defines the gateway address to be used. */
+#define configGW_ADDR0 192
+#define configGW_ADDR1 168
+#define configGW_ADDR2 0
+#define configGW_ADDR3 1
+/* Defins the net mask. */
#define configNET_MASK0 255
#define configNET_MASK1 255
#define configNET_MASK2 255
#define configNET_MASK3 0
+/* FEC driver configuration. */
#define configNUM_FEC_RX_BUFFERS 3
#define configFEC_BUFFER_SIZE 1520
-#define configUSE_PROMISCUOUS_MODE 1
-#define configETHERNET_INPUT_TASK_STACK_SIZE ( 320 )
+#define configUSE_PROMISCUOUS_MODE 0
#define configFEC_INTERRUPT_PRIORITY configMAX_SYSCALL_INTERRUPT_PRIORITY
-
#define configPHY_ADDRESS 0
#if ( configFEC_BUFFER_SIZE & 0x0F ) != 0
diff --git a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/heap_2_modified.c b/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/heap_2_modified.c
deleted file mode 100644
index 283f089cb..000000000
--- a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/heap_2_modified.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- FreeRTOS.org V5.1.0 - Copyright (C) 2003-2008 Richard Barry.
-
- This file is part of the FreeRTOS.org distribution.
-
- FreeRTOS.org is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- FreeRTOS.org is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- 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
- along with FreeRTOS.org; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
- A special exception to the GPL can be applied should you wish to distribute
- a combined work that includes FreeRTOS.org, without being obliged to provide
- the source code for any proprietary components. See the licensing section
- of http://www.FreeRTOS.org for full details of how and when the exception
- can be applied.
-
- ***************************************************************************
- ***************************************************************************
- * *
- * SAVE TIME AND MONEY! We can port FreeRTOS.org to your own hardware, *
- * and even write all or part of your application on your behalf. *
- * See http://www.OpenRTOS.com for details of the services we provide to *
- * expedite your project. *
- * *
- ***************************************************************************
- ***************************************************************************
-
- Please ensure to read the configuration and relevant port sections of the
- online documentation.
-
- http://www.FreeRTOS.org - Documentation, latest information, license and
- contact details.
-
- http://www.SafeRTOS.com - A version that is certified for use in safety
- critical systems.
-
- http://www.OpenRTOS.com - Commercial support, development, porting,
- licensing and training services.
-*/
-
-/*
- * A sample implementation of pvPortMalloc() and vPortFree() that permits
- * allocated blocks to be freed, but does not combine adjacent free blocks
- * into a single larger block.
- *
- * See heap_1.c and heap_3.c for alternative implementations, and the memory
- * management pages of http://www.FreeRTOS.org for more information.
- */
-#include
-
-#include "FreeRTOS.h"
-#include "task.h"
-
-/* Setup the correct byte alignment mask for the defined byte alignment. */
-
-#if portBYTE_ALIGNMENT == 8
- #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0007 )
-#endif
-
-#if portBYTE_ALIGNMENT == 4
- #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0003 )
-#endif
-
-#if portBYTE_ALIGNMENT == 2
- #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0001 )
-#endif
-
-#if portBYTE_ALIGNMENT == 1
- #define heapBYTE_ALIGNMENT_MASK ( ( size_t ) 0x0000 )
-#endif
-
-#ifndef heapBYTE_ALIGNMENT_MASK
- #error "Invalid portBYTE_ALIGNMENT definition"
-#endif
-
-/* Definitions from linker file. */
-extern far unsigned portCHAR __SP_INIT[];
-extern far unsigned portCHAR __RAM_ADDRESS[];
-extern far unsigned portCHAR __RAM_SIZE[];
-extern far unsigned portCHAR __stack_size[];
-
-#define heapTOP_OF_RAM ( ( (unsigned portLONG) __RAM_ADDRESS + (unsigned portLONG ) __RAM_SIZE ) - 4 )
-#define heapTOTAL_SIZE ( (heapTOP_OF_RAM - (unsigned portLONG)__SP_INIT ) + 4 )
-
-/* Allocate the memory for the heap. The struct is used to force byte
-alignment without using any non-portable code. */
-typedef struct xRTOS_HEAP_t
-{
- unsigned portLONG ulDummy;
- unsigned portCHAR *ucHeap;
-} xHeapStruct;
-
-/* Define the linked list structure. This is used to link free blocks in order
-of their size. */
-typedef struct A_BLOCK_LINK
-{
- struct A_BLOCK_LINK *pxNextFreeBlock; /*<< The next free block in the list. */
- size_t xBlockSize; /*<< The size of the free block. */
-} xBlockLink;
-
-
-static const unsigned portSHORT heapSTRUCT_SIZE = ( sizeof( xBlockLink ) + ( sizeof( xBlockLink ) % portBYTE_ALIGNMENT ) );
-#define heapMINIMUM_BLOCK_SIZE ( ( size_t ) ( heapSTRUCT_SIZE * 2 ) )
-
-/* Create a couple of list links to mark the start and end of the list. */
-static xBlockLink xStart, xEnd;
-static xHeapStruct *xHeap = NULL;
-
-/* STATIC FUNCTIONS ARE DEFINED AS MACROS TO MINIMIZE THE FUNCTION CALL DEPTH. */
-
-/*
- * Insert a block into the list of free blocks - which is ordered by size of
- * the block. Small blocks at the start of the list and large blocks at the end
- * of the list.
- */
-#define prvInsertBlockIntoFreeList( pxBlockToInsert ) \
-{ \
-xBlockLink *pxIterator; \
-size_t xBlockSize; \
- \
- xBlockSize = pxBlockToInsert->xBlockSize; \
- \
- /* Iterate through the list until a block is found that has a larger size */ \
- /* than the block we are inserting. */ \
- for( pxIterator = &xStart; pxIterator->pxNextFreeBlock->xBlockSize < xBlockSize; pxIterator = pxIterator->pxNextFreeBlock ) \
- { \
- /* There is nothing to do here - just iterate to the correct position. */ \
- } \
- \
- /* Update the list to include the block being inserted in the correct */ \
- /* position. */ \
- pxBlockToInsert->pxNextFreeBlock = pxIterator->pxNextFreeBlock; \
- pxIterator->pxNextFreeBlock = pxBlockToInsert; \
-}
-/*-----------------------------------------------------------*/
-
-#define prvHeapInit() \
-{ \
-xBlockLink *pxFirstFreeBlock; \
- \
- /* Point to the start of the heap. */ \
- xHeap = ( void * ) ( ( unsigned portLONG ) __SP_INIT + 4UL ); \
- xHeap->ucHeap = ( void * ) xHeap; \
- \
- /* xStart is used to hold a pointer to the first item in the list of free */ \
- /* blocks. The void cast is used to prevent compiler warnings. */ \
- xStart.pxNextFreeBlock = ( void * ) xHeap->ucHeap; \
- xStart.xBlockSize = ( size_t ) 0; \
- \
- /* xEnd is used to mark the end of the list of free blocks. */ \
- xEnd.xBlockSize = heapTOTAL_SIZE; \
- xEnd.pxNextFreeBlock = NULL; \
- \
- /* To start with there is a single free block that is sized to take up the \
- entire heap space. */ \
- pxFirstFreeBlock = ( void * ) xHeap->ucHeap; \
- pxFirstFreeBlock->xBlockSize = heapTOTAL_SIZE; \
- pxFirstFreeBlock->pxNextFreeBlock = &xEnd; \
-}
-/*-----------------------------------------------------------*/
-
-void *pvPortMalloc( size_t xWantedSize )
-{
-xBlockLink *pxBlock, *pxPreviousBlock, *pxNewBlockLink;
-static portBASE_TYPE xHeapHasBeenInitialised = pdFALSE;
-void *pvReturn = NULL;
-
- vTaskSuspendAll();
- {
- /* If this is the first call to malloc then the heap will require
- initialisation to setup the list of free blocks. */
- if( xHeapHasBeenInitialised == pdFALSE )
- {
- prvHeapInit();
- xHeapHasBeenInitialised = pdTRUE;
- }
-
- /* The wanted size is increased so it can contain a xBlockLink
- structure in addition to the requested amount of bytes. */
- if( xWantedSize > 0 )
- {
- xWantedSize += heapSTRUCT_SIZE;
-
- /* Ensure that blocks are always aligned to the required number of bytes. */
- if( xWantedSize & heapBYTE_ALIGNMENT_MASK )
- {
- /* Byte alignment required. */
- xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & heapBYTE_ALIGNMENT_MASK ) );
- }
- }
-
- if( ( xWantedSize > 0 ) && ( xWantedSize < heapTOTAL_SIZE ) )
- {
- /* Blocks are stored in byte order - traverse the list from the start
- (smallest) block until one of adequate size is found. */
- pxPreviousBlock = &xStart;
- pxBlock = xStart.pxNextFreeBlock;
- while( ( pxBlock->xBlockSize < xWantedSize ) && ( pxBlock->pxNextFreeBlock ) )
- {
- pxPreviousBlock = pxBlock;
- pxBlock = pxBlock->pxNextFreeBlock;
- }
-
- /* If we found the end marker then a block of adequate size was not found. */
- if( pxBlock != &xEnd )
- {
- /* Return the memory space - jumping over the xBlockLink structure
- at its start. */
- pvReturn = ( void * ) ( ( ( unsigned portCHAR * ) pxPreviousBlock->pxNextFreeBlock ) + heapSTRUCT_SIZE );
-
- /* This block is being returned for use so must be taken our of the
- list of free blocks. */
- pxPreviousBlock->pxNextFreeBlock = pxBlock->pxNextFreeBlock;
-
- /* If the block is larger than required it can be split into two. */
- if( ( pxBlock->xBlockSize - xWantedSize ) > heapMINIMUM_BLOCK_SIZE )
- {
- /* This block is to be split into two. Create a new block
- following the number of bytes requested. The void cast is
- used to prevent byte alignment warnings from the compiler. */
- pxNewBlockLink = ( void * ) ( ( ( unsigned portCHAR * ) pxBlock ) + xWantedSize );
-
- /* Calculate the sizes of two blocks split from the single
- block. */
- pxNewBlockLink->xBlockSize = pxBlock->xBlockSize - xWantedSize;
- pxBlock->xBlockSize = xWantedSize;
-
- /* Insert the new block into the list of free blocks. */
- prvInsertBlockIntoFreeList( ( pxNewBlockLink ) );
- }
- }
- }
- }
- xTaskResumeAll();
-
- if( pvReturn == NULL )
- {
- asm volatile ("NOP");
- }
-
- return pvReturn;
-}
-/*-----------------------------------------------------------*/
-
-void vPortFree( void *pv )
-{
-unsigned portCHAR *puc = ( unsigned portCHAR * ) pv;
-xBlockLink *pxLink;
-
- if( pv )
- {
- /* The memory being freed will have an xBlockLink structure immediately
- before it. */
- puc -= heapSTRUCT_SIZE;
-
- /* This casting is to keep the compiler from issuing warnings. */
- pxLink = ( void * ) puc;
-
- vTaskSuspendAll();
- {
- /* Add this block to the list of free blocks. */
- prvInsertBlockIntoFreeList( ( ( xBlockLink * ) pxLink ) );
- }
- xTaskResumeAll();
- }
-}
-/*-----------------------------------------------------------*/
-
diff --git a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/m52233-rom.ld b/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/m52233-rom.ld
deleted file mode 100644
index 8ee2a2e59..000000000
--- a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/m52233-rom.ld
+++ /dev/null
@@ -1,227 +0,0 @@
-/* Linker script for m52235evb
- *
- * Version:Sourcery G++ Lite 4.2-125
- * BugURL:https://support.codesourcery.com/GNUToolchain/
- *
- * Copyright 2007, 2008 CodeSourcery.
- *
- * The authors hereby grant permission to use, copy, modify, distribute,
- * and license this software and its documentation for any purpose, provided
- * that existing copyright notices are retained in all copies and that this
- * notice is included verbatim in any distributions. No written agreement,
- * license, or royalty fee is required for any of the authorized uses.
- * Modifications to this software may be copyrighted by their authors
- * and need not follow the licensing terms described here, provided that
- * the new terms are clearly indicated on the first page of each file where
- * they apply. */
-
-OUTPUT_ARCH(m68k)
-ENTRY(_start)
-SEARCH_DIR(.)
-GROUP(-lgcc -lc -lcs3 -lcs3unhosted -lcs3coldfire)
-
-MEMORY
-{
- ram (rw) : ORIGIN = 0x20000000, LENGTH = 32K
- vectorrom (RX) : ORIGIN = 0x00000000, LENGTH = 0x00000400
- cfmprotrom (RX) : ORIGIN = 0x00000400, LENGTH = 0x00000020
- rom (rx) : ORIGIN = 0x00000420, LENGTH = 256K - 0x400 - 0x20
- ipsbar (rw) : ORIGIN = 0x40000000, LENGTH = 2M
-}
-
-/* These force the linker to search for particular symbols from
- * the start of the link process and thus ensure the user's
- * overrides are picked up
- */
-EXTERN(__cs3_reset_m52235evb)
-INCLUDE coldfire-names.inc
-EXTERN(__cs3_interrupt_vector_coldfire)
-EXTERN(__cs3_start_c main __cs3_stack __cs3_heap_end)
-EXTERN(_start)
-
-PROVIDE(__cs3_heap_start = _end);
-PROVIDE(__cs3_heap_end = __cs3_region_start_ram + __cs3_region_size_ram);
-PROVIDE(__cs3_region_num = (__cs3_regions_end - __cs3_regions) / 20);
-PROVIDE(__cs3_stack = __cs3_region_start_ram + __cs3_region_size_ram);
-
-SECTIONS
-{
-
- .vectors_table :
- {
- CREATE_OBJECT_SYMBOLS
- __cs3_region_start_rom = .;
- *(.cs3.region-head.rom)
- ASSERT (. == __cs3_region_start_rom, ".cs3.region-head.rom not permitted");
- __cs3_interrupt_vector = __cs3_interrupt_vector_coldfire;
- *(.cs3.interrupt_vector)
- /* Make sure we pulled in an interrupt vector. */
- ASSERT (. != __cs3_interrupt_vector_coldfire, "No interrupt vector");
- } > vectorrom
-
- .cfmprotect :
- {
- *(.cfmconfig)
- . = ALIGN (0x4);
- } > cfmprotrom
-
-
- .text :
- {
-
- PROVIDE(__cs3_reset_m52235evb = _start);
- __cs3_reset = __cs3_reset_m52235evb;
- *(.cs3.reset)
-
- *(.text .text.* .gnu.linkonce.t.*)
-
- . = ALIGN(0x4);
- KEEP (*crtbegin.o(.jcr))
- KEEP (*(EXCLUDE_FILE (*crtend.o) .jcr))
- KEEP (*crtend.o(.jcr))
-
- . = ALIGN(0x4);
- *(.gcc_except_table .gcc_except_table.*)
- } >rom
- .eh_frame_hdr : ALIGN (4)
- {
- KEEP (*(.eh_frame_hdr))
- } >rom
- .eh_frame : ALIGN (4)
- {
- KEEP (*(.eh_frame))
- } >rom
- .rodata : ALIGN (4)
- {
- *(.rodata .rodata.* .gnu.linkonce.r.*)
-
- . = ALIGN(4);
- _init = .;
- LONG (0x4e560000) /* linkw %fp,#0 */
- KEEP(*(.init))
- SHORT (0x4e5e) /* unlk %fp */
- SHORT (0x4e75) /* rts */
-
- . = ALIGN(4);
- __preinit_array_start = .;
- KEEP (*(.preinit_array))
- __preinit_array_end = .;
-
- . = ALIGN(4);
- __init_array_start = .;
- KEEP (*(SORT(.init_array.*)))
- KEEP (*(.init_array))
- __init_array_end = .;
-
- . = ALIGN(4);
- _fini = .;
- LONG (0x4e560000) /* linkw %fp,#0 */
- KEEP(*(.fini))
- SHORT (0x4e5e) /* unlk %fp */
- SHORT (0x4e75) /* rts */
-
- . = ALIGN(4);
- __fini_array_start = .;
- KEEP (*(.fini_array))
- KEEP (*(SORT(.fini_array.*)))
- __fini_array_end = .;
-
- . = ALIGN(0x4);
- KEEP (*crtbegin.o(.ctors))
- KEEP (*(EXCLUDE_FILE (*crtend.o) .ctors))
- KEEP (*(SORT(.ctors.*)))
- KEEP (*crtend.o(.ctors))
-
- . = ALIGN(0x4);
- KEEP (*crtbegin.o(.dtors))
- KEEP (*(EXCLUDE_FILE (*crtend.o) .dtors))
- KEEP (*(SORT(.dtors.*)))
- KEEP (*crtend.o(.dtors))
-
- *(.lit)
-
- . = ALIGN(4);
- __cs3_regions = .;
- LONG (0)
- LONG (__cs3_region_init_ram)
- LONG (__cs3_region_start_ram)
- LONG (__cs3_region_init_size_ram)
- LONG (__cs3_region_zero_size_ram)
- __cs3_regions_end = .;
-
- . = ALIGN (8);
- . = ALIGN (8);
- *(.rom)
- *(.rom.b)
- _etext = .;
- } >rom
- /* __cs3_region_end_rom is deprecated */
- __cs3_region_end_rom = __cs3_region_start_rom + LENGTH(rom);
- __cs3_region_size_rom = LENGTH(rom);
-
- .cs3.ipsbar :
- {
- __cs3_region_start_ipsbar = .;
- *(.cs3.region-head.ipsbar)
- . = ALIGN (8);
- } >ipsbar
- /* __cs3_region_end_ipsbar is deprecated */
- __cs3_region_end_ipsbar = __cs3_region_start_ipsbar + LENGTH(ipsbar);
- __cs3_region_size_ipsbar = LENGTH(ipsbar);
-
- .data : ALIGN (8)
- {
- __cs3_region_start_ram = .;
- *(.cs3.region-head.ram)
- *(.got.plt) *(.got)
- *(.shdata)
- *(.data .data.* .gnu.linkonce.d.*)
- . = ALIGN (8);
- *(.ram)
- _edata = .;
- } >ram AT>rom
- .bss :
- {
- *(.shbss)
- *(.bss .bss.* .gnu.linkonce.b.*)
- *(COMMON)
- . = ALIGN (8);
- *(.ram.b)
- _end = .;
- __end = .;
- } >ram AT>rom
- /* __cs3_region_end_ram is deprecated */
- __cs3_region_end_ram = __cs3_region_start_ram + LENGTH(ram);
- __cs3_region_size_ram = LENGTH(ram);
- __cs3_region_init_ram = LOADADDR (.data);
- __cs3_region_init_size_ram = _edata - ADDR (.data);
- __cs3_region_zero_size_ram = _end - _edata;
-
- .stab 0 (NOLOAD) : { *(.stab) }
- .stabstr 0 (NOLOAD) : { *(.stabstr) }
- /* DWARF debug sections.
- * Symbols in the DWARF debugging sections are relative to the beginning
- * of the section so we begin them at 0. */
- /* DWARF 1 */
- .debug 0 : { *(.debug) }
- .line 0 : { *(.line) }
- /* GNU DWARF 1 extensions */
- .debug_srcinfo 0 : { *(.debug_srcinfo) }
- .debug_sfnames 0 : { *(.debug_sfnames) }
- /* DWARF 1.1 and DWARF 2 */
- .debug_aranges 0 : { *(.debug_aranges) }
- .debug_pubnames 0 : { *(.debug_pubnames) }
- /* DWARF 2 */
- .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) }
- .debug_abbrev 0 : { *(.debug_abbrev) }
- .debug_line 0 : { *(.debug_line) }
- .debug_frame 0 : { *(.debug_frame) }
- .debug_str 0 : { *(.debug_str) }
- .debug_loc 0 : { *(.debug_loc) }
- .debug_macinfo 0 : { *(.debug_macinfo) }
- /* SGI/MIPS DWARF 2 extensions */
- .debug_weaknames 0 : { *(.debug_weaknames) }
- .debug_funcnames 0 : { *(.debug_funcnames) }
- .debug_typenames 0 : { *(.debug_typenames) }
- .debug_varnames 0 : { *(.debug_varnames) }
-}
diff --git a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/main.c b/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/main.c
index e3db78268..bf9f92132 100644
--- a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/main.c
+++ b/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/main.c
@@ -54,12 +54,15 @@
* In addition to the standard demo tasks, the following tasks and tests are
* defined and/or created within this file:
*
+ * "uIP" task - This is the task that handles the uIP stack. All TCP/IP
+ * processing is performed in this task. It manages the WEB server functionality.
+ *
* "Check" task - This only executes every five seconds but has a high priority
* to ensure it gets processor time. Its main function is to check that all the
- * standard demo tasks are still operational. While no errors have been
- * discovered the check task will toggle an LED every 5 seconds - the toggle
- * rate increasing to 500ms being a visual indication that at least one task has
- * reported unexpected behaviour.
+ * standard demo tasks are still operational. An error found in any task will be
+ * latched in the ulErrorCode variable for display through the WEB server (the
+ * error code is displayed at the foot of the table that contains information on
+ * the state of each task).
*
* "Reg test" tasks - These fill the registers with known values, then check
* that each register still contains its expected value. Each task uses
@@ -96,21 +99,9 @@
/* The time between cycles of the 'check' functionality - as described at the
top of this file. */
-#define mainNO_ERROR_PERIOD ( ( portTickType ) 5000 / portTICK_RATE_MS )
-
-/* The rate at which the LED controlled by the 'check' task will flash should an
-error have been detected. */
-#define mainERROR_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS )
-
-/* The LED controlled by the 'check' task. */
-#define mainCHECK_LED ( 3 )
-
-/* ComTest constants - there is no free LED for the comtest tasks. */
-#define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 19200 )
-#define mainCOM_TEST_LED ( 5 )
+#define mainCHECK_TASK_PERIOD ( ( portTickType ) 5000 / portTICK_RATE_MS )
/* Task priorities. */
-#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
@@ -121,8 +112,6 @@ error have been detected. */
reliance on using sprintf(). */
#define mainBASIC_WEB_STACK_SIZE ( configMINIMAL_STACK_SIZE * 2 )
-static unsigned portLONG ulErrorCode = 0UL;
-
/*
* Configure the hardware for the demo.
*/
@@ -139,6 +128,21 @@ static void prvCheckTask( void *pvParameters );
*/
extern void vuIP_Task( void *pvParameters );
+/*
+ * Implement the 'Reg test' functionality as described at the top of this file.
+ */
+static void vRegTest1Task( void *pvParameters );
+static void vRegTest2Task( void *pvParameters );
+
+/*-----------------------------------------------------------*/
+
+/* Counters used to detect errors within the reg test tasks. */
+static volatile unsigned portLONG ulRegTest1Counter = 0x11111111, ulRegTest2Counter = 0x22222222;
+
+/* Any errors that the check task finds in any tasks are latched into
+ulErrorCode, and then displayed via the WEB server. */
+static unsigned portLONG ulErrorCode = 0UL;
+
/*-----------------------------------------------------------*/
int main( void )
@@ -159,13 +163,17 @@ int main( void )
vStartQueuePeekTasks();
vStartRecursiveMutexTasks();
+ /* Start the reg test tasks - defined in this file. */
+ xTaskCreate( vRegTest1Task, ( signed portCHAR * ) "Reg1", configMINIMAL_STACK_SIZE, ( void * ) &ulRegTest1Counter, tskIDLE_PRIORITY, NULL );
+ xTaskCreate( vRegTest2Task, ( signed portCHAR * ) "Reg2", configMINIMAL_STACK_SIZE, ( void * ) &ulRegTest2Counter, tskIDLE_PRIORITY, NULL );
+
/* Create the check task. */
xTaskCreate( prvCheckTask, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
/* Start the scheduler. */
vTaskStartScheduler();
- /* Will only get here if there was insufficient memory to create the idle
+ /* Will only get here if there was insufficient heap to create the idle
task. */
for( ;; );
}
@@ -173,8 +181,10 @@ int main( void )
static void prvCheckTask( void *pvParameters )
{
+unsigned ulLastRegTest1Count = 0, ulLastRegTest2Count = 0;
portTickType xLastExecutionTime;
+ /* To prevent compiler warnings. */
( void ) pvParameters;
/* Initialise the variable used to control our iteration rate prior to
@@ -184,7 +194,7 @@ portTickType xLastExecutionTime;
for( ;; )
{
/* Wait until it is time to run the tests again. */
- vTaskDelayUntil( &xLastExecutionTime, mainNO_ERROR_PERIOD );
+ vTaskDelayUntil( &xLastExecutionTime, mainCHECK_TASK_PERIOD );
/* Has an error been found in any task? */
if( xAreGenericQueueTasksStillRunning() != pdTRUE )
@@ -221,12 +231,28 @@ portTickType xLastExecutionTime;
{
ulErrorCode |= 0x100UL;
}
+
+ if( ulLastRegTest1Count == ulRegTest1Counter )
+ {
+ ulErrorCode |= 0x200UL;
+ }
+
+ if( ulLastRegTest2Count == ulRegTest2Counter )
+ {
+ ulErrorCode |= 0x200UL;
+ }
+
+ /* Remember the reg test counts so a stall in their values can be
+ detected next time around. */
+ ulLastRegTest1Count = ulRegTest1Counter;
+ ulLastRegTest2Count = ulRegTest2Counter;
}
}
/*-----------------------------------------------------------*/
unsigned portLONG ulGetErrorCode( void )
{
+ /* Returns the error code for display via the WEB server. */
return ulErrorCode;
}
/*-----------------------------------------------------------*/
@@ -295,3 +321,157 @@ void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed portCHAR *pcTask
}
/*-----------------------------------------------------------*/
+static void vRegTest1Task( void *pvParameters )
+{
+ /* Sanity check - did we receive the parameter expected? */
+ if( pvParameters != &ulRegTest1Counter )
+ {
+ /* Change here so the check task can detect that an error occurred. */
+ for( ;; );
+ }
+
+ /* Set all the registers to known values, then check that each retains its
+ expected value - as described at the top of this file. If an error is
+ found then the loop counter will no longer be incremented allowing the check
+ task to recognise the error. */
+ asm volatile ( "reg_test_1_start: \n\t"
+ " moveq #1, %d0 \n\t"
+ " moveq #2, %d1 \n\t"
+ " moveq #3, %d2 \n\t"
+ " moveq #4, %d3 \n\t"
+ " moveq #5, %d4 \n\t"
+ " moveq #6, %d5 \n\t"
+ " moveq #7, %d6 \n\t"
+ " moveq #8, %d7 \n\t"
+ " move #9, %a0 \n\t"
+ " move #10, %a1 \n\t"
+ " move #11, %a2 \n\t"
+ " move #12, %a3 \n\t"
+ " move #13, %a4 \n\t"
+ " move #14, %a5 \n\t"
+ " move #15, %a6 \n\t"
+ " \n\t"
+ " cmpi.l #1, %d0 \n\t"
+ " bne reg_test_1_error \n\t"
+ " cmpi.l #2, %d1 \n\t"
+ " bne reg_test_1_error \n\t"
+ " cmpi.l #3, %d2 \n\t"
+ " bne reg_test_1_error \n\t"
+ " cmpi.l #4, %d3 \n\t"
+ " bne reg_test_1_error \n\t"
+ " cmpi.l #5, %d4 \n\t"
+ " bne reg_test_1_error \n\t"
+ " cmpi.l #6, %d5 \n\t"
+ " bne reg_test_1_error \n\t"
+ " cmpi.l #7, %d6 \n\t"
+ " bne reg_test_1_error \n\t"
+ " cmpi.l #8, %d7 \n\t"
+ " bne reg_test_1_error \n\t"
+ " move %a0, %d0 \n\t"
+ " cmpi.l #9, %d0 \n\t"
+ " bne reg_test_1_error \n\t"
+ " move %a1, %d0 \n\t"
+ " cmpi.l #10, %d0 \n\t"
+ " bne reg_test_1_error \n\t"
+ " move %a2, %d0 \n\t"
+ " cmpi.l #11, %d0 \n\t"
+ " bne reg_test_1_error \n\t"
+ " move %a3, %d0 \n\t"
+ " cmpi.l #12, %d0 \n\t"
+ " bne reg_test_1_error \n\t"
+ " move %a4, %d0 \n\t"
+ " cmpi.l #13, %d0 \n\t"
+ " bne reg_test_1_error \n\t"
+ " move %a5, %d0 \n\t"
+ " cmpi.l #14, %d0 \n\t"
+ " bne reg_test_1_error \n\t"
+ " move %a6, %d0 \n\t"
+ " cmpi.l #15, %d0 \n\t"
+ " bne reg_test_1_error \n\t"
+ " movel ulRegTest1Counter, %d0 \n\t"
+ " addql #1, %d0 \n\t"
+ " movel %d0, ulRegTest1Counter \n\t"
+ " bra reg_test_1_start \n\t"
+ "reg_test_1_error: \n\t"
+ " bra reg_test_1_error \n\t"
+ );
+}
+/*-----------------------------------------------------------*/
+
+static void vRegTest2Task( void *pvParameters )
+{
+ /* Sanity check - did we receive the parameter expected? */
+ if( pvParameters != &ulRegTest2Counter )
+ {
+ /* Change here so the check task can detect that an error occurred. */
+ for( ;; );
+ }
+
+ /* Set all the registers to known values, then check that each retains its
+ expected value - as described at the top of this file. If an error is
+ found then the loop counter will no longer be incremented allowing the check
+ task to recognise the error. */
+ asm volatile ( "reg_test_2_start: \n\t"
+ " moveq #10, %d0 \n\t"
+ " moveq #20, %d1 \n\t"
+ " moveq #30, %d2 \n\t"
+ " moveq #40, %d3 \n\t"
+ " moveq #50, %d4 \n\t"
+ " moveq #60, %d5 \n\t"
+ " moveq #70, %d6 \n\t"
+ " moveq #80, %d7 \n\t"
+ " move #90, %a0 \n\t"
+ " move #100, %a1 \n\t"
+ " move #110, %a2 \n\t"
+ " move #120, %a3 \n\t"
+ " move #130, %a4 \n\t"
+ " move #140, %a5 \n\t"
+ " move #150, %a6 \n\t"
+ " \n\t"
+ " cmpi.l #10, %d0 \n\t"
+ " bne reg_test_2_error \n\t"
+ " cmpi.l #20, %d1 \n\t"
+ " bne reg_test_2_error \n\t"
+ " cmpi.l #30, %d2 \n\t"
+ " bne reg_test_2_error \n\t"
+ " cmpi.l #40, %d3 \n\t"
+ " bne reg_test_2_error \n\t"
+ " cmpi.l #50, %d4 \n\t"
+ " bne reg_test_2_error \n\t"
+ " cmpi.l #60, %d5 \n\t"
+ " bne reg_test_2_error \n\t"
+ " cmpi.l #70, %d6 \n\t"
+ " bne reg_test_2_error \n\t"
+ " cmpi.l #80, %d7 \n\t"
+ " bne reg_test_2_error \n\t"
+ " move %a0, %d0 \n\t"
+ " cmpi.l #90, %d0 \n\t"
+ " bne reg_test_2_error \n\t"
+ " move %a1, %d0 \n\t"
+ " cmpi.l #100, %d0 \n\t"
+ " bne reg_test_2_error \n\t"
+ " move %a2, %d0 \n\t"
+ " cmpi.l #110, %d0 \n\t"
+ " bne reg_test_2_error \n\t"
+ " move %a3, %d0 \n\t"
+ " cmpi.l #120, %d0 \n\t"
+ " bne reg_test_2_error \n\t"
+ " move %a4, %d0 \n\t"
+ " cmpi.l #130, %d0 \n\t"
+ " bne reg_test_2_error \n\t"
+ " move %a5, %d0 \n\t"
+ " cmpi.l #140, %d0 \n\t"
+ " bne reg_test_2_error \n\t"
+ " move %a6, %d0 \n\t"
+ " cmpi.l #150, %d0 \n\t"
+ " bne reg_test_2_error \n\t"
+ " movel ulRegTest1Counter, %d0 \n\t"
+ " addql #1, %d0 \n\t"
+ " movel %d0, ulRegTest2Counter \n\t"
+ " bra reg_test_2_start \n\t"
+ "reg_test_2_error: \n\t"
+ " bra reg_test_2_error \n\t"
+ );
+}
+/*-----------------------------------------------------------*/
+
diff --git a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/printf-stdarg.c b/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/printf-stdarg.c
new file mode 100644
index 000000000..f6139dc80
--- /dev/null
+++ b/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/printf-stdarg.c
@@ -0,0 +1,293 @@
+/*
+ Copyright 2001, 2002 Georges Menie (www.menie.org)
+ stdarg version contributed by Christian Ettinger
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU Lesser General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program 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 Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+*/
+
+/*
+ putchar is the only external dependency for this file,
+ if you have a working putchar, leave it commented out.
+ If not, uncomment the define below and
+ replace outbyte(c) by your own function call.
+
+*/
+
+#define putchar(c) c
+
+#include
+
+static void printchar(char **str, int c)
+{
+ //extern int putchar(int c);
+
+ if (str) {
+ **str = (char)c;
+ ++(*str);
+ }
+ else
+ {
+ (void)putchar(c);
+ }
+}
+
+#define PAD_RIGHT 1
+#define PAD_ZERO 2
+
+static int prints(char **out, const char *string, int width, int pad)
+{
+ register int pc = 0, padchar = ' ';
+
+ if (width > 0) {
+ register int len = 0;
+ register const char *ptr;
+ for (ptr = string; *ptr; ++ptr) ++len;
+ if (len >= width) width = 0;
+ else width -= len;
+ if (pad & PAD_ZERO) padchar = '0';
+ }
+ if (!(pad & PAD_RIGHT)) {
+ for ( ; width > 0; --width) {
+ printchar (out, padchar);
+ ++pc;
+ }
+ }
+ for ( ; *string ; ++string) {
+ printchar (out, *string);
+ ++pc;
+ }
+ for ( ; width > 0; --width) {
+ printchar (out, padchar);
+ ++pc;
+ }
+
+ return pc;
+}
+
+/* the following should be enough for 32 bit int */
+#define PRINT_BUF_LEN 12
+
+static int printi(char **out, int i, int b, int sg, int width, int pad, int letbase)
+{
+ char print_buf[PRINT_BUF_LEN];
+ register char *s;
+ register int t, neg = 0, pc = 0;
+ register unsigned int u = (unsigned int)i;
+
+ if (i == 0) {
+ print_buf[0] = '0';
+ print_buf[1] = '\0';
+ return prints (out, print_buf, width, pad);
+ }
+
+ if (sg && b == 10 && i < 0) {
+ neg = 1;
+ u = (unsigned int)-i;
+ }
+
+ s = print_buf + PRINT_BUF_LEN-1;
+ *s = '\0';
+
+ while (u) {
+ t = (int)u % b;
+ if( t >= 10 )
+ t += letbase - '0' - 10;
+ *--s = (char)(t + '0');
+ u /= b;
+ }
+
+ if (neg) {
+ if( width && (pad & PAD_ZERO) ) {
+ printchar (out, '-');
+ ++pc;
+ --width;
+ }
+ else {
+ *--s = '-';
+ }
+ }
+
+ return pc + prints (out, s, width, pad);
+}
+
+static int print( char **out, const char *format, va_list args )
+{
+ register int width, pad;
+ register int pc = 0;
+ char scr[2];
+
+ for (; *format != 0; ++format) {
+ if (*format == '%') {
+ ++format;
+ width = pad = 0;
+ if (*format == '\0') break;
+ if (*format == '%') goto out;
+ if (*format == '-') {
+ ++format;
+ pad = PAD_RIGHT;
+ }
+ while (*format == '0') {
+ ++format;
+ pad |= PAD_ZERO;
+ }
+ for ( ; *format >= '0' && *format <= '9'; ++format) {
+ width *= 10;
+ width += *format - '0';
+ }
+ if( *format == 's' ) {
+ register char *s = (char *)va_arg( args, int );
+ pc += prints (out, s?s:"(null)", width, pad);
+ continue;
+ }
+ if( *format == 'd' ) {
+ pc += printi (out, va_arg( args, int ), 10, 1, width, pad, 'a');
+ continue;
+ }
+ if( *format == 'x' ) {
+ pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'a');
+ continue;
+ }
+ if( *format == 'X' ) {
+ pc += printi (out, va_arg( args, int ), 16, 0, width, pad, 'A');
+ continue;
+ }
+ if( *format == 'u' ) {
+ pc += printi (out, va_arg( args, int ), 10, 0, width, pad, 'a');
+ continue;
+ }
+ if( *format == 'c' ) {
+ /* char are converted to int then pushed on the stack */
+ scr[0] = (char)va_arg( args, int );
+ scr[1] = '\0';
+ pc += prints (out, scr, width, pad);
+ continue;
+ }
+ }
+ else {
+ out:
+ printchar (out, *format);
+ ++pc;
+ }
+ }
+ if (out) **out = '\0';
+ va_end( args );
+ return pc;
+}
+
+int printf(const char *format, ...)
+{
+ va_list args;
+
+ va_start( args, format );
+ return print( 0, format, args );
+}
+
+int sprintf(char *out, const char *format, ...)
+{
+ va_list args;
+
+ va_start( args, format );
+ return print( &out, format, args );
+}
+
+
+int snprintf( char *buf, unsigned int count, const char *format, ... )
+{
+ va_list args;
+
+ ( void ) count;
+
+ va_start( args, format );
+ return print( &buf, format, args );
+}
+
+
+#ifdef TEST_PRINTF
+int main(void)
+{
+ char *ptr = "Hello world!";
+ char *np = 0;
+ int i = 5;
+ unsigned int bs = sizeof(int)*8;
+ int mi;
+ char buf[80];
+
+ mi = (1 << (bs-1)) + 1;
+ printf("%s\n", ptr);
+ printf("printf test\n");
+ printf("%s is null pointer\n", np);
+ printf("%d = 5\n", i);
+ printf("%d = - max int\n", mi);
+ printf("char %c = 'a'\n", 'a');
+ printf("hex %x = ff\n", 0xff);
+ printf("hex %02x = 00\n", 0);
+ printf("signed %d = unsigned %u = hex %x\n", -3, -3, -3);
+ printf("%d %s(s)%", 0, "message");
+ printf("\n");
+ printf("%d %s(s) with %%\n", 0, "message");
+ sprintf(buf, "justif: \"%-10s\"\n", "left"); printf("%s", buf);
+ sprintf(buf, "justif: \"%10s\"\n", "right"); printf("%s", buf);
+ sprintf(buf, " 3: %04d zero padded\n", 3); printf("%s", buf);
+ sprintf(buf, " 3: %-4d left justif.\n", 3); printf("%s", buf);
+ sprintf(buf, " 3: %4d right justif.\n", 3); printf("%s", buf);
+ sprintf(buf, "-3: %04d zero padded\n", -3); printf("%s", buf);
+ sprintf(buf, "-3: %-4d left justif.\n", -3); printf("%s", buf);
+ sprintf(buf, "-3: %4d right justif.\n", -3); printf("%s", buf);
+
+ return 0;
+}
+
+/*
+ * if you compile this file with
+ * gcc -Wall $(YOUR_C_OPTIONS) -DTEST_PRINTF -c printf.c
+ * you will get a normal warning:
+ * printf.c:214: warning: spurious trailing `%' in format
+ * this line is testing an invalid % at the end of the format string.
+ *
+ * this should display (on 32bit int machine) :
+ *
+ * Hello world!
+ * printf test
+ * (null) is null pointer
+ * 5 = 5
+ * -2147483647 = - max int
+ * char a = 'a'
+ * hex ff = ff
+ * hex 00 = 00
+ * signed -3 = unsigned 4294967293 = hex fffffffd
+ * 0 message(s)
+ * 0 message(s) with %
+ * justif: "left "
+ * justif: " right"
+ * 3: 0003 zero padded
+ * 3: 3 left justif.
+ * 3: 3 right justif.
+ * -3: -003 zero padded
+ * -3: -3 left justif.
+ * -3: -3 right justif.
+ */
+
+#endif
+
+
+/* To keep linker happy. */
+int write( int i, char* c, int n)
+{
+ (void)i;
+ (void)n;
+ (void)c;
+ return 0;
+}
+
diff --git a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/webserver/httpd-cgi.c b/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/webserver/httpd-cgi.c
index ef683fd9f..7b7fef7fd 100644
--- a/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/webserver/httpd-cgi.c
+++ b/Demo/ColdFire_MCF52233_Eclipse/RTOSDemo/webserver/httpd-cgi.c
@@ -50,7 +50,8 @@
#include "httpd.h"
#include "httpd-cgi.h"
#include "httpd-fs.h"
-
+#include "FreeRTOS.h"
+#include "partest.h"
#include
#include