]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/Common/Minimal/AbortDelay.c
xTaskGenericNotify() now sets xYieldPending to pdTRUE even when the 'higher priority...
[freertos] / FreeRTOS / Demo / Common / Minimal / AbortDelay.c
index e18259a08a640229b60abfa9cdc7277e1779cde7..6ee9d894eefb2bd6c98531cb7ca28d3bf65fc63c 100644 (file)
@@ -27,7 +27,9 @@
 \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
@@ -39,6 +41,7 @@
 #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
@@ -68,7 +71,8 @@ build.  Remove the whole file if this is not the case. */
 #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
@@ -95,6 +99,7 @@ static void prvTestAbortingTaskDelayUntil( void );
 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
@@ -241,6 +246,10 @@ const uint32_t ulMax = 0xffffffffUL;
                                prvTestAbortingQueueSend();\r
                                break;\r
 \r
+                       case abtSTREAM_BUFFER_RECEIVE:\r
+                               prvTestAbortingStreamBufferReceive();\r
+                               break;\r
+\r
                        default:\r
                                /* Should not get here. */\r
                                break;\r
@@ -417,6 +426,75 @@ EventBits_t xBitsToWaitFor = ( EventBits_t ) 0x01, xReturn;
 }\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
@@ -523,8 +601,8 @@ SemaphoreHandle_t xSemaphore;
        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
@@ -567,8 +645,8 @@ BaseType_t xReturn;
        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