From 887e78c64f0052e81d0027c35cf7b78cfc5b5538 Mon Sep 17 00:00:00 2001 From: "hagai.moshe" Date: Mon, 15 Apr 2024 10:15:47 +0300 Subject: [PATCH 1/6] Add API xStreamBufferResetFromISR Allow reseting the stream buffer from ISR context Signed-off-by: hagai.moshe --- include/FreeRTOS.h | 8 ++++++ include/stream_buffer.h | 28 +++++++++++++++++++ stream_buffer.c | 62 +++++++++++++++++++++++++++++++++++++++++ 3 files changed, 98 insertions(+) diff --git a/include/FreeRTOS.h b/include/FreeRTOS.h index 69611842a7..3822cc774c 100644 --- a/include/FreeRTOS.h +++ b/include/FreeRTOS.h @@ -2437,6 +2437,14 @@ #define traceRETURN_xStreamBufferReset( xReturn ) #endif +#ifndef traceENTER_xStreamBufferResetFromISR + #define traceENTER_xStreamBufferResetFromISR( xStreamBuffer ) +#endif + +#ifndef traceRETURN_xStreamBufferResetFromISR + #define traceRETURN_xStreamBufferResetFromISR( xReturn ) +#endif + #ifndef traceENTER_xStreamBufferSetTriggerLevel #define traceENTER_xStreamBufferSetTriggerLevel( xStreamBuffer, xTriggerLevel ) #endif diff --git a/include/stream_buffer.h b/include/stream_buffer.h index 94a0e0cd7e..ef77c33ae5 100644 --- a/include/stream_buffer.h +++ b/include/stream_buffer.h @@ -781,6 +781,34 @@ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED */ BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; +/** + * stream_buffer.h + * + * @code{c} + * BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer ); + * @endcode + * + * An interrupt safe version of the API function that reset the stream buffer. + * + * Resets a stream buffer to its initial, empty, state. Any data that was in + * the stream buffer is discarded. A stream buffer can only be reset if there + * are no tasks blocked waiting to either send to or receive from the stream + * buffer. + * + * configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for + * xStreamBufferResetFromISR() to be available. + * + * @param xStreamBuffer The handle of the stream buffer being reset. + * + * @return If the stream buffer is reset then pdPASS is returned. If there was + * a task blocked waiting to send to or read from the stream buffer then the + * stream buffer is not reset and pdFAIL is returned. + * + * \defgroup xStreamBufferResetFromISR xStreamBufferResetFromISR + * \ingroup StreamBufferManagement + */ +BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION; + /** * stream_buffer.h * diff --git a/stream_buffer.c b/stream_buffer.c index 44354fba3b..cadc9e62fb 100644 --- a/stream_buffer.c +++ b/stream_buffer.c @@ -639,6 +639,68 @@ BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) } /*-----------------------------------------------------------*/ +BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer ) +{ + StreamBuffer_t * const pxStreamBuffer = xStreamBuffer; + BaseType_t xReturn = pdFAIL; + StreamBufferCallbackFunction_t pxSendCallback = NULL, pxReceiveCallback = NULL; + UBaseType_t uxSavedInterruptStatus; + + #if ( configUSE_TRACE_FACILITY == 1 ) + UBaseType_t uxStreamBufferNumber; + #endif + + traceENTER_xStreamBufferResetFromISR( xStreamBuffer ); + + configASSERT( pxStreamBuffer ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + /* Store the stream buffer number so it can be restored after the + * reset. */ + uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber; + } + #endif + + /* Can only reset a message buffer if there are no tasks blocked on it. */ + uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR(); + { + if( ( pxStreamBuffer->xTaskWaitingToReceive == NULL ) && ( pxStreamBuffer->xTaskWaitingToSend == NULL ) ) + { + #if ( configUSE_SB_COMPLETED_CALLBACK == 1 ) + { + pxSendCallback = pxStreamBuffer->pxSendCompletedCallback; + pxReceiveCallback = pxStreamBuffer->pxReceiveCompletedCallback; + } + #endif + + prvInitialiseNewStreamBuffer( pxStreamBuffer, + pxStreamBuffer->pucBuffer, + pxStreamBuffer->xLength, + pxStreamBuffer->xTriggerLevelBytes, + pxStreamBuffer->ucFlags, + pxSendCallback, + pxReceiveCallback ); + + #if ( configUSE_TRACE_FACILITY == 1 ) + { + pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber; + } + #endif + + traceSTREAM_BUFFER_RESET( xStreamBuffer ); + + xReturn = pdPASS; + } + } + taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus ); + + traceRETURN_xStreamBufferResetFromISR( xReturn ); + + return xReturn; +} +/*-----------------------------------------------------------*/ + BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer, size_t xTriggerLevel ) { From bfd3f8ee3df3d93ec3850d2801a864cfd7e7a1b2 Mon Sep 17 00:00:00 2001 From: "hagai.moshe" Date: Mon, 15 Apr 2024 10:22:31 +0300 Subject: [PATCH 2/6] add API xMessageBufferResetFromISR Allow reseting the stream buffer from ISR context Signed-off-by: hagai.moshe --- include/message_buffer.h | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/include/message_buffer.h b/include/message_buffer.h index 1b1356ca4f..785c26d8e7 100644 --- a/include/message_buffer.h +++ b/include/message_buffer.h @@ -785,6 +785,34 @@ typedef StreamBufferHandle_t MessageBufferHandle_t; xStreamBufferReset( xMessageBuffer ) +/** + * message_buffer.h + * @code{c} + * BaseType_t xMessageBufferResetFromISR( MessageBufferHandle_t xMessageBuffer ); + * @endcode + * + * An interrupt safe version of the API function that reset the stream buffer. + * Resets a message buffer to its initial empty state, discarding any message it + * contained. + * + * A message buffer can only be reset if there are no tasks blocked on it. + * + * configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for + * xMessageBufferResetFromISR() to be available. + * + * @param xMessageBuffer The handle of the message buffer being reset. + * + * @return If the message buffer was reset then pdPASS is returned. If the + * message buffer could not be reset because either there was a task blocked on + * the message queue to wait for space to become available, or to wait for a + * a message to be available, then pdFAIL is returned. + * + * \defgroup xMessageBufferResetFromISR xMessageBufferResetFromISR + * \ingroup MessageBufferManagement + */ +#define xMessageBufferResetFromISR( xMessageBuffer ) \ + xStreamBufferResetFromISR( xMessageBuffer ) + /** * message_buffer.h * @code{c} From ea90347741c9e45f476df0d8f286e16c36e06ca7 Mon Sep 17 00:00:00 2001 From: kar-rahul-aws Date: Tue, 16 Apr 2024 12:24:10 +0530 Subject: [PATCH 3/6] Update comments --- include/message_buffer.h | 10 +++++++++- include/stream_buffer.h | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/include/message_buffer.h b/include/message_buffer.h index 785c26d8e7..ef94b6a3eb 100644 --- a/include/message_buffer.h +++ b/include/message_buffer.h @@ -767,6 +767,10 @@ typedef StreamBufferHandle_t MessageBufferHandle_t; * contained. * * A message buffer can only be reset if there are no tasks blocked on it. + * + * Use xMessageBufferReset() to reset a message buffer from a task. + * Use xMessageBufferResetFromISR() to reset a maessage buffer from an + * interrupt service routine (ISR). * * configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for * xMessageBufferReset() to be available. @@ -791,11 +795,15 @@ typedef StreamBufferHandle_t MessageBufferHandle_t; * BaseType_t xMessageBufferResetFromISR( MessageBufferHandle_t xMessageBuffer ); * @endcode * - * An interrupt safe version of the API function that reset the stream buffer. + * An interrupt safe version of the API function that resets the stream buffer. * Resets a message buffer to its initial empty state, discarding any message it * contained. * * A message buffer can only be reset if there are no tasks blocked on it. + * + * Use xMessageBufferReset() to reset a message buffer from a task. + * Use xMessageBufferResetFromISR() to reset a maessage buffer from an + * interrupt service routine (ISR). * * configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for * xMessageBufferResetFromISR() to be available. diff --git a/include/stream_buffer.h b/include/stream_buffer.h index ef77c33ae5..9847b31f83 100644 --- a/include/stream_buffer.h +++ b/include/stream_buffer.h @@ -766,6 +766,10 @@ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED * the stream buffer is discarded. A stream buffer can only be reset if there * are no tasks blocked waiting to either send to or receive from the stream * buffer. + * + * Use xStreamBufferReset() to reset a stream buffer from a task. + * Use xStreamBufferResetFromISR() to reset a stream buffer from an + * interrupt service routine (ISR). * * configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for * xStreamBufferReset() to be available. @@ -788,12 +792,16 @@ BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_F * BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer ); * @endcode * - * An interrupt safe version of the API function that reset the stream buffer. + * An interrupt safe version of the API function that resets the stream buffer. * * Resets a stream buffer to its initial, empty, state. Any data that was in * the stream buffer is discarded. A stream buffer can only be reset if there * are no tasks blocked waiting to either send to or receive from the stream * buffer. + * + * Use xStreamBufferReset() to reset a stream buffer from a task. + * Use xStreamBufferResetFromISR() to reset a stream buffer from an + * interrupt service routine (ISR). * * configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for * xStreamBufferResetFromISR() to be available. From 715ec74bfe82d2566d6d16ec31a5cd14b43d1d5f Mon Sep 17 00:00:00 2001 From: kar-rahul-aws Date: Tue, 16 Apr 2024 12:28:43 +0530 Subject: [PATCH 4/6] Fix formatting --- include/message_buffer.h | 8 ++++---- include/stream_buffer.h | 4 ++-- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/include/message_buffer.h b/include/message_buffer.h index ef94b6a3eb..966c86bcdf 100644 --- a/include/message_buffer.h +++ b/include/message_buffer.h @@ -767,9 +767,9 @@ typedef StreamBufferHandle_t MessageBufferHandle_t; * contained. * * A message buffer can only be reset if there are no tasks blocked on it. - * + * * Use xMessageBufferReset() to reset a message buffer from a task. - * Use xMessageBufferResetFromISR() to reset a maessage buffer from an + * Use xMessageBufferResetFromISR() to reset a message buffer from an * interrupt service routine (ISR). * * configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for @@ -800,9 +800,9 @@ typedef StreamBufferHandle_t MessageBufferHandle_t; * contained. * * A message buffer can only be reset if there are no tasks blocked on it. - * + * * Use xMessageBufferReset() to reset a message buffer from a task. - * Use xMessageBufferResetFromISR() to reset a maessage buffer from an + * Use xMessageBufferResetFromISR() to reset a message buffer from an * interrupt service routine (ISR). * * configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for diff --git a/include/stream_buffer.h b/include/stream_buffer.h index 9847b31f83..dca9851a59 100644 --- a/include/stream_buffer.h +++ b/include/stream_buffer.h @@ -766,7 +766,7 @@ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED * the stream buffer is discarded. A stream buffer can only be reset if there * are no tasks blocked waiting to either send to or receive from the stream * buffer. - * + * * Use xStreamBufferReset() to reset a stream buffer from a task. * Use xStreamBufferResetFromISR() to reset a stream buffer from an * interrupt service routine (ISR). @@ -798,7 +798,7 @@ BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_F * the stream buffer is discarded. A stream buffer can only be reset if there * are no tasks blocked waiting to either send to or receive from the stream * buffer. - * + * * Use xStreamBufferReset() to reset a stream buffer from a task. * Use xStreamBufferResetFromISR() to reset a stream buffer from an * interrupt service routine (ISR). From b41e99ca1fc66e707ba3014201296f37cfac8355 Mon Sep 17 00:00:00 2001 From: Gaurav Aggarwal Date: Tue, 16 Apr 2024 12:20:39 +0000 Subject: [PATCH 5/6] Code review suggestions Signed-off-by: Gaurav Aggarwal --- include/FreeRTOS.h | 4 ++++ stream_buffer.c | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/include/FreeRTOS.h b/include/FreeRTOS.h index 3822cc774c..662c5ea15f 100644 --- a/include/FreeRTOS.h +++ b/include/FreeRTOS.h @@ -1001,6 +1001,10 @@ #define traceSTREAM_BUFFER_RESET( xStreamBuffer ) #endif +#ifndef traceSTREAM_BUFFER_RESET_FROM_ISR + #define traceSTREAM_BUFFER_RESET_FROM_ISR( xStreamBuffer ) +#endif + #ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND #define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer ) #endif diff --git a/stream_buffer.c b/stream_buffer.c index cadc9e62fb..17a898d454 100644 --- a/stream_buffer.c +++ b/stream_buffer.c @@ -688,7 +688,7 @@ BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer ) } #endif - traceSTREAM_BUFFER_RESET( xStreamBuffer ); + traceSTREAM_BUFFER_RESET_FROM_ISR( xStreamBuffer ); xReturn = pdPASS; } From 9690251a10b62c72c016b7bbb380bc595b3ce14f Mon Sep 17 00:00:00 2001 From: Gaurav Aggarwal Date: Tue, 16 Apr 2024 12:26:32 +0000 Subject: [PATCH 6/6] Minor code review suggestion Signed-off-by: Gaurav Aggarwal --- include/message_buffer.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/message_buffer.h b/include/message_buffer.h index 966c86bcdf..b58f33f473 100644 --- a/include/message_buffer.h +++ b/include/message_buffer.h @@ -795,7 +795,7 @@ typedef StreamBufferHandle_t MessageBufferHandle_t; * BaseType_t xMessageBufferResetFromISR( MessageBufferHandle_t xMessageBuffer ); * @endcode * - * An interrupt safe version of the API function that resets the stream buffer. + * An interrupt safe version of the API function that resets the message buffer. * Resets a message buffer to its initial empty state, discarding any message it * contained. *