mirror of
https://github.com/FreeRTOS/FreeRTOS-Kernel.git
synced 2025-09-13 01:27:48 -04:00
Perform atomic message write in prvWriteMessageToBuffer
This commit is contained in:
parent
cda43dd4d8
commit
ee82c9f34b
1 changed files with 19 additions and 10 deletions
|
@ -160,12 +160,19 @@ static size_t prvBytesInBuffer( const StreamBuffer_t * const pxStreamBuffer ) PR
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Add xCount bytes from pucData into the pxStreamBuffer's data storage area.
|
* Add xCount bytes from pucData into the pxStreamBuffer's data storage area.
|
||||||
* Assumes there is enough free space in the buffer.
|
* This function does not update the buffer's xHead pointer, so multiple writes
|
||||||
* Always returns xCount, which is the number of bytes written.
|
* may be chained together "atomically". This is useful for Message Buffers where
|
||||||
|
* the length and data bytes are written in two separate chunks, and we don't want
|
||||||
|
* the reader to see the buffer as having grown until after all data is copied over.
|
||||||
|
* This function takes a custom xHead value to indicate where to write to (necessary
|
||||||
|
* for chaining) and returns the the resulting xHead position.
|
||||||
|
* To mark the write as complete, manually set the buffer's xHead field with the
|
||||||
|
* returned xHead from this function.
|
||||||
*/
|
*/
|
||||||
static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer,
|
static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer,
|
||||||
const uint8_t * pucData,
|
const uint8_t * pucData,
|
||||||
size_t xCount ) PRIVILEGED_FUNCTION;
|
size_t xCount,
|
||||||
|
size_t xHead ) PRIVILEGED_FUNCTION;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the stream buffer is being used as a message buffer, then reads an entire
|
* If the stream buffer is being used as a message buffer, then reads an entire
|
||||||
|
@ -704,6 +711,7 @@ static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer,
|
||||||
{
|
{
|
||||||
BaseType_t xShouldWrite;
|
BaseType_t xShouldWrite;
|
||||||
size_t xReturn;
|
size_t xReturn;
|
||||||
|
size_t xNextHead = pxStreamBuffer->xHead;
|
||||||
|
|
||||||
if( xSpace == ( size_t ) 0 )
|
if( xSpace == ( size_t ) 0 )
|
||||||
{
|
{
|
||||||
|
@ -726,7 +734,7 @@ static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer,
|
||||||
* into the buffer. Start by writing the length of the data, the data
|
* into the buffer. Start by writing the length of the data, the data
|
||||||
* itself will be written later in this function. */
|
* itself will be written later in this function. */
|
||||||
xShouldWrite = pdTRUE;
|
xShouldWrite = pdTRUE;
|
||||||
( void ) prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xDataLengthBytes ), sbBYTES_TO_STORE_MESSAGE_LENGTH );
|
xNextHead = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) &( xDataLengthBytes ), sbBYTES_TO_STORE_MESSAGE_LENGTH, xNextHead);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -737,7 +745,9 @@ static size_t prvWriteMessageToBuffer( StreamBuffer_t * const pxStreamBuffer,
|
||||||
if( xShouldWrite != pdFALSE )
|
if( xShouldWrite != pdFALSE )
|
||||||
{
|
{
|
||||||
/* Writes the data itself. */
|
/* Writes the data itself. */
|
||||||
xReturn = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes ); /*lint !e9079 Storage buffer is implemented as uint8_t for ease of sizing, alignment and access. */
|
xNextHead = prvWriteBytesToBuffer( pxStreamBuffer, ( const uint8_t * ) pvTxData, xDataLengthBytes, xNextHead ); /*lint !e9079 Storage buffer is implemented as uint8_t for ease of sizing, alighment and access. */
|
||||||
|
pxStreamBuffer->xHead = xNextHead;
|
||||||
|
xReturn = xDataLengthBytes;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -1129,13 +1139,14 @@ BaseType_t xStreamBufferReceiveCompletedFromISR( StreamBufferHandle_t xStreamBuf
|
||||||
|
|
||||||
static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer,
|
static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer,
|
||||||
const uint8_t * pucData,
|
const uint8_t * pucData,
|
||||||
size_t xCount )
|
size_t xCount,
|
||||||
|
size_t xHead )
|
||||||
{
|
{
|
||||||
size_t xNextHead, xFirstLength;
|
size_t xNextHead, xFirstLength;
|
||||||
|
|
||||||
configASSERT( xCount > ( size_t ) 0 );
|
configASSERT( xCount > ( size_t ) 0 );
|
||||||
|
|
||||||
xNextHead = pxStreamBuffer->xHead;
|
xNextHead = xHead;
|
||||||
|
|
||||||
/* Calculate the number of bytes that can be added in the first write -
|
/* Calculate the number of bytes that can be added in the first write -
|
||||||
* which may be less than the total number of bytes that need to be added if
|
* which may be less than the total number of bytes that need to be added if
|
||||||
|
@ -1170,9 +1181,7 @@ static size_t prvWriteBytesToBuffer( StreamBuffer_t * const pxStreamBuffer,
|
||||||
mtCOVERAGE_TEST_MARKER();
|
mtCOVERAGE_TEST_MARKER();
|
||||||
}
|
}
|
||||||
|
|
||||||
pxStreamBuffer->xHead = xNextHead;
|
return xNextHead;
|
||||||
|
|
||||||
return xCount;
|
|
||||||
}
|
}
|
||||||
/*-----------------------------------------------------------*/
|
/*-----------------------------------------------------------*/
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue