Skip to content

Commit f07958c

Browse files
authored
Merge branch 'main' into update_mpu_wrapper_forStreamBufferResetFromISR
2 parents 8ad4aed + 9bfd0ab commit f07958c

File tree

4 files changed

+146
-0
lines changed

4 files changed

+146
-0
lines changed

include/FreeRTOS.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1001,6 +1001,10 @@
10011001
#define traceSTREAM_BUFFER_RESET( xStreamBuffer )
10021002
#endif
10031003

1004+
#ifndef traceSTREAM_BUFFER_RESET_FROM_ISR
1005+
#define traceSTREAM_BUFFER_RESET_FROM_ISR( xStreamBuffer )
1006+
#endif
1007+
10041008
#ifndef traceBLOCKING_ON_STREAM_BUFFER_SEND
10051009
#define traceBLOCKING_ON_STREAM_BUFFER_SEND( xStreamBuffer )
10061010
#endif
@@ -2437,6 +2441,14 @@
24372441
#define traceRETURN_xStreamBufferReset( xReturn )
24382442
#endif
24392443

2444+
#ifndef traceENTER_xStreamBufferResetFromISR
2445+
#define traceENTER_xStreamBufferResetFromISR( xStreamBuffer )
2446+
#endif
2447+
2448+
#ifndef traceRETURN_xStreamBufferResetFromISR
2449+
#define traceRETURN_xStreamBufferResetFromISR( xReturn )
2450+
#endif
2451+
24402452
#ifndef traceENTER_xStreamBufferSetTriggerLevel
24412453
#define traceENTER_xStreamBufferSetTriggerLevel( xStreamBuffer, xTriggerLevel )
24422454
#endif

include/message_buffer.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -768,6 +768,10 @@ typedef StreamBufferHandle_t MessageBufferHandle_t;
768768
*
769769
* A message buffer can only be reset if there are no tasks blocked on it.
770770
*
771+
* Use xMessageBufferReset() to reset a message buffer from a task.
772+
* Use xMessageBufferResetFromISR() to reset a message buffer from an
773+
* interrupt service routine (ISR).
774+
*
771775
* configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for
772776
* xMessageBufferReset() to be available.
773777
*
@@ -785,6 +789,38 @@ typedef StreamBufferHandle_t MessageBufferHandle_t;
785789
xStreamBufferReset( xMessageBuffer )
786790

787791

792+
/**
793+
* message_buffer.h
794+
* @code{c}
795+
* BaseType_t xMessageBufferResetFromISR( MessageBufferHandle_t xMessageBuffer );
796+
* @endcode
797+
*
798+
* An interrupt safe version of the API function that resets the message buffer.
799+
* Resets a message buffer to its initial empty state, discarding any message it
800+
* contained.
801+
*
802+
* A message buffer can only be reset if there are no tasks blocked on it.
803+
*
804+
* Use xMessageBufferReset() to reset a message buffer from a task.
805+
* Use xMessageBufferResetFromISR() to reset a message buffer from an
806+
* interrupt service routine (ISR).
807+
*
808+
* configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for
809+
* xMessageBufferResetFromISR() to be available.
810+
*
811+
* @param xMessageBuffer The handle of the message buffer being reset.
812+
*
813+
* @return If the message buffer was reset then pdPASS is returned. If the
814+
* message buffer could not be reset because either there was a task blocked on
815+
* the message queue to wait for space to become available, or to wait for a
816+
* a message to be available, then pdFAIL is returned.
817+
*
818+
* \defgroup xMessageBufferResetFromISR xMessageBufferResetFromISR
819+
* \ingroup MessageBufferManagement
820+
*/
821+
#define xMessageBufferResetFromISR( xMessageBuffer ) \
822+
xStreamBufferResetFromISR( xMessageBuffer )
823+
788824
/**
789825
* message_buffer.h
790826
* @code{c}

include/stream_buffer.h

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -767,6 +767,10 @@ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED
767767
* are no tasks blocked waiting to either send to or receive from the stream
768768
* buffer.
769769
*
770+
* Use xStreamBufferReset() to reset a stream buffer from a task.
771+
* Use xStreamBufferResetFromISR() to reset a stream buffer from an
772+
* interrupt service routine (ISR).
773+
*
770774
* configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for
771775
* xStreamBufferReset() to be available.
772776
*
@@ -781,6 +785,38 @@ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED
781785
*/
782786
BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
783787

788+
/**
789+
* stream_buffer.h
790+
*
791+
* @code{c}
792+
* BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer );
793+
* @endcode
794+
*
795+
* An interrupt safe version of the API function that resets the stream buffer.
796+
*
797+
* Resets a stream buffer to its initial, empty, state. Any data that was in
798+
* the stream buffer is discarded. A stream buffer can only be reset if there
799+
* are no tasks blocked waiting to either send to or receive from the stream
800+
* buffer.
801+
*
802+
* Use xStreamBufferReset() to reset a stream buffer from a task.
803+
* Use xStreamBufferResetFromISR() to reset a stream buffer from an
804+
* interrupt service routine (ISR).
805+
*
806+
* configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for
807+
* xStreamBufferResetFromISR() to be available.
808+
*
809+
* @param xStreamBuffer The handle of the stream buffer being reset.
810+
*
811+
* @return If the stream buffer is reset then pdPASS is returned. If there was
812+
* a task blocked waiting to send to or read from the stream buffer then the
813+
* stream buffer is not reset and pdFAIL is returned.
814+
*
815+
* \defgroup xStreamBufferResetFromISR xStreamBufferResetFromISR
816+
* \ingroup StreamBufferManagement
817+
*/
818+
BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
819+
784820
/**
785821
* stream_buffer.h
786822
*

stream_buffer.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -639,6 +639,68 @@ BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer )
639639
}
640640
/*-----------------------------------------------------------*/
641641

642+
BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer )
643+
{
644+
StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;
645+
BaseType_t xReturn = pdFAIL;
646+
StreamBufferCallbackFunction_t pxSendCallback = NULL, pxReceiveCallback = NULL;
647+
UBaseType_t uxSavedInterruptStatus;
648+
649+
#if ( configUSE_TRACE_FACILITY == 1 )
650+
UBaseType_t uxStreamBufferNumber;
651+
#endif
652+
653+
traceENTER_xStreamBufferResetFromISR( xStreamBuffer );
654+
655+
configASSERT( pxStreamBuffer );
656+
657+
#if ( configUSE_TRACE_FACILITY == 1 )
658+
{
659+
/* Store the stream buffer number so it can be restored after the
660+
* reset. */
661+
uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber;
662+
}
663+
#endif
664+
665+
/* Can only reset a message buffer if there are no tasks blocked on it. */
666+
uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();
667+
{
668+
if( ( pxStreamBuffer->xTaskWaitingToReceive == NULL ) && ( pxStreamBuffer->xTaskWaitingToSend == NULL ) )
669+
{
670+
#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
671+
{
672+
pxSendCallback = pxStreamBuffer->pxSendCompletedCallback;
673+
pxReceiveCallback = pxStreamBuffer->pxReceiveCompletedCallback;
674+
}
675+
#endif
676+
677+
prvInitialiseNewStreamBuffer( pxStreamBuffer,
678+
pxStreamBuffer->pucBuffer,
679+
pxStreamBuffer->xLength,
680+
pxStreamBuffer->xTriggerLevelBytes,
681+
pxStreamBuffer->ucFlags,
682+
pxSendCallback,
683+
pxReceiveCallback );
684+
685+
#if ( configUSE_TRACE_FACILITY == 1 )
686+
{
687+
pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber;
688+
}
689+
#endif
690+
691+
traceSTREAM_BUFFER_RESET_FROM_ISR( xStreamBuffer );
692+
693+
xReturn = pdPASS;
694+
}
695+
}
696+
taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );
697+
698+
traceRETURN_xStreamBufferResetFromISR( xReturn );
699+
700+
return xReturn;
701+
}
702+
/*-----------------------------------------------------------*/
703+
642704
BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,
643705
size_t xTriggerLevel )
644706
{

0 commit comments

Comments
 (0)