2013-04-05 22:46:56 +02:00
/*
2014-06-10 19:42:11 +02:00
FreeRTOS V8 .0 .1 - Copyright ( C ) 2014 Real Time Engineers Ltd .
2014-03-23 18:44:06 +01:00
All rights reserved
2013-04-05 22:46:56 +02:00
2013-09-05 05:26:23 +02:00
VISIT http : //www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
2013-04-05 22:46:56 +02:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
2013-09-05 05:26:23 +02:00
* FreeRTOS provides completely free yet professionally developed , *
* robust , strictly quality controlled , supported , and cross *
* platform software that has become a de facto standard . *
2013-04-05 22:46:56 +02:00
* *
2013-09-05 05:26:23 +02:00
* Help yourself get started quickly and support the FreeRTOS *
* project by purchasing a FreeRTOS tutorial book , reference *
* manual , or both from : http : //www.FreeRTOS.org/Documentation *
2013-04-05 22:46:56 +02:00
* *
2013-09-05 05:26:23 +02:00
* Thank you ! *
2013-04-05 22:46:56 +02:00
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
This file is part of the FreeRTOS distribution .
FreeRTOS is free software ; you can redistribute it and / or modify it under
the terms of the GNU General Public License ( version 2 ) as published by the
2013-09-05 05:26:23 +02:00
Free Software Foundation > > ! AND MODIFIED BY ! < < the FreeRTOS exception .
2013-04-23 21:57:50 +02:00
2014-06-10 19:42:11 +02:00
> > ! NOTE : The modification to the GPL is included to allow you to ! < <
> > ! distribute a combined work that includes FreeRTOS without being ! < <
> > ! obliged to provide the source code for proprietary components ! < <
> > ! outside of the FreeRTOS kernel . ! < <
2013-04-23 21:57:50 +02:00
FreeRTOS is distributed in the hope that it will be useful , but WITHOUT ANY
WARRANTY ; without even the implied warranty of MERCHANTABILITY or FITNESS
2013-09-05 05:26:23 +02:00
FOR A PARTICULAR PURPOSE . Full license text is available from the following
link : http : //www.freertos.org/a00114.html
2013-04-05 22:46:56 +02:00
1 tab = = 4 spaces !
2013-04-23 21:57:50 +02:00
2013-04-05 22:46:56 +02:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* *
* Having a problem ? Start by reading the FAQ " My application does *
2013-04-23 21:57:50 +02:00
* not run , what could be wrong ? " *
2013-04-05 22:46:56 +02:00
* *
* http : //www.FreeRTOS.org/FAQHelp.html *
* *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
2013-09-05 05:26:23 +02:00
http : //www.FreeRTOS.org - Documentation, books, training, latest versions,
2013-04-23 21:57:50 +02:00
license and Real Time Engineers Ltd . contact details .
2013-04-05 22:46:56 +02:00
http : //www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
2013-09-05 05:26:23 +02:00
including FreeRTOS + Trace - an indispensable productivity tool , a DOS
compatible FAT file system , and our tiny thread aware UDP / IP stack .
http : //www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High
Integrity Systems to sell under the OpenRTOS brand . Low cost OpenRTOS
licenses offer ticketed support , indemnification and middleware .
http : //www.SafeRTOS.com - High Integrity Systems also provide a safety
engineered and independently SIL3 certified version for use in safety and
2013-04-23 21:57:50 +02:00
mission critical applications that require provable dependability .
2013-09-05 05:26:23 +02:00
1 tab = = 4 spaces !
2013-04-05 22:46:56 +02:00
*/
# include <stdlib.h>
# include "FreeRTOS.h"
# include "list.h"
/*-----------------------------------------------------------
* PUBLIC LIST API documented in list . h
* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
2014-03-23 18:44:06 +01:00
void vListInitialise ( List_t * const pxList )
2013-04-05 22:46:56 +02:00
{
/* The list structure contains a list item which is used to mark the
end of the list . To initialise the list the list end is inserted
as the only list entry . */
2014-03-23 18:44:06 +01:00
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. */
2013-04-05 22:46:56 +02:00
/* The list end value is the highest possible value in the list to
ensure it remains at the end of the list . */
pxList - > xListEnd . xItemValue = portMAX_DELAY ;
/* The list end next and previous pointers point to itself so we know
when the list is empty . */
2014-03-23 18:44:06 +01:00
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. */
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. */
2013-04-05 22:46:56 +02:00
2014-03-23 18:44:06 +01:00
pxList - > uxNumberOfItems = ( UBaseType_t ) 0U ;
2013-04-05 22:46:56 +02:00
}
/*-----------------------------------------------------------*/
2014-03-23 18:44:06 +01:00
void vListInitialiseItem ( ListItem_t * const pxItem )
2013-04-05 22:46:56 +02:00
{
/* Make sure the list item is not recorded as being on a list. */
pxItem - > pvContainer = NULL ;
}
/*-----------------------------------------------------------*/
2014-03-23 18:44:06 +01:00
void vListInsertEnd ( List_t * const pxList , ListItem_t * const pxNewListItem )
2013-04-05 22:46:56 +02:00
{
2014-03-23 18:44:06 +01:00
ListItem_t * const pxIndex = pxList - > pxIndex ;
2013-04-05 22:46:56 +02:00
/* Insert a new list item into pxList, but rather than sort the list,
makes the new list item the last item to be removed by a call to
2014-03-23 18:44:06 +01:00
listGET_OWNER_OF_NEXT_ENTRY ( ) . */
2013-09-05 05:26:23 +02:00
pxNewListItem - > pxNext = pxIndex ;
pxNewListItem - > pxPrevious = pxIndex - > pxPrevious ;
pxIndex - > pxPrevious - > pxNext = pxNewListItem ;
pxIndex - > pxPrevious = pxNewListItem ;
2013-04-05 22:46:56 +02:00
/* Remember which list the item is in. */
pxNewListItem - > pvContainer = ( void * ) pxList ;
( pxList - > uxNumberOfItems ) + + ;
}
/*-----------------------------------------------------------*/
2014-03-23 18:44:06 +01:00
void vListInsert ( List_t * const pxList , ListItem_t * const pxNewListItem )
2013-04-05 22:46:56 +02:00
{
2014-03-23 18:44:06 +01:00
ListItem_t * pxIterator ;
const TickType_t xValueOfInsertion = pxNewListItem - > xItemValue ;
2013-04-05 22:46:56 +02:00
2014-03-23 18:44:06 +01:00
/* Insert the new list item into the list, sorted in xItemValue order.
2013-04-05 22:46:56 +02:00
2014-03-23 18:44:06 +01:00
If the list already contains a list item with the same item value then
2013-04-05 22:46:56 +02:00
the new list item should be placed after it . This ensures that TCB ' s which
2014-03-23 18:44:06 +01:00
are stored in ready lists ( all of which have the same xItemValue value )
2013-04-05 22:46:56 +02:00
get an equal share of the CPU . However , if the xItemValue is the same as
the back marker the iteration loop below will not end . This means we need
to guard against this by checking the value first and modifying the
algorithm slightly if necessary . */
if ( xValueOfInsertion = = portMAX_DELAY )
{
pxIterator = pxList - > xListEnd . pxPrevious ;
}
else
{
/* *** NOTE ***********************************************************
If you find your application is crashing here then likely causes are :
1 ) Stack overflow -
see http : //www.freertos.org/Stacks-and-stack-overflow-checking.html
2 ) Incorrect interrupt priority assignment , especially on Cortex - M3
parts where numerically high priority values denote low actual
interrupt priories , which can seem counter intuitive . See
configMAX_SYSCALL_INTERRUPT_PRIORITY on http : //www.freertos.org/a00110.html
3 ) Calling an API function from within a critical section or when
2013-09-05 05:26:23 +02:00
the scheduler is suspended , or calling an API function that does
not end in " FromISR " from an interrupt .
2013-04-05 22:46:56 +02:00
4 ) Using a queue or semaphore before it has been initialised or
before the scheduler has been started ( are interrupts firing
before vTaskStartScheduler ( ) has been called ? ) .
2014-03-23 18:44:06 +01:00
See http : //www.freertos.org/FAQHelp.html for more tips, and ensure
configASSERT ( ) is defined ! http : //www.freertos.org/a00110.html#configASSERT
2013-04-05 22:46:56 +02:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2013-04-23 21:57:50 +02:00
2014-03-23 18:44:06 +01:00
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. */
2013-04-05 22:46:56 +02:00
{
/* There is nothing to do here, we are just iterating to the
wanted insertion position . */
}
}
pxNewListItem - > pxNext = pxIterator - > pxNext ;
2013-09-05 05:26:23 +02:00
pxNewListItem - > pxNext - > pxPrevious = pxNewListItem ;
2013-04-05 22:46:56 +02:00
pxNewListItem - > pxPrevious = pxIterator ;
2013-09-05 05:26:23 +02:00
pxIterator - > pxNext = pxNewListItem ;
2013-04-05 22:46:56 +02:00
/* Remember which list the item is in. This allows fast removal of the
item later . */
pxNewListItem - > pvContainer = ( void * ) pxList ;
( pxList - > uxNumberOfItems ) + + ;
}
/*-----------------------------------------------------------*/
2014-03-23 18:44:06 +01:00
UBaseType_t uxListRemove ( ListItem_t * const pxItemToRemove )
2013-04-05 22:46:56 +02:00
{
2014-03-23 18:44:06 +01:00
/* The list item knows which list it is in. Obtain the list from the list
item . */
List_t * const pxList = ( List_t * ) pxItemToRemove - > pvContainer ;
2013-04-05 22:46:56 +02:00
pxItemToRemove - > pxNext - > pxPrevious = pxItemToRemove - > pxPrevious ;
pxItemToRemove - > pxPrevious - > pxNext = pxItemToRemove - > pxNext ;
2013-04-23 21:57:50 +02:00
2013-04-05 22:46:56 +02:00
/* Make sure the index is left pointing to a valid item. */
if ( pxList - > pxIndex = = pxItemToRemove )
{
pxList - > pxIndex = pxItemToRemove - > pxPrevious ;
}
2014-03-23 18:44:06 +01:00
else
{
mtCOVERAGE_TEST_MARKER ( ) ;
}
2013-04-05 22:46:56 +02:00
pxItemToRemove - > pvContainer = NULL ;
( pxList - > uxNumberOfItems ) - - ;
2013-04-23 21:57:50 +02:00
return pxList - > uxNumberOfItems ;
2013-04-05 22:46:56 +02:00
}
/*-----------------------------------------------------------*/