]> git.sur5r.net Git - freertos/commitdiff
Update the MSVC simulator demo to demonstrate heap_5 allocator and pdTICKS_TO_MS...
authorrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Thu, 3 Jul 2014 16:49:29 +0000 (16:49 +0000)
committerrtel <rtel@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Thu, 3 Jul 2014 16:49:29 +0000 (16:49 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2270 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

FreeRTOS/Demo/WIN32-MSVC/FreeRTOSConfig.h
FreeRTOS/Demo/WIN32-MSVC/WIN32.vcxproj
FreeRTOS/Demo/WIN32-MSVC/WIN32.vcxproj.filters
FreeRTOS/Demo/WIN32-MSVC/main.c
FreeRTOS/Demo/WIN32-MSVC/main_blinky.c

index 9d9945d1620dbbc997e2b711c4e269d82ad3fbc4..66e368e5f774c5691b77820775e5762b13e8eb27 100644 (file)
@@ -83,7 +83,7 @@
 #define configUSE_TICK_HOOK                                            1\r
 #define configTICK_RATE_HZ                                             ( 1000 ) /* In this non-real time simulated environment the tick frequency has to be at least a multiple of the Win32 tick frequency, and therefore very slow. */\r
 #define configMINIMAL_STACK_SIZE                               ( ( unsigned short ) 50 ) /* In this simulated case, the stack only has to hold one small structure as the real stack is part of the win32 thread. */\r
-#define configTOTAL_HEAP_SIZE                                  ( ( size_t ) ( 20 * 1024 ) )\r
+#define configTOTAL_HEAP_SIZE                                  ( ( size_t ) ( 21 * 1024 ) )\r
 #define configMAX_TASK_NAME_LEN                                        ( 12 )\r
 #define configUSE_TRACE_FACILITY                               1\r
 #define configUSE_16_BIT_TICKS                                 0\r
index 92d9108f122344627011a84fa13e264f5507416d..91df9d922f8e9009aac09bd98c5c9cfca83ceab8 100644 (file)
     <ClCompile Include="..\..\..\FreeRTOS-Plus\Source\FreeRTOS-Plus-Trace\trcUser.c" />\r
     <ClCompile Include="..\..\Source\croutine.c" />\r
     <ClCompile Include="..\..\Source\event_groups.c" />\r
-    <ClCompile Include="..\..\Source\portable\MemMang\heap_4.c" />\r
+    <ClCompile Include="..\..\Source\portable\MemMang\heap_5.c" />\r
     <ClCompile Include="..\..\Source\timers.c" />\r
     <ClCompile Include="..\Common\Minimal\BlockQ.c" />\r
     <ClCompile Include="..\Common\Minimal\blocktim.c" />\r
index aa37ddf85fecce74b29b1e3121289c4d2e2574c7..7d9549818e096f7bc64bd3762215ed1f2d8932dd 100644 (file)
     <ClCompile Include="Run-time-stats-utils.c">\r
       <Filter>Demo App Source</Filter>\r
     </ClCompile>\r
-    <ClCompile Include="..\..\Source\portable\MemMang\heap_4.c">\r
-      <Filter>FreeRTOS Source\Source\Portable</Filter>\r
-    </ClCompile>\r
     <ClCompile Include="..\..\Source\croutine.c">\r
       <Filter>FreeRTOS Source\Source</Filter>\r
     </ClCompile>\r
     <ClCompile Include="..\..\Source\event_groups.c">\r
       <Filter>FreeRTOS Source\Source</Filter>\r
     </ClCompile>\r
+    <ClCompile Include="..\..\Source\portable\MemMang\heap_5.c">\r
+      <Filter>FreeRTOS Source\Source\Portable</Filter>\r
+    </ClCompile>\r
   </ItemGroup>\r
   <ItemGroup>\r
     <ClInclude Include="FreeRTOSConfig.h">\r
     <ClInclude Include="..\..\Source\include\timers.h">\r
       <Filter>FreeRTOS Source\Include</Filter>\r
     </ClInclude>\r
-    <ClInclude Include="Trace_Recorder_Configuration\trcHardwarePort.h">\r
-      <Filter>Configuration Files</Filter>\r
-    </ClInclude>\r
     <ClInclude Include="Trace_Recorder_Configuration\trcConfig.h">\r
       <Filter>Configuration Files</Filter>\r
     </ClInclude>\r
index cb634f1345dd2b9c32c52e21fa38d646cf18f653..a263200c966f0b1ae31922364f09eb6d668494b6 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd. \r
+    FreeRTOS V8.0.1 - Copyright (C) 2014 Real Time Engineers Ltd.\r
     All rights reserved\r
 \r
     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
@@ -66,9 +66,9 @@
 /******************************************************************************\r
  * This project provides two demo applications.  A simple blinky style project,\r
  * and a more comprehensive test and demo application.  The\r
- * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is used to select between the two.  \r
- * The simply blinky demo is implemented and described in main_blinky.c.  The \r
- * more comprehensive test and demo application is implemented and described in \r
+ * mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is used to select between the two.\r
+ * The simply blinky demo is implemented and described in main_blinky.c.  The\r
+ * more comprehensive test and demo application is implemented and described in\r
  * main_full.c.\r
  *\r
  * This file implements the code that is not demo specific, including the\r
@@ -80,9 +80,9 @@
  * application.  It is provided as a convenient development and demonstration\r
  * test bed only.  This was tested using Windows XP on a dual core laptop.\r
  *\r
- * Windows will not be running the FreeRTOS simulator threads continuously, so \r
- * the timing information in the FreeRTOS+Trace logs have no meaningful units.  \r
- * See the documentation page for the Windows simulator for an explanation of \r
+ * Windows will not be running the FreeRTOS simulator threads continuously, so\r
+ * the timing information in the FreeRTOS+Trace logs have no meaningful units.\r
+ * See the documentation page for the Windows simulator for an explanation of\r
  * the slow timing:\r
  * http://www.freertos.org/FreeRTOS-Windows-Simulator-Emulator-for-Visual-Studio-and-Eclipse-MingW.html\r
  * - READ THE WEB DOCUMENTATION FOR THIS PORT FOR MORE INFORMATION ON USING IT -\r
 \r
 /* This project provides two demo applications.  A simple blinky style project,\r
 and a more comprehensive test and demo application.  The\r
-mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is used to select between the two.  \r
-The simply blinky demo is implemented and described in main_blinky.c.  The more \r
-comprehensive test and demo application is implemented and described in \r
+mainCREATE_SIMPLE_BLINKY_DEMO_ONLY setting is used to select between the two.\r
+The simply blinky demo is implemented and described in main_blinky.c.  The more\r
+comprehensive test and demo application is implemented and described in\r
 main_full.c. */\r
 #define mainCREATE_SIMPLE_BLINKY_DEMO_ONLY     0\r
 \r
+/* This demo uses heap_5.c, and these constants define the sizes of the regions\r
+that make up the total heap.  This is only done to provide an example of heap_5\r
+being used as this demo could easily create one large heap region instead of\r
+multiple smaller heap regions - in which case heap_4.c would be the more\r
+appropriate choice. */\r
+#define mainREGION_1_SIZE      2001\r
+#define mainREGION_2_SIZE      18005\r
+#define mainREGION_3_SIZE      1007\r
+\r
 /*\r
  * main_blinky() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 1.\r
  * main_full() is used when mainCREATE_SIMPLE_BLINKY_DEMO_ONLY is set to 0.\r
@@ -114,15 +123,28 @@ main_full.c. */
 extern void main_blinky( void );\r
 extern void main_full( void );\r
 \r
-/* Some of the RTOS hook (callback) functions only need special processing when\r
-the full demo is being used.  The simply blinky demo has no special requirements,\r
-so these functions are called from the hook functions defined in this file, but\r
-are defined in main_full.c. */\r
+/*\r
+ * Some of the RTOS hook (callback) functions only need special processing when\r
+ * the full demo is being used.  The simply blinky demo has no special\r
+ * requirements, so these functions are called from the hook functions defined\r
+ * in this file, but are defined in main_full.c.\r
+ */\r
 void vFullDemoTickHookFunction( void );\r
 void vFullDemoIdleFunction( void );\r
 \r
-/* Prototypes for the standard FreeRTOS callback/hook functions implemented\r
-within this file. */\r
+/*\r
+ * This demo uses heap_5.c, so start by defining some heap regions.  This is\r
+ * only done to provide an example as this demo could easily create one large\r
+ * heap region instead of multiple smaller heap regions - in which case heap_4.c\r
+ * would be the more appropriate choice.  No initialisation is required when\r
+ * heap_4.c is used.\r
+ */\r
+static void  prvInitialiseHeap( void );\r
+\r
+/*\r
+ * Prototypes for the standard FreeRTOS callback/hook functions implemented\r
+ * within this file.\r
+ */\r
 void vApplicationMallocFailedHook( void );\r
 void vApplicationIdleHook( void );\r
 void vApplicationStackOverflowHook( TaskHandle_t pxTask, char *pcTaskName );\r
@@ -145,6 +167,13 @@ static portBASE_TYPE xTraceRunning = pdTRUE;
 \r
 int main( void )\r
 {\r
+       /* This demo uses heap_5.c, so start by defining some heap regions.  This\r
+       is only done to provide an example as this demo could easily create one\r
+       large heap region instead of multiple smaller heap regions - in which case\r
+       heap_4.c would be the more appropriate choice.  No initialisation is\r
+       required when heap_4.c is used. */\r
+       prvInitialiseHeap();\r
+\r
        /* Initialise the trace recorder and create the label used to post user\r
        events to the trace recording on each tick interrupt. */\r
        vTraceInitTraceData();\r
@@ -199,10 +228,10 @@ void vApplicationIdleHook( void )
        function, because it is the responsibility of the idle task to clean up\r
        memory allocated by the kernel to any task that has since been deleted. */\r
 \r
-       /* Uncomment the following code to allow the trace to be stopped with any \r
+       /* Uncomment the following code to allow the trace to be stopped with any\r
        key press.  The code is commented out by default as the kbhit() function\r
        interferes with the run time behaviour. */\r
-       /* \r
+       /*\r
                if( _kbhit() != pdFALSE )\r
                {\r
                        if( xTraceRunning == pdTRUE )\r
@@ -250,10 +279,10 @@ void vApplicationTickHook( void )
        }\r
        #endif /* mainCREATE_SIMPLE_BLINKY_DEMO_ONLY */\r
 \r
-       /* Write a user event to the trace log.  \r
+       /* Write a user event to the trace log.\r
        Note tick events will not appear in the trace recording with regular period\r
        because this project runs in a Windows simulator, and does not therefore\r
-       exhibit deterministic behaviour.  Windows will run the simulator in \r
+       exhibit deterministic behaviour.  Windows will run the simulator in\r
        bursts. */\r
        vTraceUserEvent( xTickTraceUserEvent );\r
 }\r
@@ -311,3 +340,33 @@ FILE* pxOutputFile;
                printf( "\r\nFailed to create trace dump file\r\n" );\r
        }\r
 }\r
+/*-----------------------------------------------------------*/\r
+\r
+static void  prvInitialiseHeap( void )\r
+{\r
+/* This demo uses heap_5.c, so start by defining some heap regions.  This is\r
+only done to provide an example as this demo could easily create one large heap\r
+region instead of multiple smaller heap regions - in which case heap_4.c would\r
+be the more appropriate choice.  No initialisation is required when heap_4.c is\r
+used.  The xHeapRegions structure requires the regions to be defined in order,\r
+so this just creates one big array, then populates the structure with offsets\r
+into the array - with gaps in between and messy alignment just for test\r
+purposes. */\r
+static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];\r
+volatile uint32_t ulAdditionalOffset = 19; /* Just to prevent 'condition is always true' warnings in configASSERT(). */\r
+const HeapRegion_t xHeapRegions[] =\r
+{\r
+       /* Start address with dummy offsets                                             Size */\r
+       { ucHeap + 1,                                                                                   mainREGION_1_SIZE },\r
+       { ucHeap + 15 + mainREGION_1_SIZE,                                              mainREGION_2_SIZE },\r
+       { ucHeap + 19 + mainREGION_1_SIZE + mainREGION_2_SIZE,  mainREGION_3_SIZE },\r
+       { NULL, 0 }\r
+};\r
+\r
+       /* Sanity check that the sizes and offsets defined actually fit into the\r
+       array. */\r
+       configASSERT( ( ulAdditionalOffset + mainREGION_1_SIZE + mainREGION_2_SIZE + mainREGION_3_SIZE ) < configTOTAL_HEAP_SIZE );\r
+\r
+       vPortDefineHeapRegions( xHeapRegions );\r
+}\r
+\r
index 246e7b9f5a1b5c643280bcc99e8ef25ab0bed9e3..d5576ed512d3b932bcc41b5a5cb09905a8c29d24 100644 (file)
 \r
 /* The rate at which data is sent to the queue.  The 200ms value is converted\r
 to ticks using the portTICK_PERIOD_MS constant. */\r
-#define mainQUEUE_SEND_FREQUENCY_MS                    ( 200 / portTICK_PERIOD_MS )\r
+#define mainQUEUE_SEND_FREQUENCY_MS                    ( 200 )\r
 \r
 /* The number of items the queue can hold.  This is 1 as the receive task\r
 will remove items as they are added, meaning the send task should always find\r
@@ -190,6 +190,7 @@ static void prvQueueSendTask( void *pvParameters )
 {\r
 TickType_t xNextWakeTime;\r
 const unsigned long ulValueToSend = 100UL;\r
+const TickType_t xBlockTime = pdMS_TO_TICKS( mainQUEUE_SEND_FREQUENCY_MS );\r
 \r
        /* Remove compiler warning in the case that configASSERT() is not\r
        defined. */\r
@@ -207,7 +208,7 @@ const unsigned long ulValueToSend = 100UL;
                The block time is specified in ticks, the constant used converts ticks\r
                to ms.  While in the Blocked state this task will not consume any CPU\r
                time. */\r
-               vTaskDelayUntil( &xNextWakeTime, mainQUEUE_SEND_FREQUENCY_MS );\r
+               vTaskDelayUntil( &xNextWakeTime, xBlockTime );\r
 \r
                /* Send to the queue - causing the queue receive task to unblock and\r
                toggle the LED.  0 is used as the block time so the sending operation\r