77 #define MPU_WRAPPERS_INCLUDED_FROM_API_FILE 89 #undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE 93 #if ( configUSE_STATS_FORMATTING_FUNCTIONS == 1 ) 102 #if( configUSE_TICKLESS_IDLE != 0 ) 103 #if( INCLUDE_vTaskSuspend != 1 ) 104 #error INCLUDE_vTaskSuspend must be set to 1 if configUSE_TICKLESS_IDLE is not set to 0 111 #define tskIDLE_STACK_SIZE configMINIMAL_STACK_SIZE 113 #if( configUSE_PREEMPTION == 0 ) 116 #define taskYIELD_IF_USING_PREEMPTION() 118 #define taskYIELD_IF_USING_PREEMPTION() portYIELD_WITHIN_API() 138 #if ( portUSING_MPU_WRAPPERS == 1 ) 139 xMPU_SETTINGS xMPUSettings;
149 #if ( portSTACK_GROWTH > 0 ) 153 #if ( portCRITICAL_NESTING_IN_TCB == 1 ) 157 #if ( configUSE_TRACE_FACILITY == 1 ) 162 #if ( configUSE_MUTEXES == 1 ) 167 #if ( configUSE_APPLICATION_TASK_TAG == 1 ) 171 #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS > 0 ) 175 #if ( configGENERATE_RUN_TIME_STATS == 1 ) 176 uint32_t ulRunTimeCounter;
179 #if ( configUSE_NEWLIB_REENTRANT == 1 ) 187 struct _reent xNewLib_reent;
190 #if ( configUSE_TASK_NOTIFICATIONS == 1 ) 191 volatile uint32_t ulNotifiedValue;
205 #ifdef portREMOVE_STATIC_QUALIFIER 222 #if ( INCLUDE_vTaskDelete == 1 ) 229 #if ( INCLUDE_vTaskSuspend == 1 ) 235 #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) 262 #if ( configGENERATE_RUN_TIME_STATS == 1 ) 277 #define tskSTACK_FILL_BYTE ( 0xa5U ) 282 #define tskBLOCKED_CHAR ( 'B' ) 283 #define tskREADY_CHAR ( 'R' ) 284 #define tskDELETED_CHAR ( 'D' ) 285 #define tskSUSPENDED_CHAR ( 'S' ) 289 #if ( configUSE_PORT_OPTIMISED_TASK_SELECTION == 0 ) 297 #define taskRECORD_READY_PRIORITY( uxPriority ) \ 299 if( ( uxPriority ) > uxTopReadyPriority ) \ 301 uxTopReadyPriority = ( uxPriority ); \ 307 #define taskSELECT_HIGHEST_PRIORITY_TASK() \ 310 while( listLIST_IS_EMPTY( &( pxReadyTasksLists[ uxTopReadyPriority ] ) ) ) \ 312 configASSERT( uxTopReadyPriority ); \ 313 --uxTopReadyPriority; \ 318 listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopReadyPriority ] ) ); \ 326 #define taskRESET_READY_PRIORITY( uxPriority ) 327 #define portRESET_READY_PRIORITY( uxPriority, uxTopReadyPriority ) 336 #define taskRECORD_READY_PRIORITY( uxPriority ) portRECORD_READY_PRIORITY( uxPriority, uxTopReadyPriority ) 340 #define taskSELECT_HIGHEST_PRIORITY_TASK() \ 342 UBaseType_t uxTopPriority; \ 345 portGET_HIGHEST_PRIORITY( uxTopPriority, uxTopReadyPriority ); \ 346 configASSERT( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ uxTopPriority ] ) ) > 0 ); \ 347 listGET_OWNER_OF_NEXT_ENTRY( pxCurrentTCB, &( pxReadyTasksLists[ uxTopPriority ] ) ); \ 355 #define taskRESET_READY_PRIORITY( uxPriority ) \ 357 if( listCURRENT_LIST_LENGTH( &( pxReadyTasksLists[ ( uxPriority ) ] ) ) == ( UBaseType_t ) 0 ) \ 359 portRESET_READY_PRIORITY( ( uxPriority ), ( uxTopReadyPriority ) ); \ 369 #define taskSWITCH_DELAYED_LISTS() \ 374 configASSERT( ( listLIST_IS_EMPTY( pxDelayedTaskList ) ) ); \ 376 pxTemp = pxDelayedTaskList; \ 377 pxDelayedTaskList = pxOverflowDelayedTaskList; \ 378 pxOverflowDelayedTaskList = pxTemp; \ 380 prvResetNextTaskUnblockTime(); \ 389 #define prvAddTaskToReadyList( pxTCB ) \ 390 traceMOVED_TASK_TO_READY_STATE( pxTCB ); \ 391 taskRECORD_READY_PRIORITY( ( pxTCB )->uxPriority ); \ 392 vListInsertEnd( &( pxReadyTasksLists[ ( pxTCB )->uxPriority ] ), &( ( pxTCB )->xGenericListItem ) ) 401 #define prvGetTCBFromHandle( pxHandle ) ( ( ( pxHandle ) == NULL ) ? ( TCB_t * ) pxCurrentTCB : ( TCB_t * ) ( pxHandle ) ) 411 #if configUSE_16_BIT_TICKS == 1 412 #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x8000U 414 #define taskEVENT_LIST_ITEM_VALUE_IN_USE 0x80000000UL 418 #if configCHECK_FOR_STACK_OVERFLOW > 0 422 #if configUSE_TICK_HOOK > 0 423 extern void vApplicationTickHook(
void );
439 #if ( INCLUDE_vTaskSuspend == 1 ) 469 #if ( INCLUDE_vTaskDelete == 1 ) 480 static void prvCheckTasksWaitingTermination(
void ) PRIVILEGED_FUNCTION;
486 static
void prvAddCurrentTaskToDelayedList( const
TickType_t xTimeToWake ) PRIVILEGED_FUNCTION;
492 static
TCB_t *prvAllocateTCBAndStack( const uint16_t usStackDepth,
StackType_t * const puxStackBuffer ) PRIVILEGED_FUNCTION;
502 #if ( configUSE_TRACE_FACILITY == 1 ) 513 #if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) 515 static uint16_t prvTaskCheckFreeStackSpace(
const uint8_t * pucStackByte )
PRIVILEGED_FUNCTION;
528 #if ( configUSE_TICKLESS_IDLE != 0 ) 530 static TickType_t prvGetExpectedIdleTime(
void ) PRIVILEGED_FUNCTION;
538 static void prvResetNextTaskUnblockTime(
void );
540 #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) 546 static char *prvWriteNameToBuffer(
char *pcBuffer,
const char *
pcTaskName );
562 pxNewTCB = prvAllocateTCBAndStack( usStackDepth, puxStackBuffer );
564 if( pxNewTCB !=
NULL )
566 #if( portUSING_MPU_WRAPPERS == 1 ) 577 uxPriority &= ~portPRIVILEGE_BIT;
579 if( puxStackBuffer !=
NULL )
584 pxNewTCB->xUsingStaticallyAllocatedStack =
pdTRUE;
590 pxNewTCB->xUsingStaticallyAllocatedStack =
pdFALSE;
598 #if( portSTACK_GROWTH < 0 ) 600 pxTopOfStack = pxNewTCB->
pxStack + ( usStackDepth - ( uint16_t ) 1 );
608 pxTopOfStack = pxNewTCB->
pxStack;
616 pxNewTCB->pxEndOfStack = pxNewTCB->
pxStack + ( usStackDepth - 1 );
621 prvInitialiseTCBVariables( pxNewTCB, pcName, uxPriority, xRegions, usStackDepth );
627 #if( portUSING_MPU_WRAPPERS == 1 ) 637 if( (
void * ) pxCreatedTask !=
NULL )
653 uxCurrentNumberOfTasks++;
665 prvInitialiseTaskLists();
677 if( xSchedulerRunning ==
pdFALSE )
696 #if ( configUSE_TRACE_FACILITY == 1 ) 699 pxNewTCB->uxTCBNumber = uxTaskNumber;
719 if( xSchedulerRunning !=
pdFALSE )
742 #if ( INCLUDE_vTaskDelete == 1 ) 794 if( xSchedulerRunning !=
pdFALSE )
814 prvResetNextTaskUnblockTime();
824 #if ( INCLUDE_vTaskDelayUntil == 1 ) 839 const TickType_t xConstTickCount = xTickCount;
842 xTimeToWake = *pxPreviousWakeTime + xTimeIncrement;
844 if( xConstTickCount < *pxPreviousWakeTime )
851 if( ( xTimeToWake < *pxPreviousWakeTime ) && ( xTimeToWake > xConstTickCount ) )
865 if( ( xTimeToWake < *pxPreviousWakeTime ) || ( xTimeToWake > xConstTickCount ) )
876 *pxPreviousWakeTime = xTimeToWake;
896 prvAddCurrentTaskToDelayedList( xTimeToWake );
907 if( xAlreadyYielded ==
pdFALSE )
920 #if ( INCLUDE_vTaskDelay == 1 ) 946 xTimeToWake = xTickCount + xTicksToDelay;
962 prvAddCurrentTaskToDelayedList( xTimeToWake );
973 if( xAlreadyYielded ==
pdFALSE )
986 #if ( INCLUDE_eTaskGetState == 1 ) 992 const TCB_t *
const pxTCB = (
TCB_t * ) xTask;
1009 if( ( pxStateList == pxDelayedTaskList ) || ( pxStateList == pxOverflowDelayedTaskList ) )
1016 #if ( INCLUDE_vTaskSuspend == 1 ) 1017 else if( pxStateList == &xSuspendedTaskList )
1033 #if ( INCLUDE_vTaskDelete == 1 ) 1034 else if( pxStateList == &xTasksWaitingTermination )
1056 #if ( INCLUDE_uxTaskPriorityGet == 1 ) 1078 #if ( INCLUDE_uxTaskPriorityGet == 1 ) 1118 #if ( INCLUDE_vTaskPrioritySet == 1 ) 1123 UBaseType_t uxCurrentBasePriority, uxPriorityUsedOnEntry;
1146 #if ( configUSE_MUTEXES == 1 ) 1148 uxCurrentBasePriority = pxTCB->uxBasePriority;
1156 if( uxCurrentBasePriority != uxNewPriority )
1160 if( uxNewPriority > uxCurrentBasePriority )
1202 #if ( configUSE_MUTEXES == 1 ) 1206 if( pxTCB->uxBasePriority == pxTCB->
uxPriority )
1216 pxTCB->uxBasePriority = uxNewPriority;
1262 if( xYieldRequired ==
pdTRUE )
1273 ( void ) uxPriorityUsedOnEntry;
1282 #if ( INCLUDE_vTaskSuspend == 1 ) 1323 if( xSchedulerRunning !=
pdFALSE )
1350 if( xSchedulerRunning !=
pdFALSE )
1357 prvResetNextTaskUnblockTime();
1371 #if ( INCLUDE_vTaskSuspend == 1 ) 1376 const TCB_t *
const pxTCB = (
TCB_t * ) xTask;
1417 #if ( INCLUDE_vTaskSuspend == 1 ) 1421 TCB_t *
const pxTCB = (
TCB_t * ) xTaskToResume;
1432 if( prvTaskIsTaskSuspended( pxTCB ) ==
pdTRUE )
1471 #if ( ( INCLUDE_xTaskResumeFromISR == 1 ) && ( INCLUDE_vTaskSuspend == 1 ) ) 1476 TCB_t *
const pxTCB = (
TCB_t * ) xTaskToResume;
1501 if( prvTaskIsTaskSuspended( pxTCB ) ==
pdTRUE )
1537 return xYieldRequired;
1548 #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) 1561 #if ( configUSE_TIMERS == 1 ) 1583 #if ( configUSE_NEWLIB_REENTRANT == 1 ) 1592 xSchedulerRunning =
pdTRUE;
1639 ++uxSchedulerSuspended;
1643 #if ( configUSE_TICKLESS_IDLE != 0 ) 1645 static TickType_t prvGetExpectedIdleTime(
void )
1662 xReturn = xNextTaskUnblockTime - xTickCount;
1687 --uxSchedulerSuspended;
1689 if( uxSchedulerSuspended == (
UBaseType_t ) pdFALSE )
1738 if( xYieldPending ==
pdTRUE )
1740 #if( configUSE_PREEMPTION != 0 ) 1742 xAlreadyYielded =
pdTRUE;
1760 return xAlreadyYielded;
1771 xTicks = xTickCount;
1802 xReturn = xTickCount;
1814 return uxCurrentNumberOfTasks;
1818 #if ( INCLUDE_pcTaskGetTaskName == 1 ) 1833 #if ( configUSE_TRACE_FACILITY == 1 ) 1842 if( uxArraySize >= uxCurrentNumberOfTasks )
1849 uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &( pxReadyTasksLists[ uxQueue ] ),
eReady );
1855 uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), (
List_t * ) pxDelayedTaskList,
eBlocked );
1856 uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), (
List_t * ) pxOverflowDelayedTaskList,
eBlocked );
1858 #if( INCLUDE_vTaskDelete == 1 ) 1862 uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xTasksWaitingTermination,
eDeleted );
1866 #if ( INCLUDE_vTaskSuspend == 1 ) 1870 uxTask += prvListTaskWithinSingleList( &( pxTaskStatusArray[ uxTask ] ), &xSuspendedTaskList,
eSuspended );
1874 #if ( configGENERATE_RUN_TIME_STATS == 1) 1876 if( pulTotalRunTime !=
NULL )
1878 #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE 1879 portALT_GET_RUN_TIME_COUNTER_VALUE( ( *pulTotalRunTime ) );
1881 *pulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE();
1887 if( pulTotalRunTime !=
NULL )
1889 *pulTotalRunTime = 0;
1907 #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) 1914 return xIdleTaskHandle;
1924 #if ( configUSE_TICKLESS_IDLE != 0 ) 1931 configASSERT( ( xTickCount + xTicksToJump ) <= xNextTaskUnblockTime );
1932 xTickCount += xTicksToJump;
1949 if( uxSchedulerSuspended == (
UBaseType_t ) pdFALSE )
1958 const TickType_t xConstTickCount = xTickCount;
1973 if( xConstTickCount >= xNextTaskUnblockTime )
1996 if( xConstTickCount < xItemValue )
2003 xNextTaskUnblockTime = xItemValue;
2031 #if ( configUSE_PREEMPTION == 1 ) 2039 xSwitchRequired =
pdTRUE;
2055 #if ( ( configUSE_PREEMPTION == 1 ) && ( configUSE_TIME_SLICING == 1 ) ) 2059 xSwitchRequired =
pdTRUE;
2068 #if ( configUSE_TICK_HOOK == 1 ) 2074 vApplicationTickHook();
2089 #if ( configUSE_TICK_HOOK == 1 ) 2091 vApplicationTickHook();
2096 #if ( configUSE_PREEMPTION == 1 ) 2098 if( xYieldPending != pdFALSE )
2100 xSwitchRequired =
pdTRUE;
2109 return xSwitchRequired;
2113 #if ( configUSE_APPLICATION_TASK_TAG == 1 ) 2127 xTCB = (
TCB_t * ) xTask;
2133 xTCB->pxTaskTag = pxHookFunction;
2140 #if ( configUSE_APPLICATION_TASK_TAG == 1 ) 2154 xTCB = (
TCB_t * ) xTask;
2161 xReturn = xTCB->pxTaskTag;
2171 #if ( configUSE_APPLICATION_TASK_TAG == 1 ) 2185 xTCB = (
TCB_t * ) xTask;
2188 if( xTCB->pxTaskTag !=
NULL )
2190 xReturn = xTCB->pxTaskTag( pvParameter );
2205 if( uxSchedulerSuspended != (
UBaseType_t ) pdFALSE )
2216 #if ( configGENERATE_RUN_TIME_STATS == 1 ) 2218 #ifdef portALT_GET_RUN_TIME_COUNTER_VALUE 2219 portALT_GET_RUN_TIME_COUNTER_VALUE( ulTotalRunTime );
2221 ulTotalRunTime = portGET_RUN_TIME_COUNTER_VALUE();
2231 if( ulTotalRunTime > ulTaskSwitchedInTime )
2233 pxCurrentTCB->ulRunTimeCounter += ( ulTotalRunTime - ulTaskSwitchedInTime );
2239 ulTaskSwitchedInTime = ulTotalRunTime;
2251 #if ( configUSE_NEWLIB_REENTRANT == 1 ) 2291 #if ( INCLUDE_vTaskSuspend == 1 ) 2305 xTimeToWake = xTickCount + xTicksToWait;
2306 prvAddCurrentTaskToDelayedList( xTimeToWake );
2314 xTimeToWake = xTickCount + xTicksToWait;
2315 prvAddCurrentTaskToDelayedList( xTimeToWake );
2357 #if ( INCLUDE_vTaskSuspend == 1 ) 2371 xTimeToWake = xTickCount + xTicksToWait;
2372 prvAddCurrentTaskToDelayedList( xTimeToWake );
2380 xTimeToWake = xTickCount + xTicksToWait;
2381 prvAddCurrentTaskToDelayedList( xTimeToWake );
2387 #if configUSE_TIMERS == 1 2428 #if( INCLUDE_vTaskSuspend == 1 ) 2430 if( xWaitIndefinitely ==
pdTRUE )
2442 xTimeToWake = xTickCount + xTicksToWait;
2444 prvAddCurrentTaskToDelayedList( xTimeToWake );
2451 xTimeToWake = xTickCount + xTicksToWait;
2453 prvAddCurrentTaskToDelayedList( xTimeToWake );
2457 ( void ) xWaitIndefinitely;
2467 TCB_t *pxUnblockedTCB;
2515 #if( configUSE_TICKLESS_IDLE != 0 ) 2525 prvResetNextTaskUnblockTime();
2535 TCB_t *pxUnblockedTCB;
2596 const TickType_t xConstTickCount = xTickCount;
2598 #if ( INCLUDE_vTaskSuspend == 1 ) 2617 else if( ( xConstTickCount - pxTimeOut->
xTimeOnEntering ) < *pxTicksToWait )
2641 #if ( configUSE_TRACE_FACILITY == 1 ) 2650 pxTCB = (
TCB_t * ) xTask;
2651 uxReturn = pxTCB->uxTaskNumber;
2664 #if ( configUSE_TRACE_FACILITY == 1 ) 2672 pxTCB = (
TCB_t * ) xTask;
2673 pxTCB->uxTaskNumber = uxHandle;
2693 ( void ) pvParameters;
2698 prvCheckTasksWaitingTermination();
2700 #if ( configUSE_PREEMPTION == 0 ) 2710 #if ( ( configUSE_PREEMPTION == 1 ) && ( configIDLE_SHOULD_YIELD == 1 ) ) 2732 #if ( configUSE_IDLE_HOOK == 1 ) 2734 extern void vApplicationIdleHook(
void );
2741 vApplicationIdleHook();
2749 #if ( configUSE_TICKLESS_IDLE != 0 ) 2758 xExpectedIdleTime = prvGetExpectedIdleTime();
2768 xExpectedIdleTime = prvGetExpectedIdleTime();
2793 #if( configUSE_TICKLESS_IDLE != 0 ) 2806 else if( xYieldPending != pdFALSE )
2833 static void prvInitialiseTCBVariables(
TCB_t *
const pxTCB,
const char *
const pcName,
UBaseType_t uxPriority,
const MemoryRegion_t *
const xRegions,
const uint16_t usStackDepth )
2845 if( pcName[ x ] == 0x00 )
2861 if( uxPriority >= (
UBaseType_t ) configMAX_PRIORITIES )
2871 #if ( configUSE_MUTEXES == 1 ) 2874 pxTCB->uxMutexesHeld = 0;
2889 #if ( portCRITICAL_NESTING_IN_TCB == 1 ) 2895 #if ( configUSE_APPLICATION_TASK_TAG == 1 ) 2897 pxTCB->pxTaskTag =
NULL;
2901 #if ( configGENERATE_RUN_TIME_STATS == 1 ) 2903 pxTCB->ulRunTimeCounter = 0UL;
2907 #if ( portUSING_MPU_WRAPPERS == 1 ) 2909 vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions, pxTCB->
pxStack, usStackDepth );
2914 ( void ) usStackDepth;
2918 #if( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) 2922 pxTCB->pvThreadLocalStoragePointers[ x ] =
NULL;
2927 #if ( configUSE_TASK_NOTIFICATIONS == 1 ) 2929 pxTCB->ulNotifiedValue = 0;
2934 #if ( configUSE_NEWLIB_REENTRANT == 1 ) 2937 _REENT_INIT_PTR( ( &( pxTCB->xNewLib_reent ) ) );
2943 #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) 2952 pxTCB->pvThreadLocalStoragePointers[ xIndex ] = pvValue;
2959 #if ( configNUM_THREAD_LOCAL_STORAGE_POINTERS != 0 ) 2963 void *pvReturn =
NULL;
2969 pvReturn = pxTCB->pvThreadLocalStoragePointers[ xIndex ];
2982 #if ( portUSING_MPU_WRAPPERS == 1 ) 2992 vPortStoreTaskMPUSettings( &( pxTCB->xMPUSettings ), xRegions,
NULL, 0 );
2998 static void prvInitialiseTaskLists(
void )
3011 #if ( INCLUDE_vTaskDelete == 1 ) 3017 #if ( INCLUDE_vTaskSuspend == 1 ) 3025 pxDelayedTaskList = &xDelayedTaskList1;
3026 pxOverflowDelayedTaskList = &xDelayedTaskList2;
3030 static void prvCheckTasksWaitingTermination(
void )
3032 #if ( INCLUDE_vTaskDelete == 1 ) 3046 if( xListIsEmpty == pdFALSE )
3054 --uxCurrentNumberOfTasks;
3059 prvDeleteTCB( pxTCB );
3071 static void prvAddCurrentTaskToDelayedList(
const TickType_t xTimeToWake )
3076 if( xTimeToWake < xTickCount )
3089 if( xTimeToWake < xNextTaskUnblockTime )
3091 xNextTaskUnblockTime = xTimeToWake;
3101 static TCB_t *prvAllocateTCBAndStack(
const uint16_t usStackDepth,
StackType_t *
const puxStackBuffer )
3108 #if( portSTACK_GROWTH > 0 ) 3114 if( pxNewTCB !=
NULL )
3136 if( pxStack !=
NULL )
3142 if( pxNewTCB !=
NULL )
3161 if( pxNewTCB !=
NULL )
3164 #if( ( configCHECK_FOR_STACK_OVERFLOW > 1 ) || ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) 3176 #if ( configUSE_TRACE_FACILITY == 1 ) 3180 volatile TCB_t *pxNextTCB, *pxFirstTCB;
3197 pxTaskStatusArray[ uxTask ].
xTaskNumber = pxNextTCB->uxTCBNumber;
3201 #if ( INCLUDE_vTaskSuspend == 1 ) 3216 #if ( configUSE_MUTEXES == 1 ) 3218 pxTaskStatusArray[ uxTask ].
uxBasePriority = pxNextTCB->uxBasePriority;
3226 #if ( configGENERATE_RUN_TIME_STATS == 1 ) 3228 pxTaskStatusArray[ uxTask ].
ulRunTimeCounter = pxNextTCB->ulRunTimeCounter;
3236 #if ( portSTACK_GROWTH > 0 ) 3238 pxTaskStatusArray[ uxTask ].
usStackHighWaterMark = prvTaskCheckFreeStackSpace( ( uint8_t * ) pxNextTCB->pxEndOfStack );
3248 }
while( pxNextTCB != pxFirstTCB );
3261 #if ( ( configUSE_TRACE_FACILITY == 1 ) || ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) ) 3263 static uint16_t prvTaskCheckFreeStackSpace(
const uint8_t * pucStackByte )
3265 uint32_t ulCount = 0U;
3275 return ( uint16_t ) ulCount;
3281 #if ( INCLUDE_uxTaskGetStackHighWaterMark == 1 ) 3286 uint8_t *pucEndOfStack;
3291 #if portSTACK_GROWTH < 0 3293 pucEndOfStack = ( uint8_t * ) pxTCB->
pxStack;
3297 pucEndOfStack = ( uint8_t * ) pxTCB->pxEndOfStack;
3301 uxReturn = (
UBaseType_t ) prvTaskCheckFreeStackSpace( pucEndOfStack );
3309 #if ( INCLUDE_vTaskDelete == 1 ) 3311 static void prvDeleteTCB(
TCB_t *pxTCB )
3320 #if ( configUSE_NEWLIB_REENTRANT == 1 ) 3322 _reclaim_reent( &( pxTCB->xNewLib_reent ) );
3326 #if( portUSING_MPU_WRAPPERS == 1 ) 3330 if( pxTCB->xUsingStaticallyAllocatedStack == pdFALSE )
3347 static void prvResetNextTaskUnblockTime(
void )
3371 #if ( ( INCLUDE_xTaskGetCurrentTaskHandle == 1 ) || ( configUSE_MUTEXES == 1 ) ) 3388 #if ( ( INCLUDE_xTaskGetSchedulerState == 1 ) || ( configUSE_TIMERS == 1 ) ) 3394 if( xSchedulerRunning == pdFALSE )
3400 if( uxSchedulerSuspended == (
UBaseType_t ) pdFALSE )
3416 #if ( configUSE_MUTEXES == 1 ) 3420 TCB_t *
const pxTCB = (
TCB_t * ) pxMutexHolder;
3424 if( pxMutexHolder !=
NULL )
3482 #if ( configUSE_MUTEXES == 1 ) 3486 TCB_t *
const pxTCB = (
TCB_t * ) pxMutexHolder;
3489 if( pxMutexHolder !=
NULL )
3498 ( pxTCB->uxMutexesHeld )--;
3502 if( pxTCB->
uxPriority != pxTCB->uxBasePriority )
3563 #if ( portCRITICAL_NESTING_IN_TCB == 1 ) 3565 void vTaskEnterCritical(
void )
3569 if( xSchedulerRunning != pdFALSE )
3593 #if ( portCRITICAL_NESTING_IN_TCB == 1 ) 3595 void vTaskExitCritical(
void )
3597 if( xSchedulerRunning != pdFALSE )
3626 #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) 3628 static char *prvWriteNameToBuffer(
char *pcBuffer,
const char *
pcTaskName )
3633 strcpy( pcBuffer, pcTaskName );
3639 pcBuffer[ x ] =
' ';
3643 pcBuffer[ x ] = 0x00;
3646 return &( pcBuffer[ x ] );
3652 #if ( ( configUSE_TRACE_FACILITY == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) 3686 *pcWriteBuffer = 0x00;
3690 uxArraySize = uxCurrentNumberOfTasks;
3695 if( pxTaskStatusArray !=
NULL )
3701 for( x = 0; x < uxArraySize; x++ )
3703 switch( pxTaskStatusArray[ x ].eCurrentState )
3725 pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName );
3728 sprintf( pcWriteBuffer,
"\t%c\t%u\t%u\t%u\r\n", cStatus, (
unsigned int ) pxTaskStatusArray[ x ].uxCurrentPriority, (
unsigned int ) pxTaskStatusArray[ x ].usStackHighWaterMark, (
unsigned int ) pxTaskStatusArray[ x ].xTaskNumber );
3729 pcWriteBuffer += strlen( pcWriteBuffer );
3744 #if ( ( configGENERATE_RUN_TIME_STATS == 1 ) && ( configUSE_STATS_FORMATTING_FUNCTIONS > 0 ) ) 3750 uint32_t ulTotalTime, ulStatsAsPercentage;
3752 #if( configUSE_TRACE_FACILITY != 1 ) 3754 #error configUSE_TRACE_FACILITY must also be set to 1 in FreeRTOSConfig.h to use vTaskGetRunTimeStats(). 3784 *pcWriteBuffer = 0x00;
3788 uxArraySize = uxCurrentNumberOfTasks;
3793 if( pxTaskStatusArray !=
NULL )
3799 ulTotalTime /= 100UL;
3802 if( ulTotalTime > 0 )
3805 for( x = 0; x < uxArraySize; x++ )
3810 ulStatsAsPercentage = pxTaskStatusArray[ x ].
ulRunTimeCounter / ulTotalTime;
3815 pcWriteBuffer = prvWriteNameToBuffer( pcWriteBuffer, pxTaskStatusArray[ x ].pcTaskName );
3817 if( ulStatsAsPercentage > 0UL )
3819 #ifdef portLU_PRINTF_SPECIFIER_REQUIRED 3821 sprintf( pcWriteBuffer,
"\t%lu\t\t%lu%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter, ulStatsAsPercentage );
3827 sprintf( pcWriteBuffer,
"\t%u\t\t%u%%\r\n", (
unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter, (
unsigned int ) ulStatsAsPercentage );
3835 #ifdef portLU_PRINTF_SPECIFIER_REQUIRED 3837 sprintf( pcWriteBuffer,
"\t%lu\t\t<1%%\r\n", pxTaskStatusArray[ x ].ulRunTimeCounter );
3843 sprintf( pcWriteBuffer,
"\t%u\t\t<1%%\r\n", (
unsigned int ) pxTaskStatusArray[ x ].ulRunTimeCounter );
3848 pcWriteBuffer += strlen( pcWriteBuffer );
3882 #if ( configUSE_MUTEXES == 1 ) 3899 #if( configUSE_TASK_NOTIFICATIONS == 1 ) 3930 #if ( INCLUDE_vTaskSuspend == 1 ) 3946 xTimeToWake = xTickCount + xTicksToWait;
3947 prvAddCurrentTaskToDelayedList( xTimeToWake );
3956 xTimeToWake = xTickCount + xTicksToWait;
3957 prvAddCurrentTaskToDelayedList( xTimeToWake );
3986 if( ulReturn != 0UL )
3988 if( xClearCountOnExit != pdFALSE )
4012 #if( configUSE_TASK_NOTIFICATIONS == 1 ) 4027 pxCurrentTCB->ulNotifiedValue &= ~ulBitsToClearOnEntry;
4048 #if ( INCLUDE_vTaskSuspend == 1 ) 4064 xTimeToWake = xTickCount + xTicksToWait;
4065 prvAddCurrentTaskToDelayedList( xTimeToWake );
4074 xTimeToWake = xTickCount + xTicksToWait;
4075 prvAddCurrentTaskToDelayedList( xTimeToWake );
4103 if( pulNotificationValue !=
NULL )
4137 #if( configUSE_TASK_NOTIFICATIONS == 1 ) 4146 pxTCB = (
TCB_t * ) xTaskToNotify;
4150 if( pulPreviousNotificationValue !=
NULL )
4152 *pulPreviousNotificationValue = pxTCB->ulNotifiedValue;
4155 eOriginalNotifyState = pxTCB->eNotifyState;
4162 pxTCB->ulNotifiedValue |= ulValue;
4166 ( pxTCB->ulNotifiedValue )++;
4170 pxTCB->ulNotifiedValue = ulValue;
4176 pxTCB->ulNotifiedValue = ulValue;
4203 #if( configUSE_TICKLESS_IDLE != 0 ) 4215 prvResetNextTaskUnblockTime();
4243 #if( configUSE_TASK_NOTIFICATIONS == 1 ) 4272 pxTCB = (
TCB_t * ) xTaskToNotify;
4276 if( pulPreviousNotificationValue !=
NULL )
4278 *pulPreviousNotificationValue = pxTCB->ulNotifiedValue;
4281 eOriginalNotifyState = pxTCB->eNotifyState;
4287 pxTCB->ulNotifiedValue |= ulValue;
4291 ( pxTCB->ulNotifiedValue )++;
4295 pxTCB->ulNotifiedValue = ulValue;
4301 pxTCB->ulNotifiedValue = ulValue;
4325 if( uxSchedulerSuspended == (
UBaseType_t ) pdFALSE )
4341 if( pxHigherPriorityTaskWoken !=
NULL )
4343 *pxHigherPriorityTaskWoken =
pdTRUE;
4360 #if( configUSE_TASK_NOTIFICATIONS == 1 ) 4388 pxTCB = (
TCB_t * ) xTaskToNotify;
4392 eOriginalNotifyState = pxTCB->eNotifyState;
4397 ( pxTCB->ulNotifiedValue )++;
4408 if( uxSchedulerSuspended == (
UBaseType_t ) pdFALSE )
4424 if( pxHigherPriorityTaskWoken !=
NULL )
4426 *pxHigherPriorityTaskWoken =
pdTRUE;
4442 #if( configUSE_TASK_NOTIFICATIONS == 1 ) 4449 pxTCB = (
TCB_t * ) xTask;
4474 #ifdef FREERTOS_MODULE_TEST 4475 #include "tasks_test_access_functions.h"
void vPortFree(void *pv) PRIVILEGED_FUNCTION
#define portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime)
#define listGET_LIST_ITEM_VALUE(pxListItem)
#define listGET_OWNER_OF_NEXT_ENTRY(pxTCB, pxList)
UBaseType_t uxTaskPriorityGetFromISR(TaskHandle_t xTask) PRIVILEGED_FUNCTION
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()
UBaseType_t uxListRemove(ListItem_t *const pxItemToRemove) PRIVILEGED_FUNCTION
#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
#define portASSERT_IF_IN_ISR()
TickType_t xTimeOnEntering
#define portENABLE_INTERRUPTS()
#define taskSCHEDULER_NOT_STARTED
#define traceTASK_DELAY_UNTIL()
void vTaskPlaceOnEventListRestricted(List_t *const pxEventList, const TickType_t xTicksToWait, const BaseType_t xWaitIndefinitely) PRIVILEGED_FUNCTION
#define tskSTACK_FILL_BYTE
#define portDISABLE_INTERRUPTS()
#define traceLOW_POWER_IDLE_BEGIN()
#define prvAddTaskToReadyList(pxTCB)
#define tskIDLE_STACK_SIZE
uint32_t ulRunTimeCounter
void vListInsertEnd(List_t *const pxList, ListItem_t *const pxNewListItem) PRIVILEGED_FUNCTION
void * pvTaskIncrementMutexHeldCount(void) PRIVILEGED_FUNCTION
#define taskSCHEDULER_RUNNING
BaseType_t xTaskResumeFromISR(TaskHandle_t xTaskToResume) PRIVILEGED_FUNCTION
#define portTICK_TYPE_ENTER_CRITICAL()
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 portTICK_TYPE_SET_INTERRUPT_MASK_FROM_ISR()
#define traceTASK_PRIORITY_INHERIT(pxTCBOfMutexHolder, uxInheritedPriority)
char pcTaskName[configMAX_TASK_NAME_LEN]
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
#define traceTASK_RESUME(pxTaskToResume)
#define configMAX_PRIORITIES
void vPortEndScheduler(void) PRIVILEGED_FUNCTION
#define portRESET_READY_PRIORITY(uxPriority, uxTopReadyPriority)
BaseType_t xTaskGenericNotifyFromISR(TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken) PRIVILEGED_FUNCTION
unsigned long UBaseType_t
ListItem_t xEventListItem
#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
#define portTICK_TYPE_CLEAR_INTERRUPT_MASK_FROM_ISR(x)
StackType_t * pxPortInitialiseStack(StackType_t *pxTopOfStack, TaskFunction_t pxCode, void *pvParameters) PRIVILEGED_FUNCTION
#define portTICK_TYPE_EXIT_CRITICAL()
BaseType_t xTaskNotifyWait(uint32_t ulBitsToClearOnEntry, uint32_t ulBitsToClearOnExit, uint32_t *pulNotificationValue, TickType_t xTicksToWait) PRIVILEGED_FUNCTION
#define traceTASK_SWITCHED_OUT()
UBaseType_t uxTaskPriorityGet(TaskHandle_t xTask) PRIVILEGED_FUNCTION
#define traceTASK_NOTIFY_WAIT()
#define listSET_LIST_ITEM_OWNER(pxListItem, pxOwner)
BaseType_t(* TaskHookFunction_t)(void *)
#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
BaseType_t xTaskPriorityDisinherit(TaskHandle_t const pxMutexHolder) PRIVILEGED_FUNCTION
#define traceTASK_PRIORITY_SET(pxTask, uxNewPriority)
BaseType_t xOverflowCount
#define taskRESET_READY_PRIORITY(uxPriority)
#define taskCHECK_FOR_STACK_OVERFLOW()
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 configNUM_THREAD_LOCAL_STORAGE_POINTERS
TaskHandle_t xTaskGetIdleTaskHandle(void) PRIVILEGED_FUNCTION
#define traceTASK_PRIORITY_DISINHERIT(pxTCBOfMutexHolder, uxOriginalPriority)
#define listGET_OWNER_OF_HEAD_ENTRY(pxList)
UBaseType_t uxBasePriority
UBaseType_t uxCurrentPriority
void vTaskPriorityInherit(TaskHandle_t const pxMutexHolder) PRIVILEGED_FUNCTION
#define traceTASK_NOTIFY_TAKE_BLOCK()
#define traceTASK_CREATE_FAILED()
UBaseType_t uxTaskGetNumberOfTasks(void)
void vTaskStartScheduler(void)
void vTaskSetTimeOutState(TimeOut_t *const pxTimeOut)
void vTaskNotifyGiveFromISR(TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken) PRIVILEGED_FUNCTION
#define portPRE_TASK_DELETE_HOOK(pvTaskToDelete, pxYieldPending)
#define pvPortMallocAligned(x, puxStackBuffer)
BaseType_t xTaskNotifyStateClear(TaskHandle_t xTask)
void vTaskPlaceOnUnorderedEventList(List_t *pxEventList, const TickType_t xItemValue, const TickType_t xTicksToWait)
void vListInsert(List_t *const pxList, ListItem_t *const pxNewListItem) PRIVILEGED_FUNCTION
#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
TickType_t xTaskGetTickCount(void)
BaseType_t xTaskGetSchedulerState(void) PRIVILEGED_FUNCTION
#define taskYIELD_IF_USING_PREEMPTION()
#define taskENTER_CRITICAL()
#define portTASK_FUNCTION_PROTO(vFunction, pvParameters)
volatile StackType_t * pxTopOfStack
#define portPOINTER_SIZE_TYPE
eSleepModeStatus eTaskConfirmSleepModeStatus(void) PRIVILEGED_FUNCTION
uint32_t ulTaskNotifyTake(BaseType_t xClearCountOnExit, TickType_t xTicksToWait) PRIVILEGED_FUNCTION
#define listGET_LIST_ITEM_OWNER(pxListItem)
BaseType_t xTaskResumeAll(void)
#define taskSELECT_HIGHEST_PRIORITY_TASK()
#define traceTASK_NOTIFY_WAIT_BLOCK()
#define traceTASK_NOTIFY_TAKE()
#define traceTASK_NOTIFY()
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
#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)
ListItem_t xGenericListItem
#define taskSCHEDULER_SUSPENDED
BaseType_t xTimerCreateTimerTask(void) PRIVILEGED_FUNCTION
UBaseType_t uxTaskGetSystemState(TaskStatus_t *const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t *const pulTotalRunTime) PRIVILEGED_FUNCTION
#define portASSERT_IF_INTERRUPT_PRIORITY_INVALID()
#define listCURRENT_LIST_LENGTH(pxList)
#define traceTASK_NOTIFY_GIVE_FROM_ISR()
BaseType_t xTaskGenericNotify(TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue) PRIVILEGED_FUNCTION
#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)
void(* TaskFunction_t)(void *)
#define traceTASK_NOTIFY_FROM_ISR()
void vListInitialise(List_t *const pxList) PRIVILEGED_FUNCTION
void vListInitialiseItem(ListItem_t *const pxItem) PRIVILEGED_FUNCTION
void vTaskMissedYield(void)
#define traceTASK_DELETE(pxTaskToDelete)
eTaskState eTaskGetState(TaskHandle_t xTask) PRIVILEGED_FUNCTION
BaseType_t xTaskIncrementTick(void)
portSTACK_TYPE StackType_t
#define portCLEAN_UP_TCB(pxTCB)
#define portTASK_FUNCTION(vFunction, pvParameters)
#define configMAX_TASK_NAME_LEN
struct tskTaskControlBlock tskTCB
uint16_t usStackHighWaterMark