]> rtime.felk.cvut.cz Git - pes-rpp/rpp-test-sw.git/blob - rpp/lib/os/7.0.2_tms570/src/os/list.c
Yet another place to fix
[pes-rpp/rpp-test-sw.git] / rpp / lib / os / 7.0.2_tms570 / src / os / list.c
1 /*
2     FreeRTOS V7.0.2 - Copyright (C) 2011 Real Time Engineers Ltd.
3
4
5     ***************************************************************************
6      *                                                                       *
7      *    FreeRTOS tutorial books are available in pdf and paperback.        *
8      *    Complete, revised, and edited pdf reference manuals are also       *
9      *    available.                                                         *
10      *                                                                       *
11      *    Purchasing FreeRTOS documentation will not only help you, by       *
12      *    ensuring you get running as quickly as possible and with an        *
13      *    in-depth knowledge of how to use FreeRTOS, it will also help       *
14      *    the FreeRTOS project to continue with its mission of providing     *
15      *    professional grade, cross platform, de facto standard solutions    *
16      *    for microcontrollers - completely free of charge!                  *
17      *                                                                       *
18      *    >>> See http://www.FreeRTOS.org/Documentation for details. <<<     *
19      *                                                                       *
20      *    Thank you for using FreeRTOS, and thank you for your support!      *
21      *                                                                       *
22     ***************************************************************************
23
24
25     This file is part of the FreeRTOS distribution.
26
27     FreeRTOS is free software; you can redistribute it and/or modify it under
28     the terms of the GNU General Public License (version 2) as published by the
29     Free Software Foundation AND MODIFIED BY the FreeRTOS exception.
30     >>>NOTE<<< The modification to the GPL is included to allow you to
31     distribute a combined work that includes FreeRTOS without being obliged to
32     provide the source code for proprietary components outside of the FreeRTOS
33     kernel.  FreeRTOS is distributed in the hope that it will be useful, but
34     WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
35     or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
36     more details. You should have received a copy of the GNU General Public
37     License and the FreeRTOS license exception along with FreeRTOS; if not it
38     can be viewed here: http://www.freertos.org/a00114.html and also obtained
39     by writing to Richard Barry, contact details for whom are available on the
40     FreeRTOS WEB site.
41
42     1 tab == 4 spaces!
43
44     http://www.FreeRTOS.org - Documentation, latest information, license and
45     contact details.
46
47     http://www.SafeRTOS.com - A version that is certified for use in safety
48     critical systems.
49
50     http://www.OpenRTOS.com - Commercial support, development, porting,
51     licensing and training services.
52 */
53
54
55 #include <stdlib.h>
56 #include "os/FreeRTOS.h"
57 #include "os/list.h"
58
59 /*-----------------------------------------------------------
60  * PUBLIC LIST API documented in list.h
61  *----------------------------------------------------------*/
62
63 void vListInitialise( xList *pxList )
64 {
65     /* The list structure contains a list item which is used to mark the
66     end of the list.  To initialise the list the list end is inserted
67     as the only list entry. */
68     pxList->pxIndex = ( xListItem * ) &( pxList->xListEnd );
69
70     /* The list end value is the highest possible value in the list to
71     ensure it remains at the end of the list. */
72     pxList->xListEnd.xItemValue = portMAX_DELAY;
73
74     /* The list end next and previous pointers point to itself so we know
75     when the list is empty. */
76     pxList->xListEnd.pxNext = ( xListItem * ) &( pxList->xListEnd );
77     pxList->xListEnd.pxPrevious = ( xListItem * ) &( pxList->xListEnd );
78
79     pxList->uxNumberOfItems = ( unsigned portBASE_TYPE ) 0U;
80 }
81 /*-----------------------------------------------------------*/
82
83 void vListInitialiseItem( xListItem *pxItem )
84 {
85     /* Make sure the list item is not recorded as being on a list. */
86     pxItem->pvContainer = NULL;
87 }
88 /*-----------------------------------------------------------*/
89
90 void vListInsertEnd( xList *pxList, xListItem *pxNewListItem )
91 {
92 volatile xListItem * pxIndex;
93
94     /* Insert a new list item into pxList, but rather than sort the list,
95     makes the new list item the last item to be removed by a call to
96     pvListGetOwnerOfNextEntry.  This means it has to be the item pointed to by
97     the pxIndex member. */
98     pxIndex = pxList->pxIndex;
99
100     pxNewListItem->pxNext = pxIndex->pxNext;
101     pxNewListItem->pxPrevious = pxList->pxIndex;
102     pxIndex->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;
103     pxIndex->pxNext = ( volatile xListItem * ) pxNewListItem;
104     pxList->pxIndex = ( volatile xListItem * ) pxNewListItem;
105
106     /* Remember which list the item is in. */
107     pxNewListItem->pvContainer = ( void * ) pxList;
108
109     ( pxList->uxNumberOfItems )++;
110 }
111 /*-----------------------------------------------------------*/
112
113 void vListInsert( xList *pxList, xListItem *pxNewListItem )
114 {
115 volatile xListItem *pxIterator;
116 portTickType xValueOfInsertion;
117
118     /* Insert the new list item into the list, sorted in ulListItem order. */
119     xValueOfInsertion = pxNewListItem->xItemValue;
120
121     /* If the list already contains a list item with the same item value then
122     the new list item should be placed after it.  This ensures that TCB's which
123     are stored in ready lists (all of which have the same ulListItem value)
124     get an equal share of the CPU.  However, if the xItemValue is the same as
125     the back marker the iteration loop below will not end.  This means we need
126     to guard against this by checking the value first and modifying the
127     algorithm slightly if necessary. */
128     if( xValueOfInsertion == portMAX_DELAY )
129     {
130         pxIterator = pxList->xListEnd.pxPrevious;
131     }
132     else
133     {
134         /* *** NOTE ***********************************************************
135         If you find your application is crashing here then likely causes are:
136             1) Stack overflow -
137                see http://www.freertos.org/Stacks-and-stack-overflow-checking.html
138             2) Incorrect interrupt priority assignment, especially on Cortex-M3
139                parts where numerically high priority values denote low actual
140                interrupt priories, which can seem counter intuitive.  See
141                configMAX_SYSCALL_INTERRUPT_PRIORITY on http://www.freertos.org/a00110.html
142             3) Calling an API function from within a critical section or when
143                the scheduler is suspended.
144             4) Using a queue or semaphore before it has been initialised or
145                before the scheduler has been started (are interrupts firing
146                before vTaskStartScheduler() has been called?).
147         See http://www.freertos.org/FAQHelp.html for more tips.
148         **********************************************************************/
149
150         for( pxIterator = ( xListItem * ) &( pxList->xListEnd ); pxIterator->pxNext->xItemValue <= xValueOfInsertion; pxIterator = pxIterator->pxNext )
151         {
152             /* There is nothing to do here, we are just iterating to the
153             wanted insertion position. */
154         }
155     }
156
157     pxNewListItem->pxNext = pxIterator->pxNext;
158     pxNewListItem->pxNext->pxPrevious = ( volatile xListItem * ) pxNewListItem;
159     pxNewListItem->pxPrevious = pxIterator;
160     pxIterator->pxNext = ( volatile xListItem * ) pxNewListItem;
161
162     /* Remember which list the item is in.  This allows fast removal of the
163     item later. */
164     pxNewListItem->pvContainer = ( void * ) pxList;
165
166     ( pxList->uxNumberOfItems )++;
167 }
168 /*-----------------------------------------------------------*/
169
170 void vListRemove( xListItem *pxItemToRemove )
171 {
172 xList * pxList;
173
174     pxItemToRemove->pxNext->pxPrevious = pxItemToRemove->pxPrevious;
175     pxItemToRemove->pxPrevious->pxNext = pxItemToRemove->pxNext;
176
177     /* The list item knows which list it is in.  Obtain the list from the list
178     item. */
179     pxList = ( xList * ) pxItemToRemove->pvContainer;
180
181     /* Make sure the index is left pointing to a valid item. */
182     if( pxList->pxIndex == pxItemToRemove )
183     {
184         pxList->pxIndex = pxItemToRemove->pxPrevious;
185     }
186
187     pxItemToRemove->pvContainer = NULL;
188     ( pxList->uxNumberOfItems )--;
189 }
190 /*-----------------------------------------------------------*/
191