]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/Common/Minimal/TaskNotify.c
Changes to the FreeRTOS code:
[freertos] / FreeRTOS / Demo / Common / Minimal / TaskNotify.c
index e74d0599e08b09ea8e07049cc7a4ed2283a9daef..2a65b86c1567d3909683e23facd02b0f88bf6b5d 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
-    FreeRTOS V8.2.1 - Copyright (C) 2015 Real Time Engineers Ltd.\r
+    FreeRTOS V8.2.3 - Copyright (C) 2015 Real Time Engineers Ltd.\r
     All rights reserved\r
 \r
     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\r
@@ -8,7 +8,7 @@
 \r
     FreeRTOS is free software; you can redistribute it and/or modify it under\r
     the terms of the GNU General Public License (version 2) as published by the\r
-    Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.\r
+    Free Software Foundation >>>> AND MODIFIED BY <<<< the FreeRTOS exception.\r
 \r
     ***************************************************************************\r
     >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
@@ -356,7 +356,7 @@ const uint32_t ulBit0 = 0x01UL, ulBit1 = 0x02UL;
 \r
 \r
        /*--------------------------------------------------------------------------\r
-       Now try querying the previus value while notifying a task. */\r
+       Now try querying the previous value while notifying a task. */\r
        xTaskNotifyAndQuery( xTaskToNotify, 0x00, eSetBits, &ulPreviousValue );\r
        configASSERT( ulNotifiedValue == ( ULONG_MAX & ~( ulBit0 | ulBit1 ) ) );\r
 \r
@@ -376,6 +376,28 @@ const uint32_t ulBit0 = 0x01UL, ulBit1 = 0x02UL;
                ulExpectedValue |= ulLoop;\r
        }\r
 \r
+\r
+\r
+       /* -------------------------------------------------------------------------\r
+       Clear the previous notifications. */\r
+       xTaskNotifyWait( ULONG_MAX, 0, &ulNotifiedValue, 0 );\r
+\r
+       /* The task should not have any notifications pending, so an attempt to clear\r
+       the notification state should fail. */\r
+       configASSERT( xTaskNotifyStateClear( NULL ) == pdFALSE );\r
+\r
+       /* Get the task to notify itself.  This is not a normal thing to do, and is\r
+       only done here for test purposes. */\r
+       xTaskNotifyAndQuery( xTaskToNotify, ulFirstNotifiedConst, eSetValueWithoutOverwrite, &ulPreviousValue );\r
+\r
+       /* Now the notification state should be eNotified, so it should now be\r
+       possible to clear the notification state. */\r
+       configASSERT( xTaskNotifyStateClear( NULL ) == pdTRUE );\r
+       configASSERT( xTaskNotifyStateClear( NULL ) == pdFALSE );\r
+\r
+\r
+\r
+\r
        /* Incremented to show the task is still running. */\r
        ulNotifyCycleCount++;\r
 \r
@@ -403,6 +425,7 @@ static void prvNotifiedTask( void *pvParameters )
 {\r
 const TickType_t xMaxPeriod = pdMS_TO_TICKS( 90 ), xMinPeriod = pdMS_TO_TICKS( 10 ), xDontBlock = 0;\r
 TickType_t xPeriod;\r
+const uint32_t ulCyclesToRaisePriority = 50UL;\r
 \r
        /* Remove compiler warnings about unused parameters. */\r
        ( void ) pvParameters;\r
@@ -460,9 +483,28 @@ TickType_t xPeriod;
                the function call. */\r
                ulTimerNotificationsReceived += ulTaskNotifyTake( pdTRUE, xPeriod );\r
 \r
-               /* Wait for the next notification again, clearing all notifications if\r
-               one is received, but this time blocking indefinitely. */\r
-               ulTimerNotificationsReceived += ulTaskNotifyTake( pdTRUE, portMAX_DELAY );\r
+               /* Occasionally raise the priority of the task being notified to test\r
+               the path where the task is notified from an ISR and becomes the highest\r
+               priority ready state task, but the pxHigherPriorityTaskWoken parameter\r
+               is NULL (which it is in the tick hook that sends notifications to this\r
+               task. */\r
+               if( ( ulNotifyCycleCount % ulCyclesToRaisePriority ) == 0 )\r
+               {\r
+                       vTaskPrioritySet( xTaskToNotify, configMAX_PRIORITIES - 1 );\r
+\r
+                       /* Wait for the next notification again, clearing all notifications if\r
+                       one is received, but this time blocking indefinitely. */\r
+                       ulTimerNotificationsReceived += ulTaskNotifyTake( pdTRUE, portMAX_DELAY );\r
+\r
+                       /* Reset the priority. */\r
+                       vTaskPrioritySet( xTaskToNotify, notifyTASK_PRIORITY );\r
+               }\r
+               else\r
+               {\r
+                       /* Wait for the next notification again, clearing all notifications if\r
+                       one is received, but this time blocking indefinitely. */\r
+                       ulTimerNotificationsReceived += ulTaskNotifyTake( pdTRUE, portMAX_DELAY );\r
+               }\r
 \r
                /* Incremented to show the task is still running. */\r
                ulNotifyCycleCount++;\r
@@ -509,9 +551,9 @@ const uint32_t ulUnexpectedValue = 0xff;
                                                break;\r
 \r
                                default:/* Should never get here!. */\r
-                                               break;                                          \r
+                                               break;\r
                        }\r
-                       \r
+\r
                        ulTimerNotificationsSent++;\r
                }\r
        }\r
@@ -556,6 +598,6 @@ const uint32_t ulMultiplier = 0x015a4e35UL, ulIncrement = 1UL;
 \r
        /* Utility function to generate a pseudo random number. */\r
        ulNextRand = ( ulMultiplier * ulNextRand ) + ulIncrement;\r
-       return( ( int ) ( ulNextRand >> 16UL ) & 0x7fffUL );\r
+       return( ( ulNextRand >> 16UL ) & 0x7fffUL );\r
 }\r
 /*-----------------------------------------------------------*/\r