75 #if( configUSE_CO_ROUTINES != 0 ) 81 #ifdef portREMOVE_STATIC_QUALIFIER 88 static List_t xDelayedCoRoutineList1;
89 static List_t xDelayedCoRoutineList2;
90 static List_t * pxDelayedCoRoutineList;
91 static List_t * pxOverflowDelayedCoRoutineList;
92 static List_t xPendingReadyCoRoutineList;
97 static TickType_t xCoRoutineTickCount = 0, xLastTickCount = 0, xPassedTicks = 0;
100 #define corINITIAL_STATE ( 0 ) 109 #define prvAddCoRoutineToReadyQueue( pxCRCB ) \ 111 if( pxCRCB->uxPriority > uxTopCoRoutineReadyPriority ) \ 113 uxTopCoRoutineReadyPriority = pxCRCB->uxPriority; \ 115 vListInsertEnd( ( List_t * ) &( pxReadyCoRoutineLists[ pxCRCB->uxPriority ] ), &( pxCRCB->xGenericListItem ) ); \ 122 static void prvInitialiseCoRoutineLists(
void );
130 static void prvCheckPendingReadyList(
void );
140 static void prvCheckDelayedList(
void );
155 if( pxCurrentCoRoutine ==
NULL )
157 pxCurrentCoRoutine = pxCoRoutine;
158 prvInitialiseCoRoutineLists();
168 pxCoRoutine->
uxState = corINITIAL_STATE;
170 pxCoRoutine->
uxIndex = uxIndex;
188 prvAddCoRoutineToReadyQueue( pxCoRoutine );
207 xTimeToWake = xCoRoutineTickCount + xTicksToDelay;
217 if( xTimeToWake < xCoRoutineTickCount )
239 static void prvCheckPendingReadyList(
void )
257 prvAddCoRoutineToReadyQueue( pxUnblockedCRCB );
262 static void prvCheckDelayedList(
void )
267 while( xPassedTicks )
269 xCoRoutineTickCount++;
273 if( xCoRoutineTickCount == 0 )
279 pxTemp = pxDelayedCoRoutineList;
280 pxDelayedCoRoutineList = pxOverflowDelayedCoRoutineList;
281 pxOverflowDelayedCoRoutineList = pxTemp;
312 prvAddCoRoutineToReadyQueue( pxCRCB );
316 xLastTickCount = xCoRoutineTickCount;
323 prvCheckPendingReadyList();
326 prvCheckDelayedList();
329 while(
listLIST_IS_EMPTY( &( pxReadyCoRoutineLists[ uxTopCoRoutineReadyPriority ] ) ) )
331 if( uxTopCoRoutineReadyPriority == 0 )
336 --uxTopCoRoutineReadyPriority;
350 static void prvInitialiseCoRoutineLists(
void )
365 pxDelayedCoRoutineList = &xDelayedCoRoutineList1;
366 pxOverflowDelayedCoRoutineList = &xDelayedCoRoutineList2;
#define listGET_LIST_ITEM_VALUE(pxListItem)
#define listGET_OWNER_OF_NEXT_ENTRY(pxTCB, pxList)
UBaseType_t uxListRemove(ListItem_t *const pxItemToRemove) PRIVILEGED_FUNCTION
#define portENABLE_INTERRUPTS()
#define portDISABLE_INTERRUPTS()
BaseType_t xCoRoutineCreate(crCOROUTINE_CODE pxCoRoutineCode, UBaseType_t uxPriority, UBaseType_t uxIndex)
void vListInsertEnd(List_t *const pxList, ListItem_t *const pxNewListItem) PRIVILEGED_FUNCTION
void * pvPortMalloc(size_t xSize) PRIVILEGED_FUNCTION
#define listSET_LIST_ITEM_VALUE(pxListItem, xValue)
#define configMAX_CO_ROUTINE_PRIORITIES
#define listLIST_IS_EMPTY(pxList)
unsigned long UBaseType_t
ListItem_t xEventListItem
#define listSET_LIST_ITEM_OWNER(pxListItem, pxOwner)
TickType_t xTaskGetTickCount(void) PRIVILEGED_FUNCTION
#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
ListItem_t xGenericListItem
#define listGET_OWNER_OF_HEAD_ENTRY(pxList)
void *configLIST_VOLATILE pvContainer
void vCoRoutineSchedule(void)
void vCoRoutineAddToDelayedList(TickType_t xTicksToDelay, List_t *pxEventList)
void vListInsert(List_t *const pxList, ListItem_t *const pxNewListItem) PRIVILEGED_FUNCTION
BaseType_t xCoRoutineRemoveFromEventList(const List_t *pxEventList)
void(* crCOROUTINE_CODE)(CoRoutineHandle_t, UBaseType_t)
crCOROUTINE_CODE pxCoRoutineFunction
void vListInitialise(List_t *const pxList) PRIVILEGED_FUNCTION
void vListInitialiseItem(ListItem_t *const pxItem) PRIVILEGED_FUNCTION