\r
/*\r
* This file contains some test scenarios that ensure tasks respond correctly\r
- * to xTaskAbortDelay() calls.\r
+ * to xTaskAbortDelay() calls. It also ensures tasks return the correct state\r
+ * of eBlocked when blocked indefinitely in both the case where a task is\r
+ * blocked on an object and when a task is blocked on a notification.\r
*/\r
\r
/* Standard includes. */\r
#include "queue.h"\r
#include "semphr.h"\r
#include "event_groups.h"\r
+#include "stream_buffer.h"\r
\r
/* Demo includes. */\r
#include "AbortDelay.h"\r
#define abtSEMAPHORE_TAKE_ABORTS 4\r
#define abtEVENT_GROUP_ABORTS 5\r
#define abtQUEUE_SEND_ABORTS 6\r
-#define abtMAX_TESTS 7\r
+#define abtSTREAM_BUFFER_RECEIVE 7\r
+#define abtMAX_TESTS 8\r
\r
/*-----------------------------------------------------------*/\r
\r
static void prvTestAbortingSemaphoreTake( void );\r
static void prvTestAbortingEventGroupWait( void );\r
static void prvTestAbortingQueueSend( void );\r
+static void prvTestAbortingStreamBufferReceive( void );\r
\r
/*\r
* Checks the amount of time a task spent in the Blocked state is within the\r
prvTestAbortingQueueSend();\r
break;\r
\r
+ case abtSTREAM_BUFFER_RECEIVE:\r
+ prvTestAbortingStreamBufferReceive();\r
+ break;\r
+\r
default:\r
/* Should not get here. */\r
break;\r
}\r
/*-----------------------------------------------------------*/\r
\r
+static void prvTestAbortingStreamBufferReceive( void )\r
+{\r
+TickType_t xTimeAtStart;\r
+StreamBufferHandle_t xStreamBuffer;\r
+EventBits_t xReturn;\r
+const size_t xTriggerLevelBytes = ( size_t ) 1;\r
+uint8_t uxRxData;\r
+\r
+ #if( configSUPPORT_STATIC_ALLOCATION == 1 )\r
+ {\r
+ /* Defines the memory that will actually hold the streams within the\r
+ stream buffer. */\r
+ static uint8_t ucStorageBuffer[ sizeof( configMESSAGE_BUFFER_LENGTH_TYPE ) + 1 ];\r
+\r
+ /* The variable used to hold the stream buffer structure. */\r
+ StaticStreamBuffer_t xStreamBufferStruct;\r
+\r
+\r
+ xStreamBuffer = xStreamBufferCreateStatic( sizeof( ucStorageBuffer ),\r
+ xTriggerLevelBytes,\r
+ ucStorageBuffer,\r
+ &xStreamBufferStruct );\r
+ }\r
+ #else\r
+ {\r
+ xStreamBuffer = xStreamBufferCreate( sizeof( uint8_t ), xTriggerLevelBytes );\r
+ configASSERT( xStreamBuffer );\r
+ }\r
+ #endif\r
+\r
+ /* Note the time before the delay so the length of the delay is known. */\r
+ xTimeAtStart = xTaskGetTickCount();\r
+\r
+ /* This first delay should just time out. */\r
+ xReturn = xStreamBufferReceive( xStreamBuffer, &uxRxData, sizeof( uxRxData ), xMaxBlockTime );\r
+ if( xReturn != 0x00 )\r
+ {\r
+ xErrorOccurred = pdTRUE;\r
+ }\r
+ prvCheckExpectedTimeIsWithinAnAcceptableMargin( xTimeAtStart, xMaxBlockTime );\r
+\r
+ /* Note the time before the delay so the length of the delay is known. */\r
+ xTimeAtStart = xTaskGetTickCount();\r
+\r
+ /* This second delay should be aborted by the primary task half way\r
+ through xMaxBlockTime. */\r
+ xReturn = xStreamBufferReceive( xStreamBuffer, &uxRxData, sizeof( uxRxData ), xMaxBlockTime );\r
+ if( xReturn != 0x00 )\r
+ {\r
+ xErrorOccurred = pdTRUE;\r
+ }\r
+ prvCheckExpectedTimeIsWithinAnAcceptableMargin( xTimeAtStart, xHalfMaxBlockTime );\r
+\r
+ /* Note the time before the delay so the length of the delay is known. */\r
+ xTimeAtStart = xTaskGetTickCount();\r
+\r
+ /* This third delay should just time out again. */\r
+ xReturn = xStreamBufferReceive( xStreamBuffer, &uxRxData, sizeof( uxRxData ), xMaxBlockTime );\r
+ if( xReturn != 0x00 )\r
+ {\r
+ xErrorOccurred = pdTRUE;\r
+ }\r
+ prvCheckExpectedTimeIsWithinAnAcceptableMargin( xTimeAtStart, xMaxBlockTime );\r
+\r
+ /* Not really necessary in this case, but for completeness. */\r
+ vStreamBufferDelete( xStreamBuffer );\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
static void prvTestAbortingQueueSend( void )\r
{\r
TickType_t xTimeAtStart;\r
xTimeAtStart = xTaskGetTickCount();\r
\r
/* This second delay should be aborted by the primary task half way\r
- through. */\r
- xReturn = xSemaphoreTake( xSemaphore, xMaxBlockTime );\r
+ through xMaxBlockTime. */\r
+ xReturn = xSemaphoreTake( xSemaphore, portMAX_DELAY );\r
if( xReturn != pdFALSE )\r
{\r
xErrorOccurred = pdTRUE;\r
xTimeAtStart = xTaskGetTickCount();\r
\r
/* This second delay should be aborted by the primary task half way\r
- through. */\r
- xReturn = xTaskNotifyWait( 0, 0, NULL, xMaxBlockTime );\r
+ through xMaxBlockTime. */\r
+ xReturn = xTaskNotifyWait( 0, 0, NULL, portMAX_DELAY );\r
if( xReturn != pdFALSE )\r
{\r
xErrorOccurred = pdTRUE;\r
else if( pxStateList == &xSuspendedTaskList )\r
{\r
/* The task being queried is referenced from the suspended\r
- list. Is it genuinely suspended or is it block\r
+ list. Is it genuinely suspended or is it blocked\r
indefinitely? */\r
if( listLIST_ITEM_CONTAINER( &( pxTCB->xEventListItem ) ) == NULL )\r
{\r
- eReturn = eSuspended;\r
+ #if( configUSE_TASK_NOTIFICATIONS == 1 )\r
+ {\r
+ /* The task does not appear on the vent list item of\r
+ and of the RTOS objects, but could still be in the\r
+ blocked state if it is waiting on its notification\r
+ rather than waiting on an object. */\r
+ if( pxTCB->ucNotifyState == taskWAITING_NOTIFICATION )\r
+ {\r
+ eReturn = eBlocked;\r
+ }\r
+ else\r
+ {\r
+ eReturn = eSuspended;\r
+ }\r
+ }\r
+ #else\r
+ {\r
+ eReturn = eSuspended;\r
+ }\r
+ #endif\r
}\r
else\r
{\r
{\r
*pxHigherPriorityTaskWoken = pdTRUE;\r
}\r
- else\r
- {\r
- /* Mark that a yield is pending in case the user is not\r
- using the "xHigherPriorityTaskWoken" parameter to an ISR\r
- safe FreeRTOS function. */\r
- xYieldPending = pdTRUE;\r
- }\r
+\r
+ /* Mark that a yield is pending in case the user is not\r
+ using the "xHigherPriorityTaskWoken" parameter to an ISR\r
+ safe FreeRTOS function. */\r
+ xYieldPending = pdTRUE;\r
}\r
else\r
{\r
{\r
*pxHigherPriorityTaskWoken = pdTRUE;\r
}\r
- else\r
- {\r
- /* Mark that a yield is pending in case the user is not\r
- using the "xHigherPriorityTaskWoken" parameter in an ISR\r
- safe FreeRTOS function. */\r
- xYieldPending = pdTRUE;\r
- }\r
+\r
+ /* Mark that a yield is pending in case the user is not\r
+ using the "xHigherPriorityTaskWoken" parameter in an ISR\r
+ safe FreeRTOS function. */\r
+ xYieldPending = pdTRUE;\r
}\r
else\r
{\r