]> git.sur5r.net Git - freertos/commitdiff
Add event groups demo to Zynq demo.
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Tue, 11 Feb 2014 09:24:33 +0000 (09:24 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Tue, 11 Feb 2014 09:24:33 +0000 (09:24 +0000)
Add C implementations of some standard library functions to the Zynq demo to prevent the GCC libraries (which use floating point registers as scratch registers) being linked in.

git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2199 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/FreeRTOSConfig.h
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/Full_Demo/main_full.c
FreeRTOS/Demo/CORTEX_A9_Zynq_ZC702/RTOSDemo/src/main.c

index acfda1d370adf7e368327bfc3c8f85382b2da159..06e049af8d4560d4c6a2450d4afd2a2d2d454d13 100644 (file)
 #define configUSE_IDLE_HOOK                                            1\r
 #define configUSE_TICK_HOOK                                            1\r
 #define configMAX_PRIORITIES                                   ( 7 )\r
-#define configMINIMAL_STACK_SIZE                               ( ( unsigned short ) 160 )\r
-#define configTOTAL_HEAP_SIZE                                  ( ( size_t ) ( 51200 ) )\r
+#define configMINIMAL_STACK_SIZE                               ( ( unsigned short ) 200 )\r
+#define configTOTAL_HEAP_SIZE                                  ( ( size_t ) ( 65536 ) )\r
 #define configMAX_TASK_NAME_LEN                                        ( 10 )\r
 #define configUSE_TRACE_FACILITY                               1\r
 #define configUSE_16_BIT_TICKS                                 0\r
index 18e359506f54d732321d4a4b60bc7d9e333bea53..7c716b6133df256026703aafe6f7681ae246e60d 100644 (file)
 #include "TimerDemo.h"\r
 #include "QueueOverwrite.h"\r
 #include "IntQueue.h"\r
+#include "EventGroupsDemo.h"\r
 \r
 /* Priorities for the demo application tasks. */\r
 #define mainSEM_TEST_PRIORITY                          ( tskIDLE_PRIORITY + 1UL )\r
@@ -243,6 +244,7 @@ void main_full( void )
        vStartMathTasks( mainFLOP_TASK_PRIORITY );\r
        vStartTimerDemoTask( mainTIMER_TEST_PERIOD );\r
        vStartQueueOverwriteTask( mainQUEUE_OVERWRITE_PRIORITY );\r
+       vStartEventGroupTasks();\r
 \r
        /* Start the tasks that implements the command console on the UART, as\r
        described above. */\r
@@ -366,6 +368,11 @@ unsigned long ulErrorFound = pdFALSE;
                        ulErrorFound = pdTRUE;\r
                }\r
 \r
+               if( xAreEventGroupTasksStillRunning() != pdPASS )\r
+               {\r
+                       ulErrorFound = pdTRUE;\r
+               }\r
+\r
                /* Check that the register test 1 task is still running. */\r
                if( ulLastRegTest1Value == ulRegTest1LoopCounter )\r
                {\r
index 02873160de913d578db84958f77e5cbed47db59c..29d160a6804bf4e9a4311cc2f99169837ad612ed 100644 (file)
  * This file implements the code that is not demo specific, including the
  * hardware setup and FreeRTOS hook functions.
  *
- * NOTE:  The full demo includes a test that checks the floating point context
- * is maintained correctly across task switches.  The standard GCC libraries can
- * use floating point registers and made this test fail (unless the tasks that
- * use the library are given a floating point context as described on the
- * documentation page for this demo).  printf-stdarg.c is included in this
- * project to prevent the standard GCC libraries being linked into the project.
+ * !!! IMPORTANT NOTE !!!
+ * The GCC libraries that ship with the Xilinx SDK make use of the floating
+ * point registers.  To avoid this causing corruption it is necessary to avoid
+ * their use.  For this reason main.c contains very basic C implementations of
+ * the standard C library functions memset(), memcpy() and memcmp(), which are
+ * are used by FreeRTOS itself.  Defining these functions in the project 
+ * prevents the linker pulling them in from the library.  Any other standard C
+ * library functions that are used by the application must likewise be defined
+ * in C.
  *
  * ENSURE TO READ THE DOCUMENTATION PAGE FOR THIS PORT AND DEMO APPLICATION ON
  * THE http://www.FreeRTOS.org WEB SITE FOR FULL INFORMATION ON USING THIS DEMO
 #include "partest.h"
 #include "TimerDemo.h"
 #include "QueueOverwrite.h"
+#include "EventGroupsDemo.h"
 
 /* Xilinx includes. */
 #include "platform.h"
 
 /* Set mainCREATE_SIMPLE_BLINKY_DEMO_ONLY to one to run the simple blinky demo,
 or 0 to run the more comprehensive test and demo application. */
-#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY     1
+#define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY     0
 
 /*-----------------------------------------------------------*/
 
@@ -158,7 +162,7 @@ int main( void )
 
        /* The mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is described at the top
        of this file. */
-       #if mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1
+       #if( mainCREATE_SIMPLE_BLINKY_DEMO_ONLY == 1 )
        {
                main_blinky();
        }
@@ -281,6 +285,59 @@ void vApplicationTickHook( void )
 
                /* Call the periodic queue overwrite from ISR demo. */
                vQueueOverwritePeriodicISRDemo();
+
+               /* Call the periodic event group from ISR demo. */
+               vPeriodicEventGroupsProcessing();
        }
        #endif
 }
+/*-----------------------------------------------------------*/
+
+void *memcpy( void *pvDest, const void *pvSource, size_t ulBytes )
+{
+unsigned char *pcDest = ( unsigned char * ) pvDest, *pcSource = ( unsigned char * ) pvSource;
+size_t x;
+
+       for( x = 0; x < ulBytes; x++ )
+       {
+               *pcDest = *pcSource;
+               pcDest++;
+               pcSource++;
+       }
+
+       return pvDest;
+}
+/*-----------------------------------------------------------*/
+
+void *memset( void *pvDest, int iValue, size_t ulBytes )
+{
+unsigned char *pcDest = ( unsigned char * ) pvDest;
+size_t x;
+
+       for( x = 0; x < ulBytes; x++ )
+       {
+               *pcDest = ( unsigned char ) c;
+               pcDest++;
+       }
+
+       return pvDest;
+}
+/*-----------------------------------------------------------*/
+
+int memcmp( const void *pvMem1, const void *pvMem2 ,size_t ulBytes )
+{
+const unsigned char *pucMem1 = pvMem1, *pucMem2 = pvMem2;
+size_t x;
+
+    for( x = 0; x < ulBytes; x++ )
+    {
+        if( pucMem1[ x ] != pucMem2[ x ] )
+        {
+            break;
+        }
+    }
+
+    return n - x;
+}
+
+