David Fletcher / Mbed 2 deprecated cc3100_Test_mqtt_CM4F

Dependencies:   mbed

Committer:
dflet
Date:
Thu Sep 03 14:07:01 2015 +0000
Revision:
0:1e7b5dd9edb4
First commit, it's been hanging around for a while. Updated SPI mode change 1 to 0.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
dflet 0:1e7b5dd9edb4 1 /*
dflet 0:1e7b5dd9edb4 2 FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd.
dflet 0:1e7b5dd9edb4 3 All rights reserved
dflet 0:1e7b5dd9edb4 4
dflet 0:1e7b5dd9edb4 5 VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
dflet 0:1e7b5dd9edb4 6
dflet 0:1e7b5dd9edb4 7 This file is part of the FreeRTOS distribution.
dflet 0:1e7b5dd9edb4 8
dflet 0:1e7b5dd9edb4 9 FreeRTOS is free software; you can redistribute it and/or modify it under
dflet 0:1e7b5dd9edb4 10 the terms of the GNU General Public License (version 2) as published by the
dflet 0:1e7b5dd9edb4 11 Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
dflet 0:1e7b5dd9edb4 12
dflet 0:1e7b5dd9edb4 13 ***************************************************************************
dflet 0:1e7b5dd9edb4 14 >>! NOTE: The modification to the GPL is included to allow you to !<<
dflet 0:1e7b5dd9edb4 15 >>! distribute a combined work that includes FreeRTOS without being !<<
dflet 0:1e7b5dd9edb4 16 >>! obliged to provide the source code for proprietary components !<<
dflet 0:1e7b5dd9edb4 17 >>! outside of the FreeRTOS kernel. !<<
dflet 0:1e7b5dd9edb4 18 ***************************************************************************
dflet 0:1e7b5dd9edb4 19
dflet 0:1e7b5dd9edb4 20 FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY
dflet 0:1e7b5dd9edb4 21 WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
dflet 0:1e7b5dd9edb4 22 FOR A PARTICULAR PURPOSE. Full license text is available on the following
dflet 0:1e7b5dd9edb4 23 link: http://www.freertos.org/a00114.html
dflet 0:1e7b5dd9edb4 24
dflet 0:1e7b5dd9edb4 25 ***************************************************************************
dflet 0:1e7b5dd9edb4 26 * *
dflet 0:1e7b5dd9edb4 27 * FreeRTOS provides completely free yet professionally developed, *
dflet 0:1e7b5dd9edb4 28 * robust, strictly quality controlled, supported, and cross *
dflet 0:1e7b5dd9edb4 29 * platform software that is more than just the market leader, it *
dflet 0:1e7b5dd9edb4 30 * is the industry's de facto standard. *
dflet 0:1e7b5dd9edb4 31 * *
dflet 0:1e7b5dd9edb4 32 * Help yourself get started quickly while simultaneously helping *
dflet 0:1e7b5dd9edb4 33 * to support the FreeRTOS project by purchasing a FreeRTOS *
dflet 0:1e7b5dd9edb4 34 * tutorial book, reference manual, or both: *
dflet 0:1e7b5dd9edb4 35 * http://www.FreeRTOS.org/Documentation *
dflet 0:1e7b5dd9edb4 36 * *
dflet 0:1e7b5dd9edb4 37 ***************************************************************************
dflet 0:1e7b5dd9edb4 38
dflet 0:1e7b5dd9edb4 39 http://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
dflet 0:1e7b5dd9edb4 40 the FAQ page "My application does not run, what could be wrong?". Have you
dflet 0:1e7b5dd9edb4 41 defined configASSERT()?
dflet 0:1e7b5dd9edb4 42
dflet 0:1e7b5dd9edb4 43 http://www.FreeRTOS.org/support - In return for receiving this top quality
dflet 0:1e7b5dd9edb4 44 embedded software for free we request you assist our global community by
dflet 0:1e7b5dd9edb4 45 participating in the support forum.
dflet 0:1e7b5dd9edb4 46
dflet 0:1e7b5dd9edb4 47 http://www.FreeRTOS.org/training - Investing in training allows your team to
dflet 0:1e7b5dd9edb4 48 be as productive as possible as early as possible. Now you can receive
dflet 0:1e7b5dd9edb4 49 FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
dflet 0:1e7b5dd9edb4 50 Ltd, and the world's leading authority on the world's leading RTOS.
dflet 0:1e7b5dd9edb4 51
dflet 0:1e7b5dd9edb4 52 http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
dflet 0:1e7b5dd9edb4 53 including FreeRTOS+Trace - an indispensable productivity tool, a DOS
dflet 0:1e7b5dd9edb4 54 compatible FAT file system, and our tiny thread aware UDP/IP stack.
dflet 0:1e7b5dd9edb4 55
dflet 0:1e7b5dd9edb4 56 http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
dflet 0:1e7b5dd9edb4 57 Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
dflet 0:1e7b5dd9edb4 58
dflet 0:1e7b5dd9edb4 59 http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High
dflet 0:1e7b5dd9edb4 60 Integrity Systems ltd. to sell under the OpenRTOS brand. Low cost OpenRTOS
dflet 0:1e7b5dd9edb4 61 licenses offer ticketed support, indemnification and commercial middleware.
dflet 0:1e7b5dd9edb4 62
dflet 0:1e7b5dd9edb4 63 http://www.SafeRTOS.com - High Integrity Systems also provide a safety
dflet 0:1e7b5dd9edb4 64 engineered and independently SIL3 certified version for use in safety and
dflet 0:1e7b5dd9edb4 65 mission critical applications that require provable dependability.
dflet 0:1e7b5dd9edb4 66
dflet 0:1e7b5dd9edb4 67 1 tab == 4 spaces!
dflet 0:1e7b5dd9edb4 68 */
dflet 0:1e7b5dd9edb4 69
dflet 0:1e7b5dd9edb4 70 #include "FreeRTOS.h"
dflet 0:1e7b5dd9edb4 71 #include "task.h"
dflet 0:1e7b5dd9edb4 72 #include "croutine.h"
dflet 0:1e7b5dd9edb4 73
dflet 0:1e7b5dd9edb4 74 /* Remove the whole file is co-routines are not being used. */
dflet 0:1e7b5dd9edb4 75 #if( configUSE_CO_ROUTINES != 0 )
dflet 0:1e7b5dd9edb4 76
dflet 0:1e7b5dd9edb4 77 /*
dflet 0:1e7b5dd9edb4 78 * Some kernel aware debuggers require data to be viewed to be global, rather
dflet 0:1e7b5dd9edb4 79 * than file scope.
dflet 0:1e7b5dd9edb4 80 */
dflet 0:1e7b5dd9edb4 81 #ifdef portREMOVE_STATIC_QUALIFIER
dflet 0:1e7b5dd9edb4 82 #define static
dflet 0:1e7b5dd9edb4 83 #endif
dflet 0:1e7b5dd9edb4 84
dflet 0:1e7b5dd9edb4 85
dflet 0:1e7b5dd9edb4 86 /* Lists for ready and blocked co-routines. --------------------*/
dflet 0:1e7b5dd9edb4 87 static List_t pxReadyCoRoutineLists[ configMAX_CO_ROUTINE_PRIORITIES ]; /*< Prioritised ready co-routines. */
dflet 0:1e7b5dd9edb4 88 static List_t xDelayedCoRoutineList1; /*< Delayed co-routines. */
dflet 0:1e7b5dd9edb4 89 static List_t xDelayedCoRoutineList2; /*< Delayed co-routines (two lists are used - one for delays that have overflowed the current tick count. */
dflet 0:1e7b5dd9edb4 90 static List_t * pxDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used. */
dflet 0:1e7b5dd9edb4 91 static List_t * pxOverflowDelayedCoRoutineList; /*< Points to the delayed co-routine list currently being used to hold co-routines that have overflowed the current tick count. */
dflet 0:1e7b5dd9edb4 92 static List_t xPendingReadyCoRoutineList; /*< Holds co-routines that have been readied by an external event. They cannot be added directly to the ready lists as the ready lists cannot be accessed by interrupts. */
dflet 0:1e7b5dd9edb4 93
dflet 0:1e7b5dd9edb4 94 /* Other file private variables. --------------------------------*/
dflet 0:1e7b5dd9edb4 95 CRCB_t * pxCurrentCoRoutine = NULL;
dflet 0:1e7b5dd9edb4 96 static UBaseType_t uxTopCoRoutineReadyPriority = 0;
dflet 0:1e7b5dd9edb4 97 static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0;
dflet 0:1e7b5dd9edb4 98
dflet 0:1e7b5dd9edb4 99 /* The initial state of the co-routine when it is created. */
dflet 0:1e7b5dd9edb4 100 #define corINITIAL_STATE ( 0 )
dflet 0:1e7b5dd9edb4 101
dflet 0:1e7b5dd9edb4 102 /*
dflet 0:1e7b5dd9edb4 103 * Place the co-routine represented by pxCRCB into the appropriate ready queue
dflet 0:1e7b5dd9edb4 104 * for the priority. It is inserted at the end of the list.
dflet 0:1e7b5dd9edb4 105 *
dflet 0:1e7b5dd9edb4 106 * This macro accesses the co-routine ready lists and therefore must not be
dflet 0:1e7b5dd9edb4 107 * used from within an ISR.
dflet 0:1e7b5dd9edb4 108 */
dflet 0:1e7b5dd9edb4 109 #define prvAddCoRoutineToReadyQueue( pxCRCB ) \
dflet 0:1e7b5dd9edb4 110 { \
dflet 0:1e7b5dd9edb4 111 if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \
dflet 0:1e7b5dd9edb4 112 { \
dflet 0:1e7b5dd9edb4 113 uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \
dflet 0:1e7b5dd9edb4 114 } \
dflet 0:1e7b5dd9edb4 115 vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \
dflet 0:1e7b5dd9edb4 116 }
dflet 0:1e7b5dd9edb4 117
dflet 0:1e7b5dd9edb4 118 /*
dflet 0:1e7b5dd9edb4 119 * Utility to ready all the lists used by the scheduler. This is called
dflet 0:1e7b5dd9edb4 120 * automatically upon the creation of the first co-routine.
dflet 0:1e7b5dd9edb4 121 */
dflet 0:1e7b5dd9edb4 122 static void prvInitialiseCoRoutineLists( void );
dflet 0:1e7b5dd9edb4 123
dflet 0:1e7b5dd9edb4 124 /*
dflet 0:1e7b5dd9edb4 125 * Co-routines that are readied by an interrupt cannot be placed directly into
dflet 0:1e7b5dd9edb4 126 * the ready lists (there is no mutual exclusion). Instead they are placed in
dflet 0:1e7b5dd9edb4 127 * in the pending ready list in order that they can later be moved to the ready
dflet 0:1e7b5dd9edb4 128 * list by the co-routine scheduler.
dflet 0:1e7b5dd9edb4 129 */
dflet 0:1e7b5dd9edb4 130 static void prvCheckPendingReadyList( void );
dflet 0:1e7b5dd9edb4 131
dflet 0:1e7b5dd9edb4 132 /*
dflet 0:1e7b5dd9edb4 133 * Macro that looks at the list of co-routines that are currently delayed to
dflet 0:1e7b5dd9edb4 134 * see if any require waking.
dflet 0:1e7b5dd9edb4 135 *
dflet 0:1e7b5dd9edb4 136 * Co-routines are stored in the queue in the order of their wake time -
dflet 0:1e7b5dd9edb4 137 * meaning once one co-routine has been found whose timer has not expired
dflet 0:1e7b5dd9edb4 138 * we need not look any further down the list.
dflet 0:1e7b5dd9edb4 139 */
dflet 0:1e7b5dd9edb4 140 static void prvCheckDelayedList( void );
dflet 0:1e7b5dd9edb4 141
dflet 0:1e7b5dd9edb4 142 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 143
dflet 0:1e7b5dd9edb4 144 BaseType_t xCoRoutineCreate( crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex )
dflet 0:1e7b5dd9edb4 145 {
dflet 0:1e7b5dd9edb4 146 BaseType_t xReturn;
dflet 0:1e7b5dd9edb4 147 CRCB_t *pxCoRoutine;
dflet 0:1e7b5dd9edb4 148
dflet 0:1e7b5dd9edb4 149 /* Allocate the memory that will store the co-routine control block. */
dflet 0:1e7b5dd9edb4 150 pxCoRoutine = ( CRCB_t * ) pvPortMalloc( sizeof( CRCB_t ) );
dflet 0:1e7b5dd9edb4 151 if( pxCoRoutine )
dflet 0:1e7b5dd9edb4 152 {
dflet 0:1e7b5dd9edb4 153 /* If pxCurrentCoRoutine is NULL then this is the first co-routine to
dflet 0:1e7b5dd9edb4 154 be created and the co-routine data structures need initialising. */
dflet 0:1e7b5dd9edb4 155 if( pxCurrentCoRoutine == NULL )
dflet 0:1e7b5dd9edb4 156 {
dflet 0:1e7b5dd9edb4 157 pxCurrentCoRoutine = pxCoRoutine;
dflet 0:1e7b5dd9edb4 158 prvInitialiseCoRoutineLists();
dflet 0:1e7b5dd9edb4 159 }
dflet 0:1e7b5dd9edb4 160
dflet 0:1e7b5dd9edb4 161 /* Check the priority is within limits. */
dflet 0:1e7b5dd9edb4 162 if( uxPriority >= configMAX_CO_ROUTINE_PRIORITIES )
dflet 0:1e7b5dd9edb4 163 {
dflet 0:1e7b5dd9edb4 164 uxPriority = configMAX_CO_ROUTINE_PRIORITIES - 1;
dflet 0:1e7b5dd9edb4 165 }
dflet 0:1e7b5dd9edb4 166
dflet 0:1e7b5dd9edb4 167 /* Fill out the co-routine control block from the function parameters. */
dflet 0:1e7b5dd9edb4 168 pxCoRoutine->uxState = corINITIAL_STATE;
dflet 0:1e7b5dd9edb4 169 pxCoRoutine->uxPriority = uxPriority;
dflet 0:1e7b5dd9edb4 170 pxCoRoutine->uxIndex = uxIndex;
dflet 0:1e7b5dd9edb4 171 pxCoRoutine->pxCoRoutineFunction = pxCoRoutineCode;
dflet 0:1e7b5dd9edb4 172
dflet 0:1e7b5dd9edb4 173 /* Initialise all the other co-routine control block parameters. */
dflet 0:1e7b5dd9edb4 174 vListInitialiseItem( &( pxCoRoutine->xGenericListItem ) );
dflet 0:1e7b5dd9edb4 175 vListInitialiseItem( &( pxCoRoutine->xEventListItem ) );
dflet 0:1e7b5dd9edb4 176
dflet 0:1e7b5dd9edb4 177 /* Set the co-routine control block as a link back from the ListItem_t.
dflet 0:1e7b5dd9edb4 178 This is so we can get back to the containing CRCB from a generic item
dflet 0:1e7b5dd9edb4 179 in a list. */
dflet 0:1e7b5dd9edb4 180 listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xGenericListItem ), pxCoRoutine );
dflet 0:1e7b5dd9edb4 181 listSET_LIST_ITEM_OWNER( &( pxCoRoutine->xEventListItem ), pxCoRoutine );
dflet 0:1e7b5dd9edb4 182
dflet 0:1e7b5dd9edb4 183 /* Event lists are always in priority order. */
dflet 0:1e7b5dd9edb4 184 listSET_LIST_ITEM_VALUE( &( pxCoRoutine->xEventListItem ), ( ( TickType_t ) configMAX_CO_ROUTINE_PRIORITIES - ( TickType_t ) uxPriority ) );
dflet 0:1e7b5dd9edb4 185
dflet 0:1e7b5dd9edb4 186 /* Now the co-routine has been initialised it can be added to the ready
dflet 0:1e7b5dd9edb4 187 list at the correct priority. */
dflet 0:1e7b5dd9edb4 188 prvAddCoRoutineToReadyQueue( pxCoRoutine );
dflet 0:1e7b5dd9edb4 189
dflet 0:1e7b5dd9edb4 190 xReturn = pdPASS;
dflet 0:1e7b5dd9edb4 191 }
dflet 0:1e7b5dd9edb4 192 else
dflet 0:1e7b5dd9edb4 193 {
dflet 0:1e7b5dd9edb4 194 xReturn = errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY;
dflet 0:1e7b5dd9edb4 195 }
dflet 0:1e7b5dd9edb4 196
dflet 0:1e7b5dd9edb4 197 return xReturn;
dflet 0:1e7b5dd9edb4 198 }
dflet 0:1e7b5dd9edb4 199 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 200
dflet 0:1e7b5dd9edb4 201 void vCoRoutineAddToDelayedList( TickType_t xTicksToDelay, List_t *pxEventList )
dflet 0:1e7b5dd9edb4 202 {
dflet 0:1e7b5dd9edb4 203 TickType_t xTimeToWake;
dflet 0:1e7b5dd9edb4 204
dflet 0:1e7b5dd9edb4 205 /* Calculate the time to wake - this may overflow but this is
dflet 0:1e7b5dd9edb4 206 not a problem. */
dflet 0:1e7b5dd9edb4 207 xTimeToWake = xCoRoutineTickCount + xTicksToDelay;
dflet 0:1e7b5dd9edb4 208
dflet 0:1e7b5dd9edb4 209 /* We must remove ourselves from the ready list before adding
dflet 0:1e7b5dd9edb4 210 ourselves to the blocked list as the same list item is used for
dflet 0:1e7b5dd9edb4 211 both lists. */
dflet 0:1e7b5dd9edb4 212 ( void ) uxListRemove( ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );
dflet 0:1e7b5dd9edb4 213
dflet 0:1e7b5dd9edb4 214 /* The list item will be inserted in wake time order. */
dflet 0:1e7b5dd9edb4 215 listSET_LIST_ITEM_VALUE( &( pxCurrentCoRoutine->xGenericListItem ), xTimeToWake );
dflet 0:1e7b5dd9edb4 216
dflet 0:1e7b5dd9edb4 217 if( xTimeToWake < xCoRoutineTickCount )
dflet 0:1e7b5dd9edb4 218 {
dflet 0:1e7b5dd9edb4 219 /* Wake time has overflowed. Place this item in the
dflet 0:1e7b5dd9edb4 220 overflow list. */
dflet 0:1e7b5dd9edb4 221 vListInsert( ( List_t * ) pxOverflowDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );
dflet 0:1e7b5dd9edb4 222 }
dflet 0:1e7b5dd9edb4 223 else
dflet 0:1e7b5dd9edb4 224 {
dflet 0:1e7b5dd9edb4 225 /* The wake time has not overflowed, so we can use the
dflet 0:1e7b5dd9edb4 226 current block list. */
dflet 0:1e7b5dd9edb4 227 vListInsert( ( List_t * ) pxDelayedCoRoutineList, ( ListItem_t * ) &( pxCurrentCoRoutine->xGenericListItem ) );
dflet 0:1e7b5dd9edb4 228 }
dflet 0:1e7b5dd9edb4 229
dflet 0:1e7b5dd9edb4 230 if( pxEventList )
dflet 0:1e7b5dd9edb4 231 {
dflet 0:1e7b5dd9edb4 232 /* Also add the co-routine to an event list. If this is done then the
dflet 0:1e7b5dd9edb4 233 function must be called with interrupts disabled. */
dflet 0:1e7b5dd9edb4 234 vListInsert( pxEventList, &( pxCurrentCoRoutine->xEventListItem ) );
dflet 0:1e7b5dd9edb4 235 }
dflet 0:1e7b5dd9edb4 236 }
dflet 0:1e7b5dd9edb4 237 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 238
dflet 0:1e7b5dd9edb4 239 static void prvCheckPendingReadyList( void )
dflet 0:1e7b5dd9edb4 240 {
dflet 0:1e7b5dd9edb4 241 /* Are there any co-routines waiting to get moved to the ready list? These
dflet 0:1e7b5dd9edb4 242 are co-routines that have been readied by an ISR. The ISR cannot access
dflet 0:1e7b5dd9edb4 243 the ready lists itself. */
dflet 0:1e7b5dd9edb4 244 while( listLIST_IS_EMPTY( &xPendingReadyCoRoutineList ) == pdFALSE )
dflet 0:1e7b5dd9edb4 245 {
dflet 0:1e7b5dd9edb4 246 CRCB_t *pxUnblockedCRCB;
dflet 0:1e7b5dd9edb4 247
dflet 0:1e7b5dd9edb4 248 /* The pending ready list can be accessed by an ISR. */
dflet 0:1e7b5dd9edb4 249 portDISABLE_INTERRUPTS();
dflet 0:1e7b5dd9edb4 250 {
dflet 0:1e7b5dd9edb4 251 pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( (&xPendingReadyCoRoutineList) );
dflet 0:1e7b5dd9edb4 252 ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) );
dflet 0:1e7b5dd9edb4 253 }
dflet 0:1e7b5dd9edb4 254 portENABLE_INTERRUPTS();
dflet 0:1e7b5dd9edb4 255
dflet 0:1e7b5dd9edb4 256 ( void ) uxListRemove( &( pxUnblockedCRCB->xGenericListItem ) );
dflet 0:1e7b5dd9edb4 257 prvAddCoRoutineToReadyQueue( pxUnblockedCRCB );
dflet 0:1e7b5dd9edb4 258 }
dflet 0:1e7b5dd9edb4 259 }
dflet 0:1e7b5dd9edb4 260 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 261
dflet 0:1e7b5dd9edb4 262 static void prvCheckDelayedList( void )
dflet 0:1e7b5dd9edb4 263 {
dflet 0:1e7b5dd9edb4 264 CRCB_t *pxCRCB;
dflet 0:1e7b5dd9edb4 265
dflet 0:1e7b5dd9edb4 266 xPassedTicks = xTaskGetTickCount() - xLastTickCount;
dflet 0:1e7b5dd9edb4 267 while( xPassedTicks )
dflet 0:1e7b5dd9edb4 268 {
dflet 0:1e7b5dd9edb4 269 xCoRoutineTickCount++;
dflet 0:1e7b5dd9edb4 270 xPassedTicks--;
dflet 0:1e7b5dd9edb4 271
dflet 0:1e7b5dd9edb4 272 /* If the tick count has overflowed we need to swap the ready lists. */
dflet 0:1e7b5dd9edb4 273 if( xCoRoutineTickCount == 0 )
dflet 0:1e7b5dd9edb4 274 {
dflet 0:1e7b5dd9edb4 275 List_t * pxTemp;
dflet 0:1e7b5dd9edb4 276
dflet 0:1e7b5dd9edb4 277 /* Tick count has overflowed so we need to swap the delay lists. If there are
dflet 0:1e7b5dd9edb4 278 any items in pxDelayedCoRoutineList here then there is an error! */
dflet 0:1e7b5dd9edb4 279 pxTemp = pxDelayedCoRoutineList;
dflet 0:1e7b5dd9edb4 280 pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList;
dflet 0:1e7b5dd9edb4 281 pxOverflowDelayedCoRoutineList = pxTemp;
dflet 0:1e7b5dd9edb4 282 }
dflet 0:1e7b5dd9edb4 283
dflet 0:1e7b5dd9edb4 284 /* See if this tick has made a timeout expire. */
dflet 0:1e7b5dd9edb4 285 while( listLIST_IS_EMPTY( pxDelayedCoRoutineList ) == pdFALSE )
dflet 0:1e7b5dd9edb4 286 {
dflet 0:1e7b5dd9edb4 287 pxCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxDelayedCoRoutineList );
dflet 0:1e7b5dd9edb4 288
dflet 0:1e7b5dd9edb4 289 if( xCoRoutineTickCount < listGET_LIST_ITEM_VALUE( &( pxCRCB->xGenericListItem ) ) )
dflet 0:1e7b5dd9edb4 290 {
dflet 0:1e7b5dd9edb4 291 /* Timeout not yet expired. */
dflet 0:1e7b5dd9edb4 292 break;
dflet 0:1e7b5dd9edb4 293 }
dflet 0:1e7b5dd9edb4 294
dflet 0:1e7b5dd9edb4 295 portDISABLE_INTERRUPTS();
dflet 0:1e7b5dd9edb4 296 {
dflet 0:1e7b5dd9edb4 297 /* The event could have occurred just before this critical
dflet 0:1e7b5dd9edb4 298 section. If this is the case then the generic list item will
dflet 0:1e7b5dd9edb4 299 have been moved to the pending ready list and the following
dflet 0:1e7b5dd9edb4 300 line is still valid. Also the pvContainer parameter will have
dflet 0:1e7b5dd9edb4 301 been set to NULL so the following lines are also valid. */
dflet 0:1e7b5dd9edb4 302 ( void ) uxListRemove( &( pxCRCB->xGenericListItem ) );
dflet 0:1e7b5dd9edb4 303
dflet 0:1e7b5dd9edb4 304 /* Is the co-routine waiting on an event also? */
dflet 0:1e7b5dd9edb4 305 if( pxCRCB->xEventListItem.pvContainer )
dflet 0:1e7b5dd9edb4 306 {
dflet 0:1e7b5dd9edb4 307 ( void ) uxListRemove( &( pxCRCB->xEventListItem ) );
dflet 0:1e7b5dd9edb4 308 }
dflet 0:1e7b5dd9edb4 309 }
dflet 0:1e7b5dd9edb4 310 portENABLE_INTERRUPTS();
dflet 0:1e7b5dd9edb4 311
dflet 0:1e7b5dd9edb4 312 prvAddCoRoutineToReadyQueue( pxCRCB );
dflet 0:1e7b5dd9edb4 313 }
dflet 0:1e7b5dd9edb4 314 }
dflet 0:1e7b5dd9edb4 315
dflet 0:1e7b5dd9edb4 316 xLastTickCount = xCoRoutineTickCount;
dflet 0:1e7b5dd9edb4 317 }
dflet 0:1e7b5dd9edb4 318 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 319
dflet 0:1e7b5dd9edb4 320 void vCoRoutineSchedule( void )
dflet 0:1e7b5dd9edb4 321 {
dflet 0:1e7b5dd9edb4 322 /* See if any co-routines readied by events need moving to the ready lists. */
dflet 0:1e7b5dd9edb4 323 prvCheckPendingReadyList();
dflet 0:1e7b5dd9edb4 324
dflet 0:1e7b5dd9edb4 325 /* See if any delayed co-routines have timed out. */
dflet 0:1e7b5dd9edb4 326 prvCheckDelayedList();
dflet 0:1e7b5dd9edb4 327
dflet 0:1e7b5dd9edb4 328 /* Find the highest priority queue that contains ready co-routines. */
dflet 0:1e7b5dd9edb4 329 while( listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) )
dflet 0:1e7b5dd9edb4 330 {
dflet 0:1e7b5dd9edb4 331 if( uxTopCoRoutineReadyPriority == 0 )
dflet 0:1e7b5dd9edb4 332 {
dflet 0:1e7b5dd9edb4 333 /* No more co-routines to check. */
dflet 0:1e7b5dd9edb4 334 return;
dflet 0:1e7b5dd9edb4 335 }
dflet 0:1e7b5dd9edb4 336 --uxTopCoRoutineReadyPriority;
dflet 0:1e7b5dd9edb4 337 }
dflet 0:1e7b5dd9edb4 338
dflet 0:1e7b5dd9edb4 339 /* listGET_OWNER_OF_NEXT_ENTRY walks through the list, so the co-routines
dflet 0:1e7b5dd9edb4 340 of the same priority get an equal share of the processor time. */
dflet 0:1e7b5dd9edb4 341 listGET_OWNER_OF_NEXT_ENTRY( pxCurrentCoRoutine, &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) );
dflet 0:1e7b5dd9edb4 342
dflet 0:1e7b5dd9edb4 343 /* Call the co-routine. */
dflet 0:1e7b5dd9edb4 344 ( pxCurrentCoRoutine->pxCoRoutineFunction )( pxCurrentCoRoutine, pxCurrentCoRoutine->uxIndex );
dflet 0:1e7b5dd9edb4 345
dflet 0:1e7b5dd9edb4 346 return;
dflet 0:1e7b5dd9edb4 347 }
dflet 0:1e7b5dd9edb4 348 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 349
dflet 0:1e7b5dd9edb4 350 static void prvInitialiseCoRoutineLists( void )
dflet 0:1e7b5dd9edb4 351 {
dflet 0:1e7b5dd9edb4 352 UBaseType_t uxPriority;
dflet 0:1e7b5dd9edb4 353
dflet 0:1e7b5dd9edb4 354 for( uxPriority = 0; uxPriority < configMAX_CO_ROUTINE_PRIORITIES; uxPriority++ )
dflet 0:1e7b5dd9edb4 355 {
dflet 0:1e7b5dd9edb4 356 vListInitialise( ( List_t * ) &( pxReadyCoRoutineLists[ uxPriority ] ) );
dflet 0:1e7b5dd9edb4 357 }
dflet 0:1e7b5dd9edb4 358
dflet 0:1e7b5dd9edb4 359 vListInitialise( ( List_t * ) &xDelayedCoRoutineList1 );
dflet 0:1e7b5dd9edb4 360 vListInitialise( ( List_t * ) &xDelayedCoRoutineList2 );
dflet 0:1e7b5dd9edb4 361 vListInitialise( ( List_t * ) &xPendingReadyCoRoutineList );
dflet 0:1e7b5dd9edb4 362
dflet 0:1e7b5dd9edb4 363 /* Start with pxDelayedCoRoutineList using list1 and the
dflet 0:1e7b5dd9edb4 364 pxOverflowDelayedCoRoutineList using list2. */
dflet 0:1e7b5dd9edb4 365 pxDelayedCoRoutineList = &xDelayedCoRoutineList1;
dflet 0:1e7b5dd9edb4 366 pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2;
dflet 0:1e7b5dd9edb4 367 }
dflet 0:1e7b5dd9edb4 368 /*-----------------------------------------------------------*/
dflet 0:1e7b5dd9edb4 369
dflet 0:1e7b5dd9edb4 370 BaseType_t xCoRoutineRemoveFromEventList( const List_t *pxEventList )
dflet 0:1e7b5dd9edb4 371 {
dflet 0:1e7b5dd9edb4 372 CRCB_t *pxUnblockedCRCB;
dflet 0:1e7b5dd9edb4 373 BaseType_t xReturn;
dflet 0:1e7b5dd9edb4 374
dflet 0:1e7b5dd9edb4 375 /* This function is called from within an interrupt. It can only access
dflet 0:1e7b5dd9edb4 376 event lists and the pending ready list. This function assumes that a
dflet 0:1e7b5dd9edb4 377 check has already been made to ensure pxEventList is not empty. */
dflet 0:1e7b5dd9edb4 378 pxUnblockedCRCB = ( CRCB_t * ) listGET_OWNER_OF_HEAD_ENTRY( pxEventList );
dflet 0:1e7b5dd9edb4 379 ( void ) uxListRemove( &( pxUnblockedCRCB->xEventListItem ) );
dflet 0:1e7b5dd9edb4 380 vListInsertEnd( ( List_t * ) &( xPendingReadyCoRoutineList ), &( pxUnblockedCRCB->xEventListItem ) );
dflet 0:1e7b5dd9edb4 381
dflet 0:1e7b5dd9edb4 382 if( pxUnblockedCRCB->uxPriority >= pxCurrentCoRoutine->uxPriority )
dflet 0:1e7b5dd9edb4 383 {
dflet 0:1e7b5dd9edb4 384 xReturn = pdTRUE;
dflet 0:1e7b5dd9edb4 385 }
dflet 0:1e7b5dd9edb4 386 else
dflet 0:1e7b5dd9edb4 387 {
dflet 0:1e7b5dd9edb4 388 xReturn = pdFALSE;
dflet 0:1e7b5dd9edb4 389 }
dflet 0:1e7b5dd9edb4 390
dflet 0:1e7b5dd9edb4 391 return xReturn;
dflet 0:1e7b5dd9edb4 392 }
dflet 0:1e7b5dd9edb4 393
dflet 0:1e7b5dd9edb4 394 #endif /* configUSE_CO_ROUTINES == 0 */
dflet 0:1e7b5dd9edb4 395
dflet 0:1e7b5dd9edb4 396