From 244959cb053520be08560e23419689f27a423f7b Mon Sep 17 00:00:00 2001 From: gaurav-aws Date: Wed, 3 Jul 2019 00:08:16 +0000 Subject: [PATCH] Only check once before re-setting ready priority The macro taskRESET_READY_PRIORITY checks if the task being removed from the ready list is the last one and only then resets the top ready priority by calling portRESET_READY_PRIORITY. If we already know that it is the last ready task being removed then there is no need to perform the check again and the macro portRESET_READY_PRIORITY can be called directly. We were doing the unnecessary check at two places and this commit fixes them. This commit also increases the time period of check task to ensure that all the demo tasks get a chance to run before the check is performed. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@2670 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- FreeRTOS/Demo/WIN32-MSVC/main_full.c | 2 +- FreeRTOS/Source/tasks.c | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/FreeRTOS/Demo/WIN32-MSVC/main_full.c b/FreeRTOS/Demo/WIN32-MSVC/main_full.c index 5c241be47..3f19db32e 100644 --- a/FreeRTOS/Demo/WIN32-MSVC/main_full.c +++ b/FreeRTOS/Demo/WIN32-MSVC/main_full.c @@ -244,7 +244,7 @@ int main_full( void ) static void prvCheckTask( void *pvParameters ) { TickType_t xNextWakeTime; -const TickType_t xCycleFrequency = pdMS_TO_TICKS( 2500UL ); +const TickType_t xCycleFrequency = pdMS_TO_TICKS( 4000UL ); /* Just to remove compiler warning. */ ( void ) pvParameters; diff --git a/FreeRTOS/Source/tasks.c b/FreeRTOS/Source/tasks.c index 3274e830f..f15d1ddf5 100644 --- a/FreeRTOS/Source/tasks.c +++ b/FreeRTOS/Source/tasks.c @@ -1164,7 +1164,7 @@ static void prvAddNewTaskToReadyList( TCB_t *pxNewTCB ) being deleted. */ pxTCB = prvGetTCBFromHandle( xTaskToDelete ); - /* Remove task from the ready list. */ + /* Remove task from the ready/delayed list. */ if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) { taskRESET_READY_PRIORITY( pxTCB->uxPriority ); @@ -3981,7 +3981,10 @@ TCB_t *pxTCB; { if( uxListRemove( &( pxMutexHolderTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) { - taskRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority ); + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxMutexHolderTCB->uxPriority, uxTopReadyPriority ); } else { @@ -4061,7 +4064,7 @@ TCB_t *pxTCB; the mutex. If the mutex is held by a task then it cannot be given from an interrupt, and if a mutex is given by the holding task then it must be the running state task. Remove - the holding task from the ready list. */ + the holding task from the ready/delayed list. */ if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) { taskRESET_READY_PRIORITY( pxTCB->uxPriority ); @@ -4182,7 +4185,10 @@ TCB_t *pxTCB; { if( uxListRemove( &( pxTCB->xStateListItem ) ) == ( UBaseType_t ) 0 ) { - taskRESET_READY_PRIORITY( pxTCB->uxPriority ); + /* It is known that the task is in its ready list so + there is no need to check again and the port level + reset macro can be called directly. */ + portRESET_READY_PRIORITY( pxTCB->uxPriority, uxTopReadyPriority ); } else { -- 2.39.5