36#define MPU_WRAPPERS_INCLUDED_FROM_API_FILE
43#if ( configUSE_TASK_NOTIFICATIONS != 1 )
44 #error configUSE_TASK_NOTIFICATIONS must be set to 1 to build stream_buffer.c
47#if ( INCLUDE_xTaskGetCurrentTaskHandle != 1 )
48 #error INCLUDE_xTaskGetCurrentTaskHandle must be set to 1 to build stream_buffer.c
55#undef MPU_WRAPPERS_INCLUDED_FROM_API_FILE
61#ifndef sbRECEIVE_COMPLETED
62 #define sbRECEIVE_COMPLETED( pxStreamBuffer ) \
65 if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \
67 ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToSend, \
70 ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \
73 ( void ) xTaskResumeAll()
79#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
80 #define prvRECEIVE_COMPLETED( pxStreamBuffer ) \
82 if( ( pxStreamBuffer )->pxReceiveCompletedCallback != NULL ) \
84 ( pxStreamBuffer )->pxReceiveCompletedCallback( ( pxStreamBuffer ), pdFALSE, NULL ); \
88 sbRECEIVE_COMPLETED( ( pxStreamBuffer ) ); \
92 #define prvRECEIVE_COMPLETED( pxStreamBuffer ) sbRECEIVE_COMPLETED( ( pxStreamBuffer ) )
95#ifndef sbRECEIVE_COMPLETED_FROM_ISR
96 #define sbRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \
97 pxHigherPriorityTaskWoken ) \
99 UBaseType_t uxSavedInterruptStatus; \
101 uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); \
103 if( ( pxStreamBuffer )->xTaskWaitingToSend != NULL ) \
105 ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToSend, \
108 ( pxHigherPriorityTaskWoken ) ); \
109 ( pxStreamBuffer )->xTaskWaitingToSend = NULL; \
112 portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \
116#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
117 #define prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, \
118 pxHigherPriorityTaskWoken ) \
120 if( ( pxStreamBuffer )->pxReceiveCompletedCallback != NULL ) \
122 ( pxStreamBuffer )->pxReceiveCompletedCallback( ( pxStreamBuffer ), pdTRUE, ( pxHigherPriorityTaskWoken ) ); \
126 sbRECEIVE_COMPLETED_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) ); \
130 #define prvRECEIVE_COMPLETED_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \
131 sbRECEIVE_COMPLETED_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) )
138#ifndef sbSEND_COMPLETED
139 #define sbSEND_COMPLETED( pxStreamBuffer ) \
142 if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \
144 ( void ) xTaskNotify( ( pxStreamBuffer )->xTaskWaitingToReceive, \
147 ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \
150 ( void ) xTaskResumeAll()
156#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
157 #define prvSEND_COMPLETED( pxStreamBuffer ) \
159 if( ( pxStreamBuffer )->pxSendCompletedCallback != NULL ) \
161 pxStreamBuffer->pxSendCompletedCallback( ( pxStreamBuffer ), pdFALSE, NULL ); \
165 sbSEND_COMPLETED( ( pxStreamBuffer ) ); \
169 #define prvSEND_COMPLETED( pxStreamBuffer ) sbSEND_COMPLETED( ( pxStreamBuffer ) )
173#ifndef sbSEND_COMPLETE_FROM_ISR
174 #define sbSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \
176 UBaseType_t uxSavedInterruptStatus; \
178 uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR(); \
180 if( ( pxStreamBuffer )->xTaskWaitingToReceive != NULL ) \
182 ( void ) xTaskNotifyFromISR( ( pxStreamBuffer )->xTaskWaitingToReceive, \
185 ( pxHigherPriorityTaskWoken ) ); \
186 ( pxStreamBuffer )->xTaskWaitingToReceive = NULL; \
189 portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus ); \
194#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
195 #define prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \
197 if( ( pxStreamBuffer )->pxSendCompletedCallback != NULL ) \
199 ( pxStreamBuffer )->pxSendCompletedCallback( ( pxStreamBuffer ), pdTRUE, ( pxHigherPriorityTaskWoken ) ); \
203 sbSEND_COMPLETE_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) ); \
207 #define prvSEND_COMPLETE_FROM_ISR( pxStreamBuffer, pxHigherPriorityTaskWoken ) \
208 sbSEND_COMPLETE_FROM_ISR( ( pxStreamBuffer ), ( pxHigherPriorityTaskWoken ) )
214#define sbBYTES_TO_STORE_MESSAGE_LENGTH ( sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) )
217#define sbFLAGS_IS_MESSAGE_BUFFER ( ( uint8_t ) 1 )
218#define sbFLAGS_IS_STATICALLY_ALLOCATED ( ( uint8_t ) 2 )
234 #if ( configUSE_TRACE_FACILITY == 1 )
238 #if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
261 const uint8_t * pucData,
274 size_t xBufferLengthBytes,
285 const void * pvTxData,
286 size_t xDataLengthBytes,
312 uint8_t *
const pucBuffer,
313 size_t xBufferSizeBytes,
314 size_t xTriggerLevelBytes,
320#if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
322 size_t xTriggerLevelBytes,
327 void * pvAllocatedMemory;
334 if( xIsMessageBuffer ==
pdTRUE )
351 if( xTriggerLevelBytes == (
size_t ) 0 )
353 xTriggerLevelBytes = ( size_t ) 1;
364 if( xBufferSizeBytes < ( xBufferSizeBytes + 1 +
sizeof(
StreamBuffer_t ) ) )
371 pvAllocatedMemory =
NULL;
374 if( pvAllocatedMemory !=
NULL )
381 pxSendCompletedCallback,
382 pxReceiveCompletedCallback );
396#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
399 size_t xTriggerLevelBytes,
401 uint8_t *
const pucStreamBufferStorageArea,
416 if( xTriggerLevelBytes == (
size_t ) 0 )
418 xTriggerLevelBytes = ( size_t ) 1;
421 if( xIsMessageBuffer !=
pdFALSE )
438 #if ( configASSERT_DEFINED == 1 )
448 if( ( pucStreamBufferStorageArea !=
NULL ) && ( pxStaticStreamBuffer !=
NULL ) )
451 pucStreamBufferStorageArea,
455 pxSendCompletedCallback,
456 pxReceiveCompletedCallback );
477#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
479 uint8_t ** ppucStreamBufferStorageArea,
491 *ppucStreamBufferStorageArea = pxStreamBuffer->
pucBuffer;
515 #if ( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
533 ( void ) memset( pxStreamBuffer, 0x00,
sizeof(
StreamBuffer_t ) );
544 #if ( configUSE_TRACE_FACILITY == 1 )
550 #if ( configUSE_TRACE_FACILITY == 1 )
554 uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber;
563 #if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
565 pxSendCallback = pxStreamBuffer->pxSendCompletedCallback;
566 pxReceiveCallback = pxStreamBuffer->pxReceiveCompletedCallback;
578 #if ( configUSE_TRACE_FACILITY == 1 )
580 pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber;
596 size_t xTriggerLevel )
604 if( xTriggerLevel == (
size_t ) 0 )
606 xTriggerLevel = ( size_t ) 1;
611 if( xTriggerLevel < pxStreamBuffer->xLength )
629 size_t xOriginalTail;
638 xOriginalTail = pxStreamBuffer->
xTail;
639 xSpace = pxStreamBuffer->
xLength + pxStreamBuffer->
xTail;
640 xSpace -= pxStreamBuffer->
xHead;
641 }
while( xOriginalTail != pxStreamBuffer->
xTail );
643 xSpace -= ( size_t ) 1;
645 if( xSpace >= pxStreamBuffer->
xLength )
647 xSpace -= pxStreamBuffer->
xLength;
671 const void * pvTxData,
672 size_t xDataLengthBytes,
676 size_t xReturn, xSpace = 0;
677 size_t xRequiredSpace = xDataLengthBytes;
679 size_t xMaxReportedSpace = 0;
686 xMaxReportedSpace = pxStreamBuffer->
xLength - ( size_t ) 1;
701 if( xRequiredSpace > xMaxReportedSpace )
717 if( xRequiredSpace > xMaxReportedSpace )
719 xRequiredSpace = xMaxReportedSpace;
739 if( xSpace < xRequiredSpace )
766 if( xSpace == (
size_t ) 0 )
777 if( xReturn > (
size_t ) 0 )
802 const void * pvTxData,
803 size_t xDataLengthBytes,
804 BaseType_t *
const pxHigherPriorityTaskWoken )
807 size_t xReturn, xSpace;
808 size_t xRequiredSpace = xDataLengthBytes;
829 if( xReturn > (
size_t ) 0 )
853 const void * pvTxData,
854 size_t xDataLengthBytes,
856 size_t xRequiredSpace )
858 size_t xNextHead = pxStreamBuffer->
xHead;
869 configASSERT( (
size_t ) xMessageLength == xDataLengthBytes );
871 if( xSpace >= xRequiredSpace )
881 xDataLengthBytes = 0;
889 xDataLengthBytes =
configMIN( xDataLengthBytes, xSpace );
892 if( xDataLengthBytes != (
size_t ) 0 )
898 return xDataLengthBytes;
904 size_t xBufferLengthBytes,
908 size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength;
924 xBytesToStoreMessageLength = 0;
940 if( xBytesAvailable <= xBytesToStoreMessageLength )
956 if( xBytesAvailable <= xBytesToStoreMessageLength )
981 if( xBytesAvailable > xBytesToStoreMessageLength )
986 if( xReceivedLength != (
size_t ) 0 )
1002 return xReceivedLength;
1009 size_t xReturn, xBytesAvailable;
1025 xReturn = ( size_t ) xTempReturn;
1048 size_t xBufferLengthBytes,
1049 BaseType_t *
const pxHigherPriorityTaskWoken )
1052 size_t xReceivedLength = 0, xBytesAvailable, xBytesToStoreMessageLength;
1068 xBytesToStoreMessageLength = 0;
1078 if( xBytesAvailable > xBytesToStoreMessageLength )
1083 if( xReceivedLength != (
size_t ) 0 )
1099 return xReceivedLength;
1105 size_t xBufferLengthBytes,
1106 size_t xBytesAvailable )
1108 size_t xCount, xNextMessageLength;
1110 size_t xNextTail = pxStreamBuffer->
xTail;
1117 xNextMessageLength = ( size_t ) xTempNextMessageLength;
1125 if( xNextMessageLength > xBufferLengthBytes )
1128 xNextMessageLength = 0;
1139 xNextMessageLength = xBufferLengthBytes;
1143 xCount =
configMIN( xNextMessageLength, xBytesAvailable );
1145 if( xCount != (
size_t ) 0 )
1164 xTail = pxStreamBuffer->
xTail;
1166 if( pxStreamBuffer->
xHead == xTail )
1182 size_t xBytesToStoreMessageLength;
1197 xBytesToStoreMessageLength = 0;
1225 if( ( pxStreamBuffer )->xTaskWaitingToReceive !=
NULL )
1230 pxHigherPriorityTaskWoken );
1231 ( pxStreamBuffer )->xTaskWaitingToReceive =
NULL;
1256 if( ( pxStreamBuffer )->xTaskWaitingToSend !=
NULL )
1261 pxHigherPriorityTaskWoken );
1262 ( pxStreamBuffer )->xTaskWaitingToSend =
NULL;
1277 const uint8_t * pucData,
1281 size_t xFirstLength;
1292 ( void ) memcpy( (
void * ) ( &( pxStreamBuffer->
pucBuffer[ xHead ] ) ), (
const void * ) pucData, xFirstLength );
1296 if( xCount > xFirstLength )
1300 ( void ) memcpy( (
void * ) pxStreamBuffer->
pucBuffer, (
const void * ) &( pucData[ xFirstLength ] ), xCount - xFirstLength );
1309 if( xHead >= pxStreamBuffer->
xLength )
1311 xHead -= pxStreamBuffer->
xLength;
1327 size_t xFirstLength;
1340 ( void ) memcpy( (
void * ) pucData, (
const void * ) &( pxStreamBuffer->
pucBuffer[ xTail ] ), xFirstLength );
1344 if( xCount > xFirstLength )
1347 ( void ) memcpy( (
void * ) &( pucData[ xFirstLength ] ), (
void * ) ( pxStreamBuffer->
pucBuffer ), xCount - xFirstLength );
1357 if( xTail >= pxStreamBuffer->
xLength )
1359 xTail -= pxStreamBuffer->
xLength;
1371 xCount = pxStreamBuffer->
xLength + pxStreamBuffer->
xHead;
1372 xCount -= pxStreamBuffer->
xTail;
1374 if( xCount >= pxStreamBuffer->
xLength )
1376 xCount -= pxStreamBuffer->
xLength;
1388 uint8_t *
const pucBuffer,
1389 size_t xBufferSizeBytes,
1390 size_t xTriggerLevelBytes,
1398 #if ( configASSERT_DEFINED == 1 )
1403 #define STREAM_BUFFER_BUFFER_WRITE_VALUE ( 0x55 )
1404 configASSERT( memset( pucBuffer, (
int ) STREAM_BUFFER_BUFFER_WRITE_VALUE, xBufferSizeBytes ) == pucBuffer );
1408 ( void ) memset( (
void * ) pxStreamBuffer, 0x00,
sizeof(
StreamBuffer_t ) );
1410 pxStreamBuffer->
xLength = xBufferSizeBytes;
1412 pxStreamBuffer->
ucFlags = ucFlags;
1413 #if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
1415 pxStreamBuffer->pxSendCompletedCallback = pxSendCompletedCallback;
1416 pxStreamBuffer->pxReceiveCompletedCallback = pxReceiveCompletedCallback;
1420 ( void ) pxSendCompletedCallback;
1421 ( void ) pxReceiveCompletedCallback;
1426#if ( configUSE_TRACE_FACILITY == 1 )
1430 return xStreamBuffer->uxStreamBufferNumber;
1436#if ( configUSE_TRACE_FACILITY == 1 )
1441 xStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber;
1447#if ( configUSE_TRACE_FACILITY == 1 )
#define configMESSAGE_BUFFER_LENGTH_TYPE
#define traceSTREAM_BUFFER_CREATE_FAILED(xIsMessageBuffer)
#define traceSTREAM_BUFFER_RESET(xStreamBuffer)
#define traceSTREAM_BUFFER_RECEIVE_FROM_ISR(xStreamBuffer, xReceivedLength)
#define traceSTREAM_BUFFER_CREATE(pxStreamBuffer, xIsMessageBuffer)
struct xSTATIC_STREAM_BUFFER StaticStreamBuffer_t
#define traceSTREAM_BUFFER_SEND(xStreamBuffer, xBytesSent)
#define traceSTREAM_BUFFER_SEND_FAILED(xStreamBuffer)
#define traceBLOCKING_ON_STREAM_BUFFER_SEND(xStreamBuffer)
#define traceSTREAM_BUFFER_RECEIVE_FAILED(xStreamBuffer)
#define traceSTREAM_BUFFER_RECEIVE(xStreamBuffer, xReceivedLength)
#define traceBLOCKING_ON_STREAM_BUFFER_RECEIVE(xStreamBuffer)
#define traceSTREAM_BUFFER_CREATE_STATIC_FAILED(xReturn, xIsMessageBuffer)
#define traceSTREAM_BUFFER_SEND_FROM_ISR(xStreamBuffer, xBytesSent)
#define mtCOVERAGE_TEST_MARKER()
#define traceSTREAM_BUFFER_DELETE(xStreamBuffer)
#define PRIVILEGED_FUNCTION
void vPortFree(void *pv) PRIVILEGED_FUNCTION
void * pvPortMalloc(size_t xSize) PRIVILEGED_FUNCTION
#define portSET_INTERRUPT_MASK_FROM_ISR()
unsigned long UBaseType_t
#define portCLEAR_INTERRUPT_MASK_FROM_ISR(x)
BaseType_t xStreamBufferReset(StreamBufferHandle_t xStreamBuffer)
size_t xStreamBufferReceiveFromISR(StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, BaseType_t *const pxHigherPriorityTaskWoken)
#define prvSEND_COMPLETE_FROM_ISR(pxStreamBuffer, pxHigherPriorityTaskWoken)
static size_t prvWriteMessageToBuffer(StreamBuffer_t *const pxStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, size_t xSpace, size_t xRequiredSpace) PRIVILEGED_FUNCTION
static size_t prvWriteBytesToBuffer(StreamBuffer_t *const pxStreamBuffer, const uint8_t *pucData, size_t xCount, size_t xHead) PRIVILEGED_FUNCTION
#define prvSEND_COMPLETED(pxStreamBuffer)
static void prvInitialiseNewStreamBuffer(StreamBuffer_t *const pxStreamBuffer, uint8_t *const pucBuffer, size_t xBufferSizeBytes, size_t xTriggerLevelBytes, uint8_t ucFlags, StreamBufferCallbackFunction_t pxSendCompletedCallback, StreamBufferCallbackFunction_t pxReceiveCompletedCallback) PRIVILEGED_FUNCTION
size_t xStreamBufferSendFromISR(StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, BaseType_t *const pxHigherPriorityTaskWoken)
BaseType_t xStreamBufferSetTriggerLevel(StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel)
#define sbFLAGS_IS_MESSAGE_BUFFER
size_t xStreamBufferBytesAvailable(StreamBufferHandle_t xStreamBuffer)
#define prvRECEIVE_COMPLETED(pxStreamBuffer)
static size_t prvReadMessageFromBuffer(StreamBuffer_t *pxStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, size_t xBytesAvailable) PRIVILEGED_FUNCTION
#define prvRECEIVE_COMPLETED_FROM_ISR(pxStreamBuffer, pxHigherPriorityTaskWoken)
BaseType_t xStreamBufferSendCompletedFromISR(StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken)
BaseType_t xStreamBufferIsFull(StreamBufferHandle_t xStreamBuffer)
void vStreamBufferDelete(StreamBufferHandle_t xStreamBuffer)
#define sbFLAGS_IS_STATICALLY_ALLOCATED
size_t xStreamBufferSpacesAvailable(StreamBufferHandle_t xStreamBuffer)
BaseType_t xStreamBufferIsEmpty(StreamBufferHandle_t xStreamBuffer)
#define sbBYTES_TO_STORE_MESSAGE_LENGTH
struct StreamBufferDef_t StreamBuffer_t
static size_t prvBytesInBuffer(const StreamBuffer_t *const pxStreamBuffer) PRIVILEGED_FUNCTION
BaseType_t xStreamBufferReceiveCompletedFromISR(StreamBufferHandle_t xStreamBuffer, BaseType_t *pxHigherPriorityTaskWoken)
size_t xStreamBufferSend(StreamBufferHandle_t xStreamBuffer, const void *pvTxData, size_t xDataLengthBytes, TickType_t xTicksToWait)
static size_t prvReadBytesFromBuffer(StreamBuffer_t *pxStreamBuffer, uint8_t *pucData, size_t xCount, size_t xTail) PRIVILEGED_FUNCTION
size_t xStreamBufferReceive(StreamBufferHandle_t xStreamBuffer, void *pvRxData, size_t xBufferLengthBytes, TickType_t xTicksToWait)
size_t xStreamBufferNextMessageLengthBytes(StreamBufferHandle_t xStreamBuffer)
StreamBufferHandle_t xStreamBufferGenericCreateStatic(size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer, uint8_t *const pucStreamBufferStorageArea, StaticStreamBuffer_t *const pxStaticStreamBuffer, StreamBufferCallbackFunction_t pxSendCompletedCallback, StreamBufferCallbackFunction_t pxReceiveCompletedCallback) PRIVILEGED_FUNCTION
void(* StreamBufferCallbackFunction_t)(StreamBufferHandle_t xStreamBuffer, BaseType_t xIsInsideISR, BaseType_t *const pxHigherPriorityTaskWoken)
Type used as a stream buffer's optional callback.
struct StreamBufferDef_t * StreamBufferHandle_t
StreamBufferHandle_t xStreamBufferGenericCreate(size_t xBufferSizeBytes, size_t xTriggerLevelBytes, BaseType_t xIsMessageBuffer, StreamBufferCallbackFunction_t pxSendCompletedCallback, StreamBufferCallbackFunction_t pxReceiveCompletedCallback) PRIVILEGED_FUNCTION
size_t xTriggerLevelBytes
volatile TaskHandle_t xTaskWaitingToReceive
volatile TaskHandle_t xTaskWaitingToSend
#define xTaskNotifyFromISR(xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken)
#define xTaskNotifyWait(ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait)
struct tskTaskControlBlock * TaskHandle_t
BaseType_t xTaskCheckForTimeOut(TimeOut_t *const pxTimeOut, TickType_t *const pxTicksToWait) PRIVILEGED_FUNCTION
struct xTIME_OUT TimeOut_t
void vTaskSetTimeOutState(TimeOut_t *const pxTimeOut) PRIVILEGED_FUNCTION
TaskHandle_t xTaskGetCurrentTaskHandle(void) PRIVILEGED_FUNCTION
#define taskEXIT_CRITICAL()
#define taskENTER_CRITICAL()
#define xTaskNotifyStateClear(xTask)