]> git.sur5r.net Git - freertos/commitdiff
Add serial test code (not yet complete).
authorRichardBarry <RichardBarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 8 Aug 2008 15:55:31 +0000 (15:55 +0000)
committerRichardBarry <RichardBarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 8 Aug 2008 15:55:31 +0000 (15:55 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@440 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Demo/ColdFire_MCF5282_Eclipse/RTOSDemo/FreeRTOSConfig.h
Demo/ColdFire_MCF5282_Eclipse/RTOSDemo/Makefile
Demo/ColdFire_MCF5282_Eclipse/RTOSDemo/main.c
Demo/ColdFire_MCF5282_Eclipse/RTOSDemo/serial/serial.c [new file with mode: 0644]

index d0575a0fc8b33519f11cc0640c0ffccb904f253c..3d49b02995140d0afe48049a13e796f128f65a5d 100644 (file)
@@ -65,7 +65,7 @@
 #define configUSE_PREEMPTION                   1\r
 #define configUSE_IDLE_HOOK                            0\r
 #define configUSE_TICK_HOOK                            0\r
-#define configCPU_CLOCK_HZ                             ( ( unsigned portLONG ) 25000000 )\r
+#define configCPU_CLOCK_HZ                             ( ( unsigned portLONG ) 64000000 )\r
 #define configTICK_RATE_HZ                             ( ( portTickType ) 1000 )\r
 #define configMINIMAL_STACK_SIZE               ( ( unsigned portSHORT ) 90 )\r
 #define configTOTAL_HEAP_SIZE                  ( ( size_t ) ( 24000 ) )\r
index 0c6bccd56121ad31b7f70411a4015d21682d7003..89cba4beb1480ebc23e8f9608236bb8d3592dd64 100644 (file)
@@ -2,17 +2,19 @@ RM := rm -rf
 \r
 FREERTOS_SOURCE_DIR=./../../../Source\r
 PORT_SOURCE_DIR=./../../../Source/portable/GCC/ColdFire_V2\r
-COMMON_DEMO_CODE_DIR=./../../Common/Minimal\r
+COMMON_DEMO_SOURCE_DIR=./../../Common/Minimal\r
 OUTPUT_DIR=./bin\r
 CPU=528x\r
 LINKER_SCRIPT=m5282evb-ram-hosted.ld\r
 OUTPUT_FILENAME=RTOSDemo.elf\r
 CC=m68k-elf-gcc\r
 AS=m68K-elf-as\r
-VPATH=$(FREERTOS_SOURCE_DIR) : $(PORT_SOURCE_DIR) : $(COMMON_DEMO_CODE_DIR) : $(FREERTOS_SOURCE_DIR)/portable/MemMang : . : ./ParTest\r
+VPATH=$(FREERTOS_SOURCE_DIR) : $(PORT_SOURCE_DIR) : $(COMMON_DEMO_SOURCE_DIR) : $(FREERTOS_SOURCE_DIR)/portable/MemMang : . : ./ParTest : ./serial\r
 \r
 OBJS =         $(OUTPUT_DIR)/portasm.o \\r
                        $(OUTPUT_DIR)/main.o \\r
+                       $(OUTPUT_DIR)/serial.o \\r
+                       $(OUTPUT_DIR)/comtest.o \\r
                        $(OUTPUT_DIR)/flash.o \\r
                        $(OUTPUT_DIR)/ParTest.o \\r
                        $(OUTPUT_DIR)/BlockQ.o \\r
@@ -36,7 +38,7 @@ C_DEPS = $(OBJS:.o=.d)
 \r
 CFLAGS=                -I"$(FREERTOS_SOURCE_DIR)/include" \\r
                        -I"include" \\r
-                       -I"$(COMMON_DEMO_CODE_DIR)/../include" \\r
+                       -I"$(COMMON_DEMO_SOURCE_DIR)/../include" \\r
                        -I"$(PORT_SOURCE_DIR)" \\r
                        -I./MCF5282 \\r
                        -I. \\r
index 3c63ed3f7e6b9cfea3b39b08ab0854f9f1e8f6b3..1f1b3978bc424e1720dfac3a8d81e1e5eca13fa1 100644 (file)
@@ -85,6 +85,7 @@
 #include "QPeek.h"\r
 #include "recmutex.h"\r
 #include "IntQueue.h"\r
+#include "comtest2.h"\r
 \r
 /*-----------------------------------------------------------*/\r
 \r
@@ -99,7 +100,12 @@ error has been detected. */
 /* The LED controlled by the 'check' task. */\r
 #define mainCHECK_LED                                          ( 3 )\r
 \r
+/* Contest constants - there is no free LED for the comtest. */\r
+#define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 115200 )\r
+#define mainCOM_TEST_LED               ( 5 )\r
+\r
 /* Task priorities. */\r
+#define mainCOM_TEST_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
@@ -108,7 +114,6 @@ error has been detected. */
 #define mainINTEGER_TASK_PRIORITY           ( tskIDLE_PRIORITY )\r
 #define mainGEN_QUEUE_TASK_PRIORITY                    ( tskIDLE_PRIORITY )\r
 \r
-\r
 /*\r
  * Configure the hardware for the demo.\r
  */\r
@@ -137,6 +142,7 @@ int main( void )
        vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY );\r
        vStartQueuePeekTasks();\r
        vStartRecursiveMutexTasks();\r
+       vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );\r
 \r
        /* Create the check task. */\r
        xTaskCreate( prvCheckTask, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );\r
@@ -157,7 +163,7 @@ int main( void )
 \r
 static void prvCheckTask( void *pvParameters )\r
 {\r
-unsigned ulTicksToWait = mainNO_ERROR_PERIOD;\r
+unsigned ulTicksToWait = mainNO_ERROR_PERIOD, ulError = 0;\r
 portTickType xLastExecutionTime;\r
 \r
        ( void ) pvParameters;\r
@@ -174,40 +180,49 @@ portTickType xLastExecutionTime;
                /* Has an error been found in any task? */\r
                if( xAreGenericQueueTasksStillRunning() != pdTRUE )\r
                {\r
-                       ulTicksToWait = mainERROR_PERIOD;\r
+                       ulError |= 0x01UL;\r
                }\r
                else if( xAreQueuePeekTasksStillRunning() != pdTRUE )\r
                {\r
-                       ulTicksToWait = mainERROR_PERIOD;\r
+                       ulError |= 0x02UL;\r
                }\r
                else if( xAreBlockingQueuesStillRunning() != pdTRUE )\r
                {\r
-                       ulTicksToWait = mainERROR_PERIOD;\r
+                       ulError |= 0x04UL;\r
                }\r
                else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )\r
                {\r
-                       ulTicksToWait = mainERROR_PERIOD;\r
+                       ulError |= 0x10UL;\r
                }\r
            else if( xAreSemaphoreTasksStillRunning() != pdTRUE )\r
            {\r
-               ulTicksToWait = mainERROR_PERIOD;\r
+               ulError |= 0x20UL;\r
            }\r
            else if( xArePollingQueuesStillRunning() != pdTRUE )\r
            {\r
-               ulTicksToWait = mainERROR_PERIOD;\r
+               ulError |= 0x40UL;\r
            }\r
            else if( xIsCreateTaskStillRunning() != pdTRUE )\r
            {\r
-               ulTicksToWait = mainERROR_PERIOD;\r
+               ulError |= 0x80UL;\r
            }\r
            else if( xAreIntegerMathsTaskStillRunning() != pdTRUE )\r
            {\r
-               ulTicksToWait = mainERROR_PERIOD;\r
+               ulError |= 0x100UL;\r
            }\r
            else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE )\r
            {\r
-               ulTicksToWait = mainERROR_PERIOD;\r
+               ulError |= 0x200UL;\r
            }\r
+           else if( xAreComTestTasksStillRunning() != pdTRUE )\r
+               {\r
+               ulError |= 0x400UL;\r
+               }\r
+\r
+               if( ulError != 0 )\r
+               {\r
+               ulTicksToWait = mainERROR_PERIOD;\r
+               }\r
 \r
                vParTestToggleLED( mainCHECK_LED );\r
        }\r
@@ -216,6 +231,15 @@ portTickType xLastExecutionTime;
 \r
 void prvSetupHardware( void )\r
 {\r
+       /* Multiply 8Mhz reference crystal by 8 to achieve system clock of 64Mhz. */\r
+       MCF_CLOCK_SYNCR = MCF_CLOCK_SYNCR_MFD( 2 );\r
+\r
+       /* Wait for PLL to lock. */\r
+       while( !( MCF_CLOCK_SYNSR & MCF_CLOCK_SYNSR_LOCK ) )\r
+       {\r
+               __asm__ volatile ( "NOP" );\r
+       }\r
+\r
        vParTestInitialise();\r
 }\r
 /*-----------------------------------------------------------*/\r
diff --git a/Demo/ColdFire_MCF5282_Eclipse/RTOSDemo/serial/serial.c b/Demo/ColdFire_MCF5282_Eclipse/RTOSDemo/serial/serial.c
new file mode 100644 (file)
index 0000000..324ee63
--- /dev/null
@@ -0,0 +1,224 @@
+/*\r
+       FreeRTOS.org V5.0.3 - Copyright (C) 2003-2008 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
+    ***************************************************************************\r
+    *                                                                         *\r
+    * SAVE TIME AND MONEY!  We can port FreeRTOS.org to your own hardware,    *\r
+    * and even write all or part of your application on your behalf.          *\r
+    * See http://www.OpenRTOS.com for details of the services we provide to   *\r
+    * expedite your project.                                                  *\r
+    *                                                                         *\r
+    ***************************************************************************\r
+    ***************************************************************************\r
+\r
+       Please ensure to read the configuration and relevant port sections of the\r
+       online documentation.\r
+\r
+       http://www.FreeRTOS.org - Documentation, latest information, license and\r
+       contact details.\r
+\r
+       http://www.SafeRTOS.com - A version that is certified for use in safety\r
+       critical systems.\r
+\r
+       http://www.OpenRTOS.com - Commercial support, development, porting,\r
+       licensing and training services.\r
+*/\r
+\r
+\r
+/* BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER.\r
+\r
+NOTE:  This driver is primarily to test the scheduler functionality.  It does\r
+not effectively use the buffers or DMA and is therefore not intended to be\r
+an example of an efficient driver. */\r
+\r
+/* Standard include file. */\r
+#include <stdlib.h>\r
+\r
+/* Scheduler include files. */\r
+#include "FreeRTOS.h"\r
+#include "queue.h"\r
+#include "task.h"\r
+\r
+/* Demo app include files. */\r
+#include "serial.h"\r
+\r
+/* Hardware definitions. */\r
+#define serNO_PARITY           ( ( unsigned portCHAR ) 0x10 << 3 )\r
+#define ser8DATA_BITS          ( ( unsigned portCHAR ) 0x11 )\r
+#define ser1STOP_BIT           ( ( unsigned portCHAR ) 0x111 )\r
+#define serSYSTEM_CLOCK                ( ( unsigned portCHAR ) 0xdd )\r
+#define serTX_OUTPUT           ( ( unsigned portCHAR ) 0x04 )\r
+#define serRX_INPUT                    ( ( unsigned portCHAR ) 0x08 )\r
+#define serTX_ENABLE           ( ( unsigned portCHAR ) 0x04 )\r
+#define serRX_ENABLE           ( ( unsigned portCHAR ) 0x01 )\r
+#define serTX_INT                      ( ( unsigned portCHAR ) 0x01 )\r
+#define serRX_INT                      ( ( unsigned portCHAR ) 0x02 )\r
+\r
+\r
+/* The queues used to communicate between tasks and ISR's. */\r
+static xQueueHandle xRxedChars;\r
+static xQueueHandle xCharsForTx;\r
+\r
+/* Flag used to indicate the tx status. */\r
+static portBASE_TYPE xTxHasEnded;\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/* The UART interrupt handler. */\r
+void __attribute__( ( interrupt ) ) __cs3_isr_interrupt_78( void );\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )\r
+{\r
+const unsigned portLONG ulBaudRateDivisor = ( configCPU_CLOCK_HZ / ( 32 * ulWantedBaud ) );\r
+\r
+       /* Create the queues used by the com test task. */\r
+       xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );\r
+       xCharsForTx = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );\r
+\r
+       /* Set the pins to UART mode. */\r
+       MCF_PAD_PUAPAR |= ( serTX_OUTPUT | serRX_INPUT );\r
+\r
+       /* Configure the UART. */\r
+       MCF_UART1_UMR1 = serNO_PARITY | ser8DATA_BITS;\r
+       MCF_UART1_UMR2 = ser1STOP_BIT;\r
+       MCF_UART1_UCSR = serSYSTEM_CLOCK;\r
+\r
+       MCF_UART1_UBG1 = ( unsigned portCHAR ) ( ( ulBaudRateDivisor >> 8UL ) & 0xffUL );\r
+       MCF_UART1_UBG2 = ( unsigned portCHAR ) ( ulBaudRateDivisor & 0xffUL );\r
+\r
+       /* Reset the peripheral before turning it on. */\r
+       MCF_UART1_UCR = MCF_UART_UCR_RESET_MR;\r
+       MCF_UART1_UCR = MCF_UART_UCR_RESET_RX;\r
+       MCF_UART1_UCR = MCF_UART_UCR_RESET_TX;\r
+       MCF_UART1_UCR = MCF_UART_UCR_RESET_ERROR;\r
+       MCF_UART1_UCR = serTX_ENABLE | serRX_ENABLE;\r
+\r
+       /* Configure the interrupt controller.  Run the UARTs above the kernel\r
+       interrupt priority for demo purposes. */\r
+    MCF_INTC0_ICR14 = ( ( configKERNEL_INTERRUPT_PRIORITY + 1 ) | ( 1 << 3 ) );\r
+    MCF_INTC0_IMRL &= ~MCF_INTC_IMRL_INT_MASK14;\r
+\r
+       /* The Tx interrupt is not enabled until there is data to send. */\r
+       MCF_UART0_UIMR = serRX_INT;\r
+\r
+       /* Only a single port is implemented so we don't need to return anything. */\r
+       return NULL;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )\r
+{\r
+       /* Only one port is supported. */\r
+       ( void ) pxPort;\r
+\r
+       /* Get the next character from the buffer.  Return false if no characters\r
+       are available or arrive before xBlockTime expires. */\r
+       if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )\r
+       {\r
+               return pdTRUE;\r
+       }\r
+       else\r
+       {\r
+               return pdFALSE;\r
+       }\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )\r
+{\r
+       /* Only one port is supported. */\r
+       ( void ) pxPort;\r
+\r
+       /* Return false if after the block time there is no room on the Tx queue. */\r
+       if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )\r
+       {\r
+               return pdFAIL;\r
+       }\r
+\r
+       /* A critical section should not be required as xTxHasEnded will not be\r
+       written to by the ISR if it is already 0 (is this correct?). */\r
+       if( xTxHasEnded )\r
+       {\r
+               xTxHasEnded = pdFALSE;\r
+               MCF_UART0_UIMR = serRX_INT | serTX_INT;\r
+       }\r
+\r
+       return pdPASS;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void vSerialClose( xComPortHandle xPort )\r
+{\r
+       ( void ) xPort;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
+void __cs3_isr_interrupt_78( void )\r
+{\r
+unsigned portCHAR ucChar;\r
+portBASE_TYPE xHigherPriorityTaskWoken = pdFALSE, xDoneSomething = pdTRUE;\r
+\r
+       while( xDoneSomething != pdFALSE )\r
+       {\r
+               xDoneSomething = pdFALSE;\r
+\r
+               /* Does the tx buffer contain space? */\r
+               if( ( MCF_UART0_USR & MCF_UART_USR_TXRDY ) != 0x00 )\r
+               {\r
+                       /* Are there any characters queued to be sent? */\r
+                       if( xQueueReceiveFromISR( xCharsForTx, &ucChar, &xHigherPriorityTaskWoken ) == pdTRUE )\r
+                       {\r
+                               /* Send the next char. */\r
+                               MCF_UART0_UTB = ucChar;\r
+                               xDoneSomething = pdTRUE;\r
+                       }\r
+                       else\r
+                       {\r
+                               /* Turn off the Tx interrupt until such time as another character\r
+                               is being transmitted. */
+                               MCF_UART0_UIMR = serRX_INT;\r
+                       }\r
+               }\r
+\r
+               if( MCF_UART0_USR & MCF_UART_USR_RXRDY )\r
+               {\r
+                       ucChar = MCF_UART0_URB;\r
+                       xQueueSendFromISR( xRxedChars, &ucChar, &xHigherPriorityTaskWoken );\r
+                       xDoneSomething = pdTRUE;\r
+               }\r
+       }\r
+\r
+    portEND_SWITCHING_ISR( xHigherPriorityTaskWoken );\r
+}\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r