73 #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
85 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
87 #if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 )
96 #if configUSE_TICKLESS_IDLE != 0
97 #if INCLUDE_vTaskSuspend != 1
98 #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0
105 #define tskIDLE_STACK_SIZE configMINIMAL_STACK_SIZE
107 #if( configUSE_PREEMPTION == 0 )
110 #define taskYIELD_IF_USING_PREEMPTION()
112 #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API()
124 #if ( portUSING_MPU_WRAPPERS == 1 )
125 xMPU_SETTINGS xMPUSettings;
134 #if ( portSTACK_GROWTH > 0 )
138 #if ( portCRITICAL_NESTING_IN_TCB == 1 )
142 #if ( configUSE_TRACE_FACILITY == 1 )
147 #if ( configUSE_MUTEXES == 1 )
151 #if ( configUSE_APPLICATION_TASK_TAG == 1 )
155 #if ( configGENERATE_RUN_TIME_STATS == 1 )
156 uint32_t ulRunTimeCounter;
159 #if ( configUSE_NEWLIB_REENTRANT == 1 )
167 struct _reent xNewLib_reent;
180 #ifdef portREMOVE_STATIC_QUALIFIER
197 #if ( INCLUDE_vTaskDelete == 1 )
204 #if ( INCLUDE_vTaskSuspend == 1 )
210 #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )
237 #if ( configGENERATE_RUN_TIME_STATS == 1 )
252 #define tskSTACK_FILL_BYTE ( 0xa5U )
257 #define tskBLOCKED_CHAR ( 'B' )
258 #define tskREADY_CHAR ( 'R' )
259 #define tskDELETED_CHAR ( 'D' )
260 #define tskSUSPENDED_CHAR ( 'S' )
264 #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 )
272 #define taskRECORD_READY_PRIORITY( uxPriority ) \
274 if( ( uxPriority ) > uxTopReadyPriority ) \
276 uxTopReadyPriority = ( uxPriority ); \
282 #define taskSELECT_HIGHEST_PRIORITY_TASK() \
285 while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) ) \
287 configASSERT( uxTopReadyPriority ); \
288 --uxTopReadyPriority; \
293 listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) ); \
301 #define taskRESET_READY_PRIORITY( uxPriority )
302 #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority )
311 #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority )
315 #define taskSELECT_HIGHEST_PRIORITY_TASK() \
317 UBaseType_t uxTopPriority; \
320 portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \
321 configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \
322 listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \
330 #define taskRESET_READY_PRIORITY( uxPriority ) \
332 if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == 0 ) \
334 portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \
344 #define taskSWITCH_DELAYED_LISTS() \
349 configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \
351 pxTemp = pxDelayedTaskList; \
352 pxDelayedTaskList = pxOverflowDelayedTaskList; \
353 pxOverflowDelayedTaskList = pxTemp; \
355 prvResetNextTaskUnblockTime(); \
364 #define prvAddTaskToReadyList( pxTCB ) \
365 traceMOVED_TASK_TO_READY_STATE( pxTCB ) \
366 taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \
367 vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xGenericListItem ) )
376 #define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( TCB_t * ) pxCurrentTCB : ( TCB_t * ) ( pxHandle ) )
386 #if configUSE_16_BIT_TICKS == 1
387 #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U
389 #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL
393 #if configCHECK_FOR_STACK_OVERFLOW > 0
397 #if configUSE_TICK_HOOK > 0
442 #if ( INCLUDE_vTaskDelete == 1 )
453 static void prvCheckTasksWaitingTermination(
void ) PRIVILEGED_FUNCTION;
459 static
void prvAddCurrentTaskToDelayedList( const
TickType_t xTimeToWake ) PRIVILEGED_FUNCTION;
465 static
TCB_t *prvAllocateTCBAndStack( const uint16_t usStackDepth,
StackType_t * const puxStackBuffer ) PRIVILEGED_FUNCTION;
475 #if ( configUSE_TRACE_FACILITY == 1 )
486 #if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) )
488 static uint16_t prvTaskCheckFreeStackSpace(
const uint8_t * pucStackByte )
PRIVILEGED_FUNCTION;
501 #if ( configUSE_TICKLESS_IDLE != 0 )
503 static TickType_t prvGetExpectedIdleTime(
void ) PRIVILEGED_FUNCTION;
511 static void prvResetNextTaskUnblockTime(
void );
525 pxNewTCB = prvAllocateTCBAndStack( usStackDepth, puxStackBuffer );
527 if( pxNewTCB != NULL )
531 #if( portUSING_MPU_WRAPPERS == 1 )
542 uxPriority &= ~portPRIVILEGE_BIT;
549 #if( portSTACK_GROWTH < 0 )
551 pxTopOfStack = pxNewTCB->
pxStack + ( usStackDepth - ( uint16_t ) 1 );
555 configASSERT( ( ( ( uint32_t ) pxTopOfStack & ( uint32_t ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );
559 pxTopOfStack = pxNewTCB->
pxStack;
562 configASSERT( ( ( ( uint32_t ) pxNewTCB->
pxStack & ( uint32_t ) portBYTE_ALIGNMENT_MASK ) == 0UL ) );
567 pxNewTCB->pxEndOfStack = pxNewTCB->
pxStack + ( usStackDepth - 1 );
572 prvInitialiseTCBVariables( pxNewTCB, pcName, uxPriority, xRegions, usStackDepth );
578 #if( portUSING_MPU_WRAPPERS == 1 )
588 if( (
void * ) pxCreatedTask != NULL )
604 uxCurrentNumberOfTasks++;
616 prvInitialiseTaskLists();
628 if( xSchedulerRunning ==
pdFALSE )
647 #if ( configUSE_TRACE_FACILITY == 1 )
650 pxNewTCB->uxTCBNumber = uxTaskNumber;
670 if( xSchedulerRunning !=
pdFALSE )
693 #if ( INCLUDE_vTaskDelete == 1 )
745 if( xSchedulerRunning !=
pdFALSE )
765 prvResetNextTaskUnblockTime();
775 #if ( INCLUDE_vTaskDelayUntil == 1 )
790 const TickType_t xConstTickCount = xTickCount;
793 xTimeToWake = *pxPreviousWakeTime + xTimeIncrement;
795 if( xConstTickCount < *pxPreviousWakeTime )
802 if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) )
816 if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) )
827 *pxPreviousWakeTime = xTimeToWake;
847 prvAddCurrentTaskToDelayedList( xTimeToWake );
858 if( xAlreadyYielded ==
pdFALSE )
871 #if ( INCLUDE_vTaskDelay == 1 )
897 xTimeToWake = xTickCount + xTicksToDelay;
913 prvAddCurrentTaskToDelayedList( xTimeToWake );
924 if( xAlreadyYielded ==
pdFALSE )
937 #if ( INCLUDE_eTaskGetState == 1 )
943 const TCB_t *
const pxTCB = (
TCB_t * ) xTask;
960 if( ( pxStateList == pxDelayedTaskList ) || ( pxStateList == pxOverflowDelayedTaskList ) )
967 #if ( INCLUDE_vTaskSuspend == 1 )
968 else if( pxStateList == &xSuspendedTaskList )
984 #if ( INCLUDE_vTaskDelete == 1 )
985 else if( pxStateList == &xTasksWaitingTermination )
1007 #if ( INCLUDE_uxTaskPriorityGet == 1 )
1029 #if ( INCLUDE_vTaskPrioritySet == 1 )
1034 UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry;
1057 #if ( configUSE_MUTEXES == 1 )
1059 uxCurrentBasePriority = pxTCB->uxBasePriority;
1067 if( uxCurrentBasePriority != uxNewPriority )
1071 if( uxNewPriority > uxCurrentBasePriority )
1113 #if ( configUSE_MUTEXES == 1 )
1117 if( pxTCB->uxBasePriority == pxTCB->
uxPriority )
1127 pxTCB->uxBasePriority = uxNewPriority;
1173 if( xYieldRequired ==
pdTRUE )
1184 ( void ) uxPriorityUsedOnEntry;
1193 #if ( INCLUDE_vTaskSuspend == 1 )
1234 if( xSchedulerRunning !=
pdFALSE )
1261 if( xSchedulerRunning !=
pdFALSE )
1268 prvResetNextTaskUnblockTime();
1282 #if ( INCLUDE_vTaskSuspend == 1 )
1287 const TCB_t *
const pxTCB = (
TCB_t * ) xTask;
1328 #if ( INCLUDE_vTaskSuspend == 1 )
1332 TCB_t *
const pxTCB = (
TCB_t * ) xTaskToResume;
1343 if( prvTaskIsTaskSuspended( pxTCB ) ==
pdTRUE )
1382 #if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) )
1387 TCB_t *
const pxTCB = (
TCB_t * ) xTaskToResume;
1412 if( prvTaskIsTaskSuspended( pxTCB ) ==
pdTRUE )
1448 return xYieldRequired;
1459 #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )
1472 #if ( configUSE_TIMERS == 1 )
1494 #if ( configUSE_NEWLIB_REENTRANT == 1 )
1502 xSchedulerRunning =
pdTRUE;
1549 ++uxSchedulerSuspended;
1553 #if ( configUSE_TICKLESS_IDLE != 0 )
1555 static TickType_t prvGetExpectedIdleTime(
void )
1572 xReturn = xNextTaskUnblockTime - xTickCount;
1597 --uxSchedulerSuspended;
1599 if( uxSchedulerSuspended == (
UBaseType_t ) pdFALSE )
1648 if( xYieldPending ==
pdTRUE )
1650 #if( configUSE_PREEMPTION != 0 )
1652 xAlreadyYielded =
pdTRUE;
1670 return xAlreadyYielded;
1681 xTicks = xTickCount;
1712 xReturn = xTickCount;
1724 return uxCurrentNumberOfTasks;
1728 #if ( INCLUDE_pcTaskGetTaskName == 1 )
1743 #if ( configUSE_TRACE_FACILITY == 1 )
1752 if( uxArraySize >= uxCurrentNumberOfTasks )
1759 uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ),
eReady );
1765 uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), (
List_t * ) pxDelayedTaskList,
eBlocked );
1766 uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), (
List_t * ) pxOverflowDelayedTaskList,
eBlocked );
1768 #if( INCLUDE_vTaskDelete == 1 )
1772 uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination,
eDeleted );
1776 #if ( INCLUDE_vTaskSuspend == 1 )
1780 uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList,
eSuspended );
1784 #if ( configGENERATE_RUN_TIME_STATS == 1)
1786 if( pulTotalRunTime != NULL )
1788 #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
1789 portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) );
1791 *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE();
1797 if( pulTotalRunTime != NULL )
1799 *pulTotalRunTime = 0;
1817 #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )
1824 return xIdleTaskHandle;
1834 #if ( configUSE_TICKLESS_IDLE != 0 )
1841 configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime );
1842 xTickCount += xTicksToJump;
1859 if( uxSchedulerSuspended == (
UBaseType_t ) pdFALSE )
1868 const TickType_t xConstTickCount = xTickCount;
1883 if( xConstTickCount >= xNextTaskUnblockTime )
1906 if( xConstTickCount < xItemValue )
1913 xNextTaskUnblockTime = xItemValue;
1941 #if ( configUSE_PREEMPTION == 1 )
1949 xSwitchRequired =
pdTRUE;
1965 #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) )
1969 xSwitchRequired =
pdTRUE;
1978 #if ( configUSE_TICK_HOOK == 1 )
1999 #if ( configUSE_TICK_HOOK == 1 )
2006 #if ( configUSE_PREEMPTION == 1 )
2008 if( xYieldPending != pdFALSE )
2010 xSwitchRequired =
pdTRUE;
2019 return xSwitchRequired;
2023 #if ( configUSE_APPLICATION_TASK_TAG == 1 )
2037 xTCB = (
TCB_t * ) xTask;
2043 xTCB->pxTaskTag = pxHookFunction;
2050 #if ( configUSE_APPLICATION_TASK_TAG == 1 )
2064 xTCB = (
TCB_t * ) xTask;
2071 xReturn = xTCB->pxTaskTag;
2081 #if ( configUSE_APPLICATION_TASK_TAG == 1 )
2095 xTCB = (
TCB_t * ) xTask;
2098 if( xTCB->pxTaskTag != NULL )
2100 xReturn = xTCB->pxTaskTag( pvParameter );
2115 if( uxSchedulerSuspended != (
UBaseType_t ) pdFALSE )
2126 #if ( configGENERATE_RUN_TIME_STATS == 1 )
2128 #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE
2129 portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime );
2131 ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE();
2141 if( ulTotalRunTime > ulTaskSwitchedInTime )
2143 pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime );
2149 ulTaskSwitchedInTime = ulTotalRunTime;
2160 #if ( configUSE_NEWLIB_REENTRANT == 1 )
2200 #if ( INCLUDE_vTaskSuspend == 1 )
2214 xTimeToWake = xTickCount + xTicksToWait;
2215 prvAddCurrentTaskToDelayedList( xTimeToWake );
2223 xTimeToWake = xTickCount + xTicksToWait;
2224 prvAddCurrentTaskToDelayedList( xTimeToWake );
2266 #if ( INCLUDE_vTaskSuspend == 1 )
2280 xTimeToWake = xTickCount + xTicksToWait;
2281 prvAddCurrentTaskToDelayedList( xTimeToWake );
2289 xTimeToWake = xTickCount + xTicksToWait;
2290 prvAddCurrentTaskToDelayedList( xTimeToWake );
2296 #if configUSE_TIMERS == 1
2332 xTimeToWake = xTickCount + xTicksToWait;
2335 prvAddCurrentTaskToDelayedList( xTimeToWake );
2343 TCB_t *pxUnblockedTCB;
2397 TCB_t *pxUnblockedTCB;
2458 const TickType_t xConstTickCount = xTickCount;
2460 #if ( INCLUDE_vTaskSuspend == 1 )
2479 else if( ( xConstTickCount - pxTimeOut->
xTimeOnEntering ) < *pxTicksToWait )
2503 #if ( configUSE_TRACE_FACILITY == 1 )
2512 pxTCB = (
TCB_t * ) xTask;
2513 uxReturn = pxTCB->uxTaskNumber;
2526 #if ( configUSE_TRACE_FACILITY == 1 )
2534 pxTCB = (
TCB_t * ) xTask;
2535 pxTCB->uxTaskNumber = uxHandle;
2555 ( void ) pvParameters;
2560 prvCheckTasksWaitingTermination();
2562 #if ( configUSE_PREEMPTION == 0 )
2572 #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) )
2594 #if ( configUSE_IDLE_HOOK == 1 )
2611 #if ( configUSE_TICKLESS_IDLE != 0 )
2620 xExpectedIdleTime = prvGetExpectedIdleTime();
2630 xExpectedIdleTime = prvGetExpectedIdleTime();
2655 #if configUSE_TICKLESS_IDLE != 0
2666 else if( xYieldPending != pdFALSE )
2673 #if configUSE_TIMERS == 0
2699 static void prvInitialiseTCBVariables(
TCB_t *
const pxTCB,
const char *
const pcName,
UBaseType_t uxPriority,
const MemoryRegion_t *
const xRegions,
const uint16_t usStackDepth )
2711 if( pcName[ x ] == 0x00 )
2727 if( uxPriority >= (
UBaseType_t ) configMAX_PRIORITIES )
2737 #if ( configUSE_MUTEXES == 1 )
2739 pxTCB->uxBasePriority = uxPriority;
2754 #if ( portCRITICAL_NESTING_IN_TCB == 1 )
2760 #if ( configUSE_APPLICATION_TASK_TAG == 1 )
2762 pxTCB->pxTaskTag = NULL;
2766 #if ( configGENERATE_RUN_TIME_STATS == 1 )
2768 pxTCB->ulRunTimeCounter = 0UL;
2772 #if ( portUSING_MPU_WRAPPERS == 1 )
2774 vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, pxTCB->
pxStack, usStackDepth );
2779 ( void ) usStackDepth;
2783 #if ( configUSE_NEWLIB_REENTRANT == 1 )
2786 _REENT_INIT_PTR( ( &( pxTCB->xNewLib_reent ) ) );
2792 #if ( portUSING_MPU_WRAPPERS == 1 )
2801 vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, NULL, 0 );
2807 static void prvInitialiseTaskLists(
void )
2820 #if ( INCLUDE_vTaskDelete == 1 )
2826 #if ( INCLUDE_vTaskSuspend == 1 )
2834 pxDelayedTaskList = &xDelayedTaskList1;
2835 pxOverflowDelayedTaskList = &xDelayedTaskList2;
2839 static void prvCheckTasksWaitingTermination(
void )
2841 #if ( INCLUDE_vTaskDelete == 1 )
2855 if( xListIsEmpty == pdFALSE )
2863 --uxCurrentNumberOfTasks;
2868 prvDeleteTCB( pxTCB );
2880 static void prvAddCurrentTaskToDelayedList(
const TickType_t xTimeToWake )
2885 if( xTimeToWake < xTickCount )
2898 if( xTimeToWake < xNextTaskUnblockTime )
2900 xNextTaskUnblockTime = xTimeToWake;
2910 static TCB_t *prvAllocateTCBAndStack(
const uint16_t usStackDepth,
StackType_t *
const puxStackBuffer )
2918 if( pxNewTCB != NULL )
2925 if( pxNewTCB->
pxStack == NULL )
2934 #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) )
2947 #if ( configUSE_TRACE_FACILITY == 1 )
2951 volatile TCB_t *pxNextTCB, *pxFirstTCB;
2968 pxTaskStatusArray[ uxTask ].
xTaskNumber = pxNextTCB->uxTCBNumber;
2972 #if ( INCLUDE_vTaskSuspend == 1 )
2987 #if ( configUSE_MUTEXES == 1 )
2989 pxTaskStatusArray[ uxTask ].
uxBasePriority = pxNextTCB->uxBasePriority;
2997 #if ( configGENERATE_RUN_TIME_STATS == 1 )
2999 pxTaskStatusArray[ uxTask ].
ulRunTimeCounter = pxNextTCB->ulRunTimeCounter;
3007 #if ( portSTACK_GROWTH > 0 )
3009 pxTaskStatusArray[ uxTask ].
usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxNextTCB->pxEndOfStack );
3019 }
while( pxNextTCB != pxFirstTCB );
3032 #if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) )
3034 static uint16_t prvTaskCheckFreeStackSpace(
const uint8_t * pucStackByte )
3036 uint32_t ulCount = 0U;
3046 return ( uint16_t ) ulCount;
3052 #if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 )
3057 uint8_t *pucEndOfStack;
3062 #if portSTACK_GROWTH < 0
3064 pucEndOfStack = ( uint8_t * ) pxTCB->
pxStack;
3068 pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack;
3072 uxReturn = (
UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack );
3080 #if ( INCLUDE_vTaskDelete == 1 )
3082 static void prvDeleteTCB(
TCB_t *pxTCB )
3091 #if ( configUSE_NEWLIB_REENTRANT == 1 )
3093 _reclaim_reent( &( pxTCB->xNewLib_reent ) );
3103 static void prvResetNextTaskUnblockTime(
void )
3128 #if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) )
3145 #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) )
3151 if( xSchedulerRunning == pdFALSE )
3157 if( uxSchedulerSuspended == (
UBaseType_t ) pdFALSE )
3173 #if ( configUSE_MUTEXES == 1 )
3177 TCB_t *
const pxTCB = (
TCB_t * ) pxMutexHolder;
3181 if( pxMutexHolder != NULL )
3236 #if ( configUSE_MUTEXES == 1 )
3240 TCB_t *
const pxTCB = (
TCB_t * ) pxMutexHolder;
3242 if( pxMutexHolder != NULL )
3244 if( pxTCB->
uxPriority != pxTCB->uxBasePriority )
3288 #if ( portCRITICAL_NESTING_IN_TCB == 1 )
3290 void vTaskEnterCritical(
void )
3294 if( xSchedulerRunning != pdFALSE )
3307 #if ( portCRITICAL_NESTING_IN_TCB == 1 )
3309 void vTaskExitCritical(
void )
3311 if( xSchedulerRunning != pdFALSE )
3340 #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) )
3374 *pcWriteBuffer = 0x00;
3378 uxArraySize = uxCurrentNumberOfTasks;
3383 if( pxTaskStatusArray != NULL )
3389 for( x = 0; x < uxArraySize; x++ )
3391 switch( pxTaskStatusArray[ x ].eCurrentState )
3411 sprintf( pcWriteBuffer,
"%s\t\t%c\t%u\t%u\t%u\r\n", pxTaskStatusArray[ x ].pcTaskName, cStatus, (
unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, (
unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, (
unsigned int ) pxTaskStatusArray[ x ].xTaskNumber );
3412 pcWriteBuffer += strlen( pcWriteBuffer );
3427 #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) )
3433 uint32_t ulTotalTime, ulStatsAsPercentage;
3435 #if( configUSE_TRACE_FACILITY != 1 )
3437 #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats().
3467 *pcWriteBuffer = 0x00;
3471 uxArraySize = uxCurrentNumberOfTasks;
3476 if( pxTaskStatusArray != NULL )
3482 ulTotalTime /= 100UL;
3485 if( ulTotalTime > 0 )
3488 for( x = 0; x < uxArraySize; x++ )
3493 ulStatsAsPercentage = pxTaskStatusArray[ x ].
ulRunTimeCounter / ulTotalTime;
3495 if( ulStatsAsPercentage > 0UL )
3497 #ifdef portLU_PRINTF_SPECIFIER_REQUIRED
3499 sprintf( pcWriteBuffer,
"%s\t\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage );
3505 sprintf( pcWriteBuffer,
"%s\t\t%u\t\t%u%%\r\n", pxTaskStatusArray[ x ].pcTaskName, (
unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, (
unsigned int ) ulStatsAsPercentage );
3513 #ifdef portLU_PRINTF_SPECIFIER_REQUIRED
3515 sprintf( pcWriteBuffer,
"%s\t\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, pxTaskStatusArray[ x ].ulRunTimeCounter );
3521 sprintf( pcWriteBuffer,
"%s\t\t%u\t\t<1%%\r\n", pxTaskStatusArray[ x ].pcTaskName, (
unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter );
3526 pcWriteBuffer += strlen( pcWriteBuffer );
3560 #ifdef FREERTOS_MODULE_TEST
3561 #include "tasks_test_access_functions.h"
#define taskSECOND_CHECK_FOR_STACK_OVERFLOW()
void vPortFree(void *pv) PRIVILEGED_FUNCTION
#define portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime)
#define listGET_LIST_ITEM_VALUE(pxListItem)
BaseType_t(* TaskHookFunction_t)(void *)
#define listGET_OWNER_OF_NEXT_ENTRY(pxTCB, pxList)
void vApplicationTickHook(void)
int sprintf(char *out, const char *format,...)
UBaseType_t uxBasePriority
void vTaskSetTaskNumber(TaskHandle_t xTask, const UBaseType_t uxHandle) PRIVILEGED_FUNCTION
#define traceLOW_POWER_IDLE_END()
BaseType_t xTaskRemoveFromUnorderedEventList(ListItem_t *pxEventListItem, const TickType_t xItemValue)
void vTaskGetRunTimeStats(char *pcWriteBuffer) PRIVILEGED_FUNCTION
void vTaskSwitchContext(void)
#define listIS_CONTAINED_WITHIN(pxList, pxListItem)
BaseType_t xTaskCheckForTimeOut(TimeOut_t *const pxTimeOut, TickType_t *const pxTicksToWait)
TaskHandle_t xTaskGetCurrentTaskHandle(void) PRIVILEGED_FUNCTION
#define traceTASK_SUSPEND(pxTaskToSuspend)
#define mtCOVERAGE_TEST_MARKER()
#define traceTASK_DELAY()
#define listLIST_ITEM_CONTAINER(pxListItem)
void vTaskSuspendAll(void)
void vTaskEndScheduler(void)
#define configEXPECTED_IDLE_TIME_BEFORE_SLEEP
#define taskEXIT_CRITICAL()
#define traceTASK_CREATE(pxNewTCB)
PRIVILEGED_DATA TCB_t *volatile pxCurrentTCB
void vTaskPrioritySet(TaskHandle_t xTask, UBaseType_t uxNewPriority) PRIVILEGED_FUNCTION
uint32_t ulRunTimeCounter
#define portENABLE_INTERRUPTS()
#define taskSCHEDULER_NOT_STARTED
#define traceTASK_DELAY_UNTIL()
void vTaskPlaceOnEventListRestricted(List_t *const pxEventList, const TickType_t xTicksToWait) PRIVILEGED_FUNCTION
#define tskSTACK_FILL_BYTE
#define portDISABLE_INTERRUPTS()
#define traceLOW_POWER_IDLE_BEGIN()
#define prvAddTaskToReadyList(pxTCB)
#define tskIDLE_STACK_SIZE
#define taskSCHEDULER_RUNNING
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume) PRIVILEGED_FUNCTION
void vApplicationStackOverflowHook(xTaskHandle pxTask, signed char *pcTaskName)
void * pvPortMalloc(size_t xSize) PRIVILEGED_FUNCTION
#define listSET_LIST_ITEM_VALUE(pxListItem, xValue)
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(uxSavedStatusValue)
#define portYIELD_WITHIN_API
#define traceTASK_PRIORITY_INHERIT(pxTCBOfMutexHolder, uxInheritedPriority)
void vListInsertEnd(List_t *const pxList, ListItem_t *const pxNewListItem)
BaseType_t xTaskCallApplicationTaskHook(TaskHandle_t xTask, void *pvParameter) PRIVILEGED_FUNCTION
BaseType_t xTaskRemoveFromEventList(const List_t *const pxEventList)
#define listLIST_IS_EMPTY(pxList)
void vTaskList(char *pcWriteBuffer) PRIVILEGED_FUNCTION
TickType_t xTimeOnEntering
#define traceTASK_RESUME(pxTaskToResume)
#define configMAX_PRIORITIES
void vPortEndScheduler(void) PRIVILEGED_FUNCTION
#define portRESET_READY_PRIORITY(uxPriority, uxTopReadyPriority)
void vApplicationIdleHook(void)
unsigned long UBaseType_t
#define traceINCREASE_TICK_COUNT(x)
#define traceTASK_SWITCHED_IN()
void vTaskStepTick(const TickType_t xTicksToJump) PRIVILEGED_FUNCTION
#define portSET_INTERRUPT_MASK_FROM_ISR()
BaseType_t xPortStartScheduler(void) PRIVILEGED_FUNCTION
StackType_t * pxPortInitialiseStack(StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters) PRIVILEGED_FUNCTION
#define traceTASK_SWITCHED_OUT()
UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask) PRIVILEGED_FUNCTION
#define listSET_LIST_ITEM_OWNER(pxListItem, pxOwner)
void vTaskPriorityDisinherit(TaskHandle_t const pxMutexHolder) PRIVILEGED_FUNCTION
ListItem_t xGenericListItem
#define errCOULD_NOT_ALLOCATE_REQUIRED_MEMORY
#define portPRIVILEGE_BIT
#define prvGetTCBFromHandle(pxHandle)
char * pcTaskGetTaskName(TaskHandle_t xTaskToQuery) PRIVILEGED_FUNCTION
TickType_t uxTaskResetEventItemValue(void)
void vTaskDelete(TaskHandle_t xTaskToDelete) PRIVILEGED_FUNCTION
UBaseType_t uxTaskGetTaskNumber(TaskHandle_t xTask) PRIVILEGED_FUNCTION
#define traceTASK_PRIORITY_SET(pxTask, uxNewPriority)
#define taskRESET_READY_PRIORITY(uxPriority)
UBaseType_t uxTaskGetStackHighWaterMark(TaskHandle_t xTask) PRIVILEGED_FUNCTION
void vTaskDelayUntil(TickType_t *const pxPreviousWakeTime, const TickType_t xTimeIncrement) PRIVILEGED_FUNCTION
void vTaskSuspend(TaskHandle_t xTaskToSuspend) PRIVILEGED_FUNCTION
#define traceTASK_PRIORITY_DISINHERIT(pxTCBOfMutexHolder, uxOriginalPriority)
#define listGET_OWNER_OF_HEAD_ENTRY(pxList)
UBaseType_t uxTaskGetSystemState(TaskStatus_t *const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t *const pulTotalRunTime)
void vTaskPriorityInherit(TaskHandle_t const pxMutexHolder) PRIVILEGED_FUNCTION
#define traceTASK_CREATE_FAILED()
UBaseType_t uxTaskGetNumberOfTasks(void)
char pcTaskName[configMAX_TASK_NAME_LEN]
void vTaskStartScheduler(void)
void vTaskSetTimeOutState(TimeOut_t *const pxTimeOut)
ListItem_t xEventListItem
#define portPRE_TASK_DELETE_HOOK(pvTaskToDelete, pxYieldPending)
#define pvPortMallocAligned(x, puxStackBuffer)
void vTaskPlaceOnUnorderedEventList(List_t *pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait)
#define tskSUSPENDED_CHAR
#define portSETUP_TCB(pxTCB)
void vTaskResume(TaskHandle_t xTaskToResume) PRIVILEGED_FUNCTION
void vTaskAllocateMPURegions(TaskHandle_t xTask, const MemoryRegion_t *const pxRegions) PRIVILEGED_FUNCTION
void(* TaskFunction_t)(void *)
volatile StackType_t * pxTopOfStack
TickType_t xTaskGetTickCount(void)
BaseType_t xTaskGetSchedulerState(void) PRIVILEGED_FUNCTION
#define taskYIELD_IF_USING_PREEMPTION()
#define taskENTER_CRITICAL()
#define portTASK_FUNCTION_PROTO(vFunction, pvParameters)
#define portPOINTER_SIZE_TYPE
eSleepModeStatus eTaskConfirmSleepModeStatus(void) PRIVILEGED_FUNCTION
#define listGET_LIST_ITEM_OWNER(pxListItem)
BaseType_t xTaskResumeAll(void)
#define taskSELECT_HIGHEST_PRIORITY_TASK()
BaseType_t xTaskGenericCreate(TaskFunction_t pxTaskCode, const char *const pcName, const uint16_t usStackDepth, void *const pvParameters, UBaseType_t uxPriority, TaskHandle_t *const pxCreatedTask, StackType_t *const puxStackBuffer, const MemoryRegion_t *const xRegions) PRIVILEGED_FUNCTION
#define PRIVILEGED_FUNCTION
void vTaskDelay(const TickType_t xTicksToDelay) PRIVILEGED_FUNCTION
BaseType_t xOverflowCount
#define traceTASK_INCREMENT_TICK(xTickCount)
#define vPortFreeAligned(pvBlockToFree)
#define taskEVENT_LIST_ITEM_VALUE_IN_USE
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
#define traceTASK_RESUME_FROM_ISR(pxTaskToResume)
TaskHandle_t xTaskGetIdleTaskHandle(void)
#define taskSCHEDULER_SUSPENDED
BaseType_t xTimerCreateTimerTask(void) PRIVILEGED_FUNCTION
#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()
#define taskFIRST_CHECK_FOR_STACK_OVERFLOW()
void vListInitialise(List_t *const pxList)
#define listCURRENT_LIST_LENGTH(pxList)
#define xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask)
TickType_t xTaskGetTickCountFromISR(void)
#define taskSWITCH_DELAYED_LISTS()
void vTaskPlaceOnEventList(List_t *const pxEventList, const TickType_t xTicksToWait)
uint16_t usStackHighWaterMark
void vTaskMissedYield(void)
void vListInitialiseItem(ListItem_t *const pxItem)
#define traceTASK_DELETE(pxTaskToDelete)
eTaskState eTaskGetState(TaskHandle_t xTask) PRIVILEGED_FUNCTION
BaseType_t xTaskIncrementTick(void)
portSTACK_TYPE StackType_t
#define portCLEAN_UP_TCB(pxTCB)
UBaseType_t uxCurrentPriority
#define portTASK_FUNCTION(vFunction, pvParameters)
#define configMAX_TASK_NAME_LEN
struct tskTaskControlBlock tskTCB
void vListInsert(List_t *const pxList, ListItem_t *const pxNewListItem)
UBaseType_t uxListRemove(ListItem_t *const pxItemToRemove)