Delete kernel created idle and timer task in vTaskEndScheduler

* The last application still need to be deleted by application. It has
  to be deleted after scheduler stopped.
This commit is contained in:
Ching-Hsin Lee 2024-01-26 01:23:52 +08:00
parent 88f20df203
commit ba44a70ed0
2 changed files with 24 additions and 25 deletions

View file

@ -251,19 +251,6 @@ BaseType_t xPortStartScheduler( void )
sigwait( &xSignals, &iSignal );
}
/* Cancel the Idle task and free its resources */
#if ( INCLUDE_xTaskGetIdleTaskHandle == 1 )
vTaskDelete( xTaskGetIdleTaskHandle() );
#endif /* #if ( INCLUDE_xTaskGetIdleTaskHandle == 1 ) */
#if ( configUSE_TIMERS == 1 )
/* Cancel the Timer task and free its resources */
vTaskDelete( xTimerGetTimerDaemonTaskHandle() );
#endif /* #if ( configUSE_TIMERS == 1 ) */
/* Cancel the last task. */
vTaskDelete( xTaskGetCurrentTaskHandle() );
/*
* clear out the variable that is used to end the scheduler, otherwise
* subsequent scheduler restarts will end immediately.

36
tasks.c
View file

@ -3738,8 +3738,6 @@ void vTaskStartScheduler( void )
void vTaskEndScheduler( void )
{
TCB_t * pxTCB;
traceENTER_vTaskEndScheduler();
/* Stop the scheduler interrupts and call the portable scheduler end
@ -3748,18 +3746,32 @@ void vTaskEndScheduler( void )
portDISABLE_INTERRUPTS();
xSchedulerRunning = pdFALSE;
/* Delete tasks waiting for termination. */
while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U )
#if ( INCLUDE_vTaskDelete == 1 )
{
/* MISRA Ref 11.5.3 [Void pointer assignment] */
/* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */
/* coverity[misra_c_2012_rule_11_5_violation] */
pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
( void ) uxListRemove( &( pxTCB->xStateListItem ) );
--uxCurrentNumberOfTasks;
--uxDeletedTasksWaitingCleanUp;
prvDeleteTCB( pxTCB );
TCB_t * pxTCB;
#if ( configUSE_TIMERS == 1 )
/* Delete the timer task created in kernel. */
vTaskDelete( xTimerGetTimerDaemonTaskHandle() );
#endif /* #if ( configUSE_TIMERS == 1 ) */
/* Delete the Idle task created in kernel. */
vTaskDelete( xIdleTaskHandles[ 0 ] );
/* Delete tasks waiting for termination. */
while( uxDeletedTasksWaitingCleanUp > ( UBaseType_t ) 0U )
{
/* MISRA Ref 11.5.3 [Void pointer assignment] */
/* More details at: https://github.com/FreeRTOS/FreeRTOS-Kernel/blob/main/MISRA.md#rule-115 */
/* coverity[misra_c_2012_rule_11_5_violation] */
pxTCB = listGET_OWNER_OF_HEAD_ENTRY( ( &xTasksWaitingTermination ) );
( void ) uxListRemove( &( pxTCB->xStateListItem ) );
--uxCurrentNumberOfTasks;
--uxDeletedTasksWaitingCleanUp;
prvDeleteTCB( pxTCB );
}
}
#endif /* #if ( INCLUDE_vTaskDelete == 1 ) */
vPortEndScheduler();