]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/list.c
If tickless idle mode is in use then ensure prvResetNextTaskUnblockTime() is called...
[freertos] / FreeRTOS / Source / list.c
index d256fae4c68d56600d62b7da667664e0f18d05ae..9875b90c93fe83aedfb559f4e9c5935dfa2f16b5 100644 (file)
@@ -1,67 +1,29 @@
 /*\r
-    FreeRTOS V8.1.2 - 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
-\r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *    FreeRTOS provides completely free yet professionally developed,    *\r
-     *    robust, strictly quality controlled, supported, and cross          *\r
-     *    platform software that has become a de facto standard.             *\r
-     *                                                                       *\r
-     *    Help yourself get started quickly and support the FreeRTOS         *\r
-     *    project by purchasing a FreeRTOS tutorial book, reference          *\r
-     *    manual, or both from: http://www.FreeRTOS.org/Documentation        *\r
-     *                                                                       *\r
-     *    Thank you!                                                         *\r
-     *                                                                       *\r
-    ***************************************************************************\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
-    >>!   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
-    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 from the following\r
-    link: http://www.freertos.org/a00114.html\r
-\r
-    1 tab == 4 spaces!\r
-\r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *    Having a problem?  Start by reading the FAQ "My application does   *\r
-     *    not run, what could be wrong?"                                     *\r
-     *                                                                       *\r
-     *    http://www.FreeRTOS.org/FAQHelp.html                               *\r
-     *                                                                       *\r
-    ***************************************************************************\r
-\r
-    http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
-    license and Real Time Engineers Ltd. contact details.\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.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
-    Integrity Systems to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
-    licenses offer ticketed support, indemnification and 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.2.1\r
+ * Copyright (C) 2019 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
 #include <stdlib.h>\r
@@ -77,7 +39,7 @@ void vListInitialise( List_t * const pxList )
        /* The list structure contains a list item which is used to mark the\r
        end of the list.  To initialise the list the list end is inserted\r
        as the only list entry. */\r
-       pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );                       /*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is checked and valid. */\r
+       pxList->pxIndex = ( ListItem_t * ) &( pxList->xListEnd );                       /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. */\r
 \r
        /* The list end value is the highest possible value in the list to\r
        ensure it remains at the end of the list. */\r
@@ -85,8 +47,8 @@ void vListInitialise( List_t * const pxList )
 \r
        /* The list end next and previous pointers point to itself so we know\r
        when the list is empty. */\r
-       pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );       /*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is checked and valid. */\r
-       pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is checked and valid. */\r
+       pxList->xListEnd.pxNext = ( ListItem_t * ) &( pxList->xListEnd );       /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. */\r
+       pxList->xListEnd.pxPrevious = ( ListItem_t * ) &( pxList->xListEnd );/*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. */\r
 \r
        pxList->uxNumberOfItems = ( UBaseType_t ) 0U;\r
 \r
@@ -100,12 +62,12 @@ void vListInitialise( List_t * const pxList )
 void vListInitialiseItem( ListItem_t * const pxItem )\r
 {\r
        /* Make sure the list item is not recorded as being on a list. */\r
-       pxItem->pvContainer = NULL;\r
+       pxItem->pxContainer = NULL;\r
 \r
        /* Write known values into the list item if\r
        configUSE_LIST_DATA_INTEGRITY_CHECK_BYTES is set to 1. */\r
-       listSET_LIST_ITEM_INTEGRITY_CHECK_1_VALUE( pxItem );\r
-       listSET_LIST_ITEM_INTEGRITY_CHECK_2_VALUE( pxItem );\r
+       listSET_FIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );\r
+       listSET_SECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE( pxItem );\r
 }\r
 /*-----------------------------------------------------------*/\r
 \r
@@ -124,11 +86,15 @@ ListItem_t * const pxIndex = pxList->pxIndex;
        listGET_OWNER_OF_NEXT_ENTRY(). */\r
        pxNewListItem->pxNext = pxIndex;\r
        pxNewListItem->pxPrevious = pxIndex->pxPrevious;\r
+\r
+       /* Only used during decision coverage testing. */\r
+       mtCOVERAGE_TEST_DELAY();\r
+\r
        pxIndex->pxPrevious->pxNext = pxNewListItem;\r
        pxIndex->pxPrevious = pxNewListItem;\r
 \r
        /* Remember which list the item is in. */\r
-       pxNewListItem->pvContainer = ( void * ) pxList;\r
+       pxNewListItem->pxContainer = pxList;\r
 \r
        ( pxList->uxNumberOfItems )++;\r
 }\r
@@ -148,7 +114,7 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
        /* Insert the new list item into the list, sorted in xItemValue order.\r
 \r
        If the list already contains a list item with the same item value then the\r
-       new list item should be placed after it.  This ensures that TCB's which are\r
+       new list item should be placed after it.  This ensures that TCBs which are\r
        stored in ready lists (all of which have the same xItemValue value) get a\r
        share of the CPU.  However, if the xItemValue is the same as the back marker\r
        the iteration loop below will not end.  Therefore the value is checked\r
@@ -161,18 +127,18 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
        {\r
                /* *** NOTE ***********************************************************\r
                If you find your application is crashing here then likely causes are\r
-               listed below.  In addition see http://www.freertos.org/FAQHelp.html for\r
+               listed below.  In addition see https://www.freertos.org/FAQHelp.html for\r
                more tips, and ensure configASSERT() is defined!\r
-               http://www.freertos.org/a00110.html#configASSERT\r
+               https://www.freertos.org/a00110.html#configASSERT\r
 \r
                        1) Stack overflow -\r
-                          see http://www.freertos.org/Stacks-and-stack-overflow-checking.html\r
+                          see https://www.freertos.org/Stacks-and-stack-overflow-checking.html\r
                        2) Incorrect interrupt priority assignment, especially on Cortex-M\r
                           parts where numerically high priority values denote low actual\r
                           interrupt priorities, which can seem counter intuitive.  See\r
-                          http://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition\r
+                          https://www.freertos.org/RTOS-Cortex-M3-M4.html and the definition\r
                           of configMAX_SYSCALL_INTERRUPT_PRIORITY on\r
-                          http://www.freertos.org/a00110.html\r
+                          https://www.freertos.org/a00110.html\r
                        3) Calling an API function from within a critical section or when\r
                           the scheduler is suspended, or calling an API function that does\r
                           not end in "FromISR" from an interrupt.\r
@@ -181,7 +147,7 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
                           before vTaskStartScheduler() has been called?).\r
                **********************************************************************/\r
 \r
-               for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 The mini list structure is used as the list end to save RAM.  This is checked and valid. */\r
+               for( pxIterator = ( ListItem_t * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext ) /*lint !e826 !e740 !e9087 The mini list structure is used as the list end to save RAM.  This is checked and valid. *//*lint !e440 The iterator moves to a different value, not xValueOfInsertion. */\r
                {\r
                        /* There is nothing to do here, just iterating to the wanted\r
                        insertion position. */\r
@@ -195,7 +161,7 @@ const TickType_t xValueOfInsertion = pxNewListItem->xItemValue;
 \r
        /* Remember which list the item is in.  This allows fast removal of the\r
        item later. */\r
-       pxNewListItem->pvContainer = ( void * ) pxList;\r
+       pxNewListItem->pxContainer = pxList;\r
 \r
        ( pxList->uxNumberOfItems )++;\r
 }\r
@@ -205,11 +171,14 @@ UBaseType_t uxListRemove( ListItem_t * const pxItemToRemove )
 {\r
 /* The list item knows which list it is in.  Obtain the list from the list\r
 item. */\r
-List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;\r
+List_t * const pxList = pxItemToRemove->pxContainer;\r
 \r
        pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;\r
        pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;\r
 \r
+       /* Only used during decision coverage testing. */\r
+       mtCOVERAGE_TEST_DELAY();\r
+\r
        /* Make sure the index is left pointing to a valid item. */\r
        if( pxList->pxIndex == pxItemToRemove )\r
        {\r
@@ -220,7 +189,7 @@ List_t * const pxList = ( List_t * ) pxItemToRemove->pvContainer;
                mtCOVERAGE_TEST_MARKER();\r
        }\r
 \r
-       pxItemToRemove->pvContainer = NULL;\r
+       pxItemToRemove->pxContainer = NULL;\r
        ( pxList->uxNumberOfItems )--;\r
 \r
        return pxList->uxNumberOfItems;\r