]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/Common/Minimal/blocktim.c
Update version number in readiness for V10.3.0 release. Sync SVN with reviewed releas...
[freertos] / FreeRTOS / Demo / Common / Minimal / blocktim.c
index 068ea5965ce48a5fa4f1142969d2f0b3700a5b5f..92282fe26bdb7c75bccc395ff4a668c6f9a89835 100644 (file)
@@ -1,71 +1,29 @@
 /*\r
-    FreeRTOS V8.2.2 - Copyright (C) 2015 Real Time Engineers Ltd.\r
-    All rights reserved\r
-\r
-    VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
-\r
-    This file is part of the FreeRTOS distribution.\r
-\r
-    FreeRTOS is free software; you can redistribute it and/or modify it under\r
-    the terms of the GNU General Public License (version 2) as published by the\r
-    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.\r
-\r
-    ***************************************************************************\r
-    >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
-    >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
-    >>!   obliged to provide the source code for proprietary components     !<<\r
-    >>!   outside of the FreeRTOS kernel.                                   !<<\r
-    ***************************************************************************\r
-\r
-    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
-    WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
-    FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
-    link: http://www.freertos.org/a00114.html\r
-\r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *    FreeRTOS provides completely free yet professionally developed,    *\r
-     *    robust, strictly quality controlled, supported, and cross          *\r
-     *    platform software that is more than just the market leader, it     *\r
-     *    is the industry's de facto standard.                               *\r
-     *                                                                       *\r
-     *    Help yourself get started quickly while simultaneously helping     *\r
-     *    to support the FreeRTOS project by purchasing a FreeRTOS           *\r
-     *    tutorial book, reference manual, or both:                          *\r
-     *    http://www.FreeRTOS.org/Documentation                              *\r
-     *                                                                       *\r
-    ***************************************************************************\r
-\r
-    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading\r
-    the FAQ page "My application does not run, what could be wrong?".  Have you\r
-    defined configASSERT()?\r
-\r
-    http://www.FreeRTOS.org/support - In return for receiving this top quality\r
-    embedded software for free we request you assist our global community by\r
-    participating in the support forum.\r
-\r
-    http://www.FreeRTOS.org/training - Investing in training allows your team to\r
-    be as productive as possible as early as possible.  Now you can receive\r
-    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
-    Ltd, and the world's leading authority on the world's leading RTOS.\r
-\r
-    http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
-    including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
-    compatible FAT file system, and our tiny thread aware UDP/IP stack.\r
-\r
-    http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
-    Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
-\r
-    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High\r
-    Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
-    licenses offer ticketed support, indemnification and commercial middleware.\r
-\r
-    http://www.SafeRTOS.com - High Integrity Systems also provide a safety\r
-    engineered and independently SIL3 certified version for use in safety and\r
-    mission critical applications that require provable dependability.\r
-\r
-    1 tab == 4 spaces!\r
-*/\r
+ * FreeRTOS Kernel V10.3.0\r
+ * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.\r
+ *\r
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of\r
+ * this software and associated documentation files (the "Software"), to deal in\r
+ * the Software without restriction, including without limitation the rights to\r
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of\r
+ * the Software, and to permit persons to whom the Software is furnished to do so,\r
+ * subject to the following conditions:\r
+ *\r
+ * The above copyright notice and this permission notice shall be included in all\r
+ * copies or substantial portions of the Software.\r
+ *\r
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS\r
+ * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR\r
+ * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER\r
+ * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN\r
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\r
+ *\r
+ * http://www.FreeRTOS.org\r
+ * http://aws.amazon.com/freertos\r
+ *\r
+ * 1 tab == 4 spaces!\r
+ */\r
 \r
 /*\r
  * This file contains some test scenarios that ensure tasks do not exit queue\r
@@ -81,7 +39,7 @@
 /* Demo includes. */\r
 #include "blocktim.h"\r
 \r
-/* Task priorities.  Allow these to be overridden. */\r
+/* Task priorities and stack sizes.  Allow these to be overridden. */\r
 #ifndef bktPRIMARY_PRIORITY\r
        #define bktPRIMARY_PRIORITY             ( configMAX_PRIORITIES - 3 )\r
 #endif\r
        #define bktSECONDARY_PRIORITY   ( configMAX_PRIORITIES - 4 )\r
 #endif\r
 \r
+#ifndef bktBLOCK_TIME_TASK_STACK_SIZE\r
+       #define bktBLOCK_TIME_TASK_STACK_SIZE configMINIMAL_STACK_SIZE\r
+#endif\r
+\r
 /* Task behaviour. */\r
 #define bktQUEUE_LENGTH                                ( 5 )\r
-#define bktSHORT_WAIT                          ( ( ( TickType_t ) 20 ) / portTICK_PERIOD_MS )\r
+#define bktSHORT_WAIT                          pdMS_TO_TICKS( ( TickType_t ) 20 )\r
 #define bktPRIMARY_BLOCK_TIME          ( 10 )\r
 #define bktALLOWABLE_MARGIN                    ( 15 )\r
 #define bktTIME_TO_BLOCK                       ( 175 )\r
 #define bktDONT_BLOCK                          ( ( TickType_t ) 0 )\r
 #define bktRUN_INDICATOR                       ( ( UBaseType_t ) 0x55 )\r
 \r
+/* In case the demo does not have software timers enabled, as this file uses\r
+the configTIMER_TASK_PRIORITY setting. */\r
+#ifndef configTIMER_TASK_PRIORITY\r
+       #define configTIMER_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )\r
+#endif\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
+/*\r
+ * The two test tasks.  Their behaviour is commented within the functions.\r
+ */\r
+static void vPrimaryBlockTimeTestTask( void *pvParameters );\r
+static void vSecondaryBlockTimeTestTask( void *pvParameters );\r
+\r
+/*\r
+ * Very basic tests to verify the block times are as expected.\r
+ */\r
+static void prvBasicDelayTests( void );\r
+\r
+/*-----------------------------------------------------------*/\r
+\r
 /* The queue on which the tasks block. */\r
 static QueueHandle_t xTestQueue;\r
 \r
@@ -114,28 +97,27 @@ static volatile BaseType_t xErrorOccurred = pdFALSE;
 secondary task has executed. */\r
 static volatile UBaseType_t xRunIndicator;\r
 \r
-/* The two test tasks.  Their behaviour is commented within the files. */\r
-static void vPrimaryBlockTimeTestTask( void *pvParameters );\r
-static void vSecondaryBlockTimeTestTask( void *pvParameters );\r
-\r
 /*-----------------------------------------------------------*/\r
 \r
 void vCreateBlockTimeTasks( void )\r
 {\r
        /* Create the queue on which the two tasks block. */\r
-    xTestQueue = xQueueCreate( bktQUEUE_LENGTH, sizeof( BaseType_t ) );\r
-\r
-       /* vQueueAddToRegistry() adds the queue to the queue registry, if one is\r
-       in use.  The queue registry is provided as a means for kernel aware\r
-       debuggers to locate queues and has no purpose if a kernel aware debugger\r
-       is not being used.  The call to vQueueAddToRegistry() will be removed\r
-       by the pre-processor if configQUEUE_REGISTRY_SIZE is not defined or is\r
-       defined to be less than 1. */\r
-       vQueueAddToRegistry( xTestQueue, "Block_Time_Queue" );\r
-\r
-       /* Create the two test tasks. */\r
-       xTaskCreate( vPrimaryBlockTimeTestTask, "BTest1", configMINIMAL_STACK_SIZE, NULL, bktPRIMARY_PRIORITY, NULL );\r
-       xTaskCreate( vSecondaryBlockTimeTestTask, "BTest2", configMINIMAL_STACK_SIZE, NULL, bktSECONDARY_PRIORITY, &xSecondary );\r
+       xTestQueue = xQueueCreate( bktQUEUE_LENGTH, sizeof( BaseType_t ) );\r
+\r
+       if( xTestQueue != NULL )\r
+       {\r
+               /* vQueueAddToRegistry() adds the queue to the queue registry, if one\r
+               is in use.  The queue registry is provided as a means for kernel aware\r
+               debuggers to locate queues and has no purpose if a kernel aware\r
+               debugger is not being used.  The call to vQueueAddToRegistry() will be\r
+               removed by the pre-processor if configQUEUE_REGISTRY_SIZE is not\r
+               defined or is defined to be less than 1. */\r
+               vQueueAddToRegistry( xTestQueue, "Block_Time_Queue" );\r
+\r
+               /* Create the two test tasks. */\r
+               xTaskCreate( vPrimaryBlockTimeTestTask, "BTest1", bktBLOCK_TIME_TASK_STACK_SIZE, NULL, bktPRIMARY_PRIORITY, NULL );\r
+               xTaskCreate( vSecondaryBlockTimeTestTask, "BTest2", bktBLOCK_TIME_TASK_STACK_SIZE, NULL, bktSECONDARY_PRIORITY, &xSecondary );\r
+       }\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -150,9 +132,16 @@ TickType_t xTimeToBlock, xBlockedTime;
        for( ;; )\r
        {\r
                /*********************************************************************\r
-        Test 1\r
+               Test 0\r
 \r
-        Simple block time wakeup test on queue receives. */\r
+               Basic vTaskDelay() and vTaskDelayUntil() tests. */\r
+               prvBasicDelayTests();\r
+\r
+\r
+               /*********************************************************************\r
+               Test 1\r
+\r
+               Simple block time wakeup test on queue receives. */\r
                for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )\r
                {\r
                        /* The queue is empty. Attempt to read from the queue using a block\r
@@ -187,9 +176,9 @@ TickType_t xTimeToBlock, xBlockedTime;
                }\r
 \r
                /*********************************************************************\r
-        Test 2\r
+               Test 2\r
 \r
-        Simple block time wakeup test on queue sends.\r
+               Simple block time wakeup test on queue sends.\r
 \r
                First fill the queue.  It should be empty so all sends should pass. */\r
                for( xItem = 0; xItem < bktQUEUE_LENGTH; xItem++ )\r
@@ -238,7 +227,7 @@ TickType_t xTimeToBlock, xBlockedTime;
                }\r
 \r
                /*********************************************************************\r
-        Test 3\r
+               Test 3\r
 \r
                Wake the other task, it will block attempting to post to the queue.\r
                When we read from the queue the other task will wake, but before it\r
@@ -313,7 +302,7 @@ TickType_t xTimeToBlock, xBlockedTime;
 \r
 \r
                /*********************************************************************\r
-        Test 4\r
+               Test 4\r
 \r
                As per test 3 - but with the send and receive the other way around.\r
                The other task blocks attempting to read from the queue.\r
@@ -400,21 +389,21 @@ BaseType_t xData;
        for( ;; )\r
        {\r
                /*********************************************************************\r
-        Test 1 and 2\r
+               Test 0, 1 and 2\r
 \r
-               This task does does not participate in these tests. */\r
+               This task does not participate in these tests. */\r
                vTaskSuspend( NULL );\r
 \r
                /*********************************************************************\r
-        Test 3\r
+               Test 3\r
 \r
                The first thing we do is attempt to read from the queue.  It should be\r
                full so we block.  Note the time before we block so we can check the\r
                wake time is as per that expected. */\r
                xTimeWhenBlocking = xTaskGetTickCount();\r
 \r
-               /* We should unblock after bktTIME_TO_BLOCK having not sent\r
-               anything to the queue. */\r
+               /* We should unblock after bktTIME_TO_BLOCK having not sent anything to\r
+               the queue. */\r
                xData = 0;\r
                xRunIndicator = bktRUN_INDICATOR;\r
                if( xQueueSend( xTestQueue, &xData, bktTIME_TO_BLOCK ) != errQUEUE_FULL )\r
@@ -480,6 +469,53 @@ BaseType_t xData;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+static void prvBasicDelayTests( void )\r
+{\r
+TickType_t xPreTime, xPostTime, x, xLastUnblockTime, xExpectedUnblockTime;\r
+const TickType_t xPeriod = 75, xCycles = 5, xAllowableMargin = ( bktALLOWABLE_MARGIN >> 1 );\r
+\r
+       /* Temporarily increase priority so the timing is more accurate, but not so\r
+       high as to disrupt the timer tests. */\r
+       vTaskPrioritySet( NULL, configTIMER_TASK_PRIORITY - 1 );\r
+\r
+       /* Crude check to too see that vTaskDelay() blocks for the expected\r
+       period. */\r
+       xPreTime = xTaskGetTickCount();\r
+       vTaskDelay( bktTIME_TO_BLOCK );\r
+       xPostTime = xTaskGetTickCount();\r
+\r
+       /* The priority is higher, so the allowable margin is halved when compared\r
+       to the other tests in this file. */\r
+       if( ( xPostTime - xPreTime ) > ( bktTIME_TO_BLOCK + xAllowableMargin ) )\r
+       {\r
+               xErrorOccurred = pdTRUE;\r
+       }\r
+\r
+       /* Now crude tests to check the vTaskDelayUntil() functionality. */\r
+       xPostTime = xTaskGetTickCount();\r
+       xLastUnblockTime = xPostTime;\r
+\r
+       for( x = 0; x < xCycles; x++ )\r
+       {\r
+               /* Calculate the next expected unblock time from the time taken before\r
+               this loop was entered. */\r
+               xExpectedUnblockTime = xPostTime + ( x * xPeriod );\r
+\r
+               vTaskDelayUntil( &xLastUnblockTime, xPeriod );\r
+\r
+               if( ( xTaskGetTickCount() - xExpectedUnblockTime ) > ( bktTIME_TO_BLOCK + xAllowableMargin ) )\r
+               {\r
+                       xErrorOccurred = pdTRUE;\r
+               }\r
+\r
+               xPrimaryCycles++;\r
+       }\r
+\r
+       /* Reset to the original task priority ready for the other tests. */\r
+       vTaskPrioritySet( NULL, bktPRIMARY_PRIORITY );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
 BaseType_t xAreBlockTimeTestTasksStillRunning( void )\r
 {\r
 static BaseType_t xLastPrimaryCycleCount = 0, xLastSecondaryCycleCount = 0;\r