Skip to content

Commit a934ce9

Browse files
authored
Merge branch 'main' into blocking_buffer
2 parents 9d80b0b + 9bfd0ab commit a934ce9

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
@@ -939,6 +939,10 @@ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED
939939
* are no tasks blocked waiting to either send to or receive from the stream
940940
* buffer.
941941
*
942+
* Use xStreamBufferReset() to reset a stream buffer from a task.
943+
* Use xStreamBufferResetFromISR() to reset a stream buffer from an
944+
* interrupt service routine (ISR).
945+
*
942946
* configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for
943947
* xStreamBufferReset() to be available.
944948
*
@@ -953,6 +957,38 @@ BaseType_t xStreamBufferIsEmpty( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED
953957
*/
954958
BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
955959

960+
/**
961+
* stream_buffer.h
962+
*
963+
* @code{c}
964+
* BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer );
965+
* @endcode
966+
*
967+
* An interrupt safe version of the API function that resets the stream buffer.
968+
*
969+
* Resets a stream buffer to its initial, empty, state. Any data that was in
970+
* the stream buffer is discarded. A stream buffer can only be reset if there
971+
* are no tasks blocked waiting to either send to or receive from the stream
972+
* buffer.
973+
*
974+
* Use xStreamBufferReset() to reset a stream buffer from a task.
975+
* Use xStreamBufferResetFromISR() to reset a stream buffer from an
976+
* interrupt service routine (ISR).
977+
*
978+
* configUSE_STREAM_BUFFERS must be set to 1 in for FreeRTOSConfig.h for
979+
* xStreamBufferResetFromISR() to be available.
980+
*
981+
* @param xStreamBuffer The handle of the stream buffer being reset.
982+
*
983+
* @return If the stream buffer is reset then pdPASS is returned. If there was
984+
* a task blocked waiting to send to or read from the stream buffer then the
985+
* stream buffer is not reset and pdFAIL is returned.
986+
*
987+
* \defgroup xStreamBufferResetFromISR xStreamBufferResetFromISR
988+
* \ingroup StreamBufferManagement
989+
*/
990+
BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer ) PRIVILEGED_FUNCTION;
991+
956992
/**
957993
* stream_buffer.h
958994
*

stream_buffer.c

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -654,6 +654,68 @@ BaseType_t xStreamBufferReset( StreamBufferHandle_t xStreamBuffer )
654654
}
655655
/*-----------------------------------------------------------*/
656656

657+
BaseType_t xStreamBufferResetFromISR( StreamBufferHandle_t xStreamBuffer )
658+
{
659+
StreamBuffer_t * const pxStreamBuffer = xStreamBuffer;
660+
BaseType_t xReturn = pdFAIL;
661+
StreamBufferCallbackFunction_t pxSendCallback = NULL, pxReceiveCallback = NULL;
662+
UBaseType_t uxSavedInterruptStatus;
663+
664+
#if ( configUSE_TRACE_FACILITY == 1 )
665+
UBaseType_t uxStreamBufferNumber;
666+
#endif
667+
668+
traceENTER_xStreamBufferResetFromISR( xStreamBuffer );
669+
670+
configASSERT( pxStreamBuffer );
671+
672+
#if ( configUSE_TRACE_FACILITY == 1 )
673+
{
674+
/* Store the stream buffer number so it can be restored after the
675+
* reset. */
676+
uxStreamBufferNumber = pxStreamBuffer->uxStreamBufferNumber;
677+
}
678+
#endif
679+
680+
/* Can only reset a message buffer if there are no tasks blocked on it. */
681+
uxSavedInterruptStatus = taskENTER_CRITICAL_FROM_ISR();
682+
{
683+
if( ( pxStreamBuffer->xTaskWaitingToReceive == NULL ) && ( pxStreamBuffer->xTaskWaitingToSend == NULL ) )
684+
{
685+
#if ( configUSE_SB_COMPLETED_CALLBACK == 1 )
686+
{
687+
pxSendCallback = pxStreamBuffer->pxSendCompletedCallback;
688+
pxReceiveCallback = pxStreamBuffer->pxReceiveCompletedCallback;
689+
}
690+
#endif
691+
692+
prvInitialiseNewStreamBuffer( pxStreamBuffer,
693+
pxStreamBuffer->pucBuffer,
694+
pxStreamBuffer->xLength,
695+
pxStreamBuffer->xTriggerLevelBytes,
696+
pxStreamBuffer->ucFlags,
697+
pxSendCallback,
698+
pxReceiveCallback );
699+
700+
#if ( configUSE_TRACE_FACILITY == 1 )
701+
{
702+
pxStreamBuffer->uxStreamBufferNumber = uxStreamBufferNumber;
703+
}
704+
#endif
705+
706+
traceSTREAM_BUFFER_RESET_FROM_ISR( xStreamBuffer );
707+
708+
xReturn = pdPASS;
709+
}
710+
}
711+
taskEXIT_CRITICAL_FROM_ISR( uxSavedInterruptStatus );
712+
713+
traceRETURN_xStreamBufferResetFromISR( xReturn );
714+
715+
return xReturn;
716+
}
717+
/*-----------------------------------------------------------*/
718+
657719
BaseType_t xStreamBufferSetTriggerLevel( StreamBufferHandle_t xStreamBuffer,
658720
size_t xTriggerLevel )
659721
{

0 commit comments

Comments
 (0)