optimisaztion in xQueueSend and xQueueReceive
Posted by Nobody/Anonymous on June 23, 2005
at line 349 and line 474 in queue.c , there is the same code below:
if( prvUnlockQueue( pxQueue ) )
if( !xTaskResumeAll() )
But i think in these code if prvUnlockQueue( pxQueue ) return pdTRUE then xTaskResumeAll() must return pdTRUE( if scheduler is not locket nested) , so it's meaningless to do taskYIELD(). So these code can be changed to:
prvUnlockQueue( pxQueue ) ;
RE: optimisaztion in xQueueSend and xQueueReceive
Posted by Richard
on June 23, 2005
This is the most complex part of the code. Everything is geared at ensuring interrupts are disabled for the shortest possible period.
You might be right in your comment - with the scheduler suspended unlocking the queue can only move items to the pending ready list - where they will be removed by xTaskResumeAll().
I know there was a lot of thought that went into this code sequence. It was originally as per or similar to your suggestion. This one will take a bit of digging time for me to find why the change was made. It will be good to look again at this in detail. Out of interest I will run a few black box style tests to see if they ever fail with the change.
In any case the optimisation saving would be minimal - with a couple of tests being removed.
Copyright (C) 2004-2010 Richard Barry. Copyright (C) 2010-2016 Real Time Engineers Ltd.
Any and all data, files, source code, html content and documentation included in the FreeRTOSTM distribution or available on this site are the exclusive property of Real Time Engineers Ltd..
See the files license.txt (included in the distribution) and this copyright notice for more information. FreeRTOSTM and FreeRTOS.orgTM are trade marks of Real Time Engineers Ltd.