]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/Common/Minimal/TaskNotify.c
Microblaze: Add a port optimised task selection implementation to the Microblaze...
[freertos] / FreeRTOS / Demo / Common / Minimal / TaskNotify.c
index ca2bf18fde023d26b0eb8778dd248f621a31b3cd..f963a758b81222c87d5f4de8a4ece1ab05d6d23c 100644 (file)
@@ -1,5 +1,5 @@
 /*\r
 /*\r
-    FreeRTOS V8.2.0rc1 - Copyright (C) 2014 Real Time Engineers Ltd.\r
+    FreeRTOS V8.2.1 - 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
     All rights reserved\r
 \r
     VISIT http://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.\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
 \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
 \r
+    ***************************************************************************\r
     >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
     >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
     >>!   obliged to provide the source code for proprietary components     !<<\r
     >>!   outside of the FreeRTOS kernel.                                   !<<\r
     >>!   NOTE: The modification to the GPL is included to allow you to     !<<\r
     >>!   distribute a combined work that includes FreeRTOS without being   !<<\r
     >>!   obliged to provide the source code for proprietary components     !<<\r
     >>!   outside of the FreeRTOS kernel.                                   !<<\r
+    ***************************************************************************\r
 \r
     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
     FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
     link: http://www.freertos.org/a00114.html\r
 \r
 \r
     FreeRTOS is distributed in the hope that it will be useful, but WITHOUT ANY\r
     WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS\r
     FOR A PARTICULAR PURPOSE.  Full license text is available on the following\r
     link: http://www.freertos.org/a00114.html\r
 \r
-    1 tab == 4 spaces!\r
-\r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *    Having a problem?  Start by reading the FAQ "My application does   *\r
-     *    not run, what could be wrong?".  Have you defined configASSERT()?  *\r
-     *                                                                       *\r
-     *    http://www.FreeRTOS.org/FAQHelp.html                               *\r
-     *                                                                       *\r
-    ***************************************************************************\r
-\r
     ***************************************************************************\r
      *                                                                       *\r
      *    FreeRTOS provides completely free yet professionally developed,    *\r
     ***************************************************************************\r
      *                                                                       *\r
      *    FreeRTOS provides completely free yet professionally developed,    *\r
      *                                                                       *\r
     ***************************************************************************\r
 \r
      *                                                                       *\r
     ***************************************************************************\r
 \r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *   Investing in training allows your team to be as productive as       *\r
-     *   possible as early as possible, lowering your overall development    *\r
-     *   cost, and enabling you to bring a more robust product to market     *\r
-     *   earlier than would otherwise be possible.  Richard Barry is both    *\r
-     *   the architect and key author of FreeRTOS, and so also the world's   *\r
-     *   leading authority on what is the world's most popular real time     *\r
-     *   kernel for deeply embedded MCU designs.  Obtaining your training    *\r
-     *   from Richard ensures your team will gain directly from his in-depth *\r
-     *   product knowledge and years of usage experience.  Contact Real Time *\r
-     *   Engineers Ltd to enquire about the FreeRTOS Masterclass, presented  *\r
-     *   by Richard Barry:  http://www.FreeRTOS.org/contact\r
-     *                                                                       *\r
-    ***************************************************************************\r
+    http://www.FreeRTOS.org/FAQHelp.html - Having a problem?  Start by reading\r
+    the FAQ page "My application does not run, what could be wrong?".  Have you\r
+    defined configASSERT()?\r
 \r
 \r
-    ***************************************************************************\r
-     *                                                                       *\r
-     *    You are receiving this top quality software for free.  Please play *\r
-     *    fair and reciprocate by reporting any suspected issues and         *\r
-     *    participating in the community forum:                              *\r
-     *    http://www.FreeRTOS.org/support                                    *\r
-     *                                                                       *\r
-     *    Thank you!                                                         *\r
-     *                                                                       *\r
-    ***************************************************************************\r
+    http://www.FreeRTOS.org/support - In return for receiving this top quality\r
+    embedded software for free we request you assist our global community by\r
+    participating in the support forum.\r
 \r
 \r
-    http://www.FreeRTOS.org - Documentation, books, training, latest versions,\r
-    license and Real Time Engineers Ltd. contact details.\r
+    http://www.FreeRTOS.org/training - Investing in training allows your team to\r
+    be as productive as possible as early as possible.  Now you can receive\r
+    FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers\r
+    Ltd, and the world's leading authority on the world's leading RTOS.\r
 \r
     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
     including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
 \r
     http://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,\r
     including FreeRTOS+Trace - an indispensable productivity tool, a DOS\r
@@ -82,7 +56,7 @@
     http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
     Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
 \r
     http://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.\r
     Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.\r
 \r
-    http://www.OpenRTOS.com - Real Time Engineers ltd license FreeRTOS to High\r
+    http://www.OpenRTOS.com - Real Time Engineers ltd. license FreeRTOS to High\r
     Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
     licenses offer ticketed support, indemnification and commercial middleware.\r
 \r
     Integrity Systems ltd. to sell under the OpenRTOS brand.  Low cost OpenRTOS\r
     licenses offer ticketed support, indemnification and commercial middleware.\r
 \r
@@ -173,7 +147,7 @@ static void prvSingleTaskTests( void )
 {\r
 const TickType_t xTicksToWait = pdMS_TO_TICKS( 100UL );\r
 BaseType_t xReturned;\r
 {\r
 const TickType_t xTicksToWait = pdMS_TO_TICKS( 100UL );\r
 BaseType_t xReturned;\r
-uint32_t ulNotifiedValue, ulLoop, ulNotifyingValue;\r
+uint32_t ulNotifiedValue, ulLoop, ulNotifyingValue, ulPreviousValue, ulExpectedValue;\r
 TickType_t xTimeOnEntering;\r
 const uint32_t ulFirstNotifiedConst = 100001UL, ulSecondNotifiedValueConst = 5555UL, ulMaxLoops = 5UL;\r
 const uint32_t ulBit0 = 0x01UL, ulBit1 = 0x02UL;\r
 TickType_t xTimeOnEntering;\r
 const uint32_t ulFirstNotifiedConst = 100001UL, ulSecondNotifiedValueConst = 5555UL, ulMaxLoops = 5UL;\r
 const uint32_t ulBit0 = 0x01UL, ulBit1 = 0x02UL;\r
@@ -198,12 +172,15 @@ const uint32_t ulBit0 = 0x01UL, ulBit1 = 0x02UL;
        Check no blocking when notifications are pending.  First notify itself -\r
        this would not be a normal thing to do and is done here for test purposes\r
        only. */\r
        Check no blocking when notifications are pending.  First notify itself -\r
        this would not be a normal thing to do and is done here for test purposes\r
        only. */\r
-       xReturned = xTaskNotify( xTaskToNotify, ulFirstNotifiedConst, eSetValueWithoutOverwrite );\r
+       xReturned = xTaskNotifyAndQuery( xTaskToNotify, ulFirstNotifiedConst, eSetValueWithoutOverwrite, &ulPreviousValue );\r
 \r
        /* Even through the 'without overwrite' action was used the update should\r
        have been successful. */\r
        configASSERT( xReturned == pdPASS );\r
 \r
 \r
        /* Even through the 'without overwrite' action was used the update should\r
        have been successful. */\r
        configASSERT( xReturned == pdPASS );\r
 \r
+       /* No bits should have been pending previously. */\r
+       configASSERT( ulPreviousValue == 0 );\r
+\r
        /* The task should now have a notification pending, and so not time out. */\r
        xTimeOnEntering = xTaskGetTickCount();\r
        xReturned = xTaskNotifyWait( ULONG_MAX, 0, &ulNotifiedValue, xTicksToWait );\r
        /* The task should now have a notification pending, and so not time out. */\r
        xTimeOnEntering = xTaskGetTickCount();\r
        xReturned = xTaskNotifyWait( ULONG_MAX, 0, &ulNotifiedValue, xTicksToWait );\r
@@ -377,6 +354,28 @@ const uint32_t ulBit0 = 0x01UL, ulBit1 = 0x02UL;
 \r
 \r
 \r
 \r
 \r
 \r
+\r
+       /*--------------------------------------------------------------------------\r
+       Now try querying the previus value while notifying a task. */\r
+       xTaskNotifyAndQuery( xTaskToNotify, 0x00, eSetBits, &ulPreviousValue );\r
+       configASSERT( ulNotifiedValue == ( ULONG_MAX & ~( ulBit0 | ulBit1 ) ) );\r
+\r
+       /* Clear all bits. */\r
+       xTaskNotifyWait( 0x00, ULONG_MAX, &ulNotifiedValue, 0 );\r
+       xTaskNotifyAndQuery( xTaskToNotify, 0x00, eSetBits, &ulPreviousValue );\r
+       configASSERT( ulPreviousValue == 0 );\r
+\r
+       ulExpectedValue = 0;\r
+       for( ulLoop = 0x01; ulLoop < 0x80UL; ulLoop <<= 1UL )\r
+       {\r
+               /* Set the next bit up, and expect to receive the last bits set (so\r
+               the previous value will not yet have the bit being set this time\r
+               around). */\r
+               xTaskNotifyAndQuery( xTaskToNotify, ulLoop, eSetBits, &ulPreviousValue );\r
+               configASSERT( ulExpectedValue == ulPreviousValue );\r
+               ulExpectedValue |= ulLoop;\r
+       }\r
+\r
        /* Incremented to show the task is still running. */\r
        ulNotifyCycleCount++;\r
 \r
        /* Incremented to show the task is still running. */\r
        ulNotifyCycleCount++;\r
 \r
@@ -489,7 +488,7 @@ const BaseType_t xCallInterval = pdMS_TO_TICKS( 50 );
                        /* It is time to 'give' the notification again. */\r
                        xCallCount = 0;\r
 \r
                        /* It is time to 'give' the notification again. */\r
                        xCallCount = 0;\r
 \r
-                       xTaskNotifyGiveFromISR( xTaskToNotify, NULL );\r
+                       vTaskNotifyGiveFromISR( xTaskToNotify, NULL );\r
                        ulTimerNotificationsSent++;\r
                }\r
        }\r
                        ulTimerNotificationsSent++;\r
                }\r
        }\r
@@ -516,7 +515,7 @@ const uint32_t ulMaxSendReceiveDeviation = 5UL;
 \r
        /* Check the count of 'takes' from the software timer is keeping track with\r
        the amount of 'gives'. */\r
 \r
        /* Check the count of 'takes' from the software timer is keeping track with\r
        the amount of 'gives'. */\r
-       if( ulTimerNotificationsSent > ulTimerNotificationsSent )\r
+       if( ulTimerNotificationsSent > ulTimerNotificationsReceived )\r
        {\r
                if( ( ulTimerNotificationsSent - ulTimerNotificationsReceived ) > ulMaxSendReceiveDeviation )\r
                {\r
        {\r
                if( ( ulTimerNotificationsSent - ulTimerNotificationsReceived ) > ulMaxSendReceiveDeviation )\r
                {\r