]> git.sur5r.net Git - freertos/blobdiff - Source/include/semphr.h
Remove unnecessary ';' characters from a couple of macro definitions in the IAR MSP43...
[freertos] / Source / include / semphr.h
index b4a7ae458a987f40e0d66e8276918bbb6fae896f..842ee5dd5d3ba20ff935882f1908f92edadb34fe 100644 (file)
@@ -1,39 +1,60 @@
 /*\r
-       FreeRTOS.org V4.7.0 - Copyright (C) 2003-2007 Richard Barry.\r
-\r
-       This file is part of the FreeRTOS.org distribution.\r
-\r
-       FreeRTOS.org is free software; you can redistribute it and/or modify\r
-       it under the terms of the GNU General Public License as published by\r
-       the Free Software Foundation; either version 2 of the License, or\r
-       (at your option) any later version.\r
-\r
-       FreeRTOS.org is distributed in the hope that it will be useful,\r
-       but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-       MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\r
-       GNU General Public License for more details.\r
-\r
-       You should have received a copy of the GNU General Public License\r
-       along with FreeRTOS.org; if not, write to the Free Software\r
-       Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\r
-\r
-       A special exception to the GPL can be applied should you wish to distribute\r
-       a combined work that includes FreeRTOS.org, without being obliged to provide\r
-       the source code for any proprietary components.  See the licensing section \r
-       of http://www.FreeRTOS.org for full details of how and when the exception\r
-       can be applied.\r
-\r
-       ***************************************************************************\r
-       See http://www.FreeRTOS.org for documentation, latest information, license \r
-       and contact details.  Please ensure to read the configuration and relevant \r
-       port sections of the online documentation.\r
-\r
-       Also see http://www.SafeRTOS.com a version that has been certified for use\r
-       in safety critical systems, plus commercial licensing, development and\r
-       support options.\r
-       ***************************************************************************\r
+    FreeRTOS V6.1.0 - Copyright (C) 2010 Real Time Engineers Ltd.\r
+\r
+    ***************************************************************************\r
+    *                                                                         *\r
+    * If you are:                                                             *\r
+    *                                                                         *\r
+    *    + New to FreeRTOS,                                                   *\r
+    *    + Wanting to learn FreeRTOS or multitasking in general quickly       *\r
+    *    + Looking for basic training,                                        *\r
+    *    + Wanting to improve your FreeRTOS skills and productivity           *\r
+    *                                                                         *\r
+    * then take a look at the FreeRTOS books - available as PDF or paperback  *\r
+    *                                                                         *\r
+    *        "Using the FreeRTOS Real Time Kernel - a Practical Guide"        *\r
+    *                  http://www.FreeRTOS.org/Documentation                  *\r
+    *                                                                         *\r
+    * A pdf reference manual is also available.  Both are usually delivered   *\r
+    * to your inbox within 20 minutes to two hours when purchased between 8am *\r
+    * and 8pm GMT (although please allow up to 24 hours in case of            *\r
+    * exceptional circumstances).  Thank you for your support!                *\r
+    *                                                                         *\r
+    ***************************************************************************\r
+\r
+    This file is part of the FreeRTOS distribution.\r
+\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
+    ***NOTE*** The exception to the GPL is included to allow you to distribute\r
+    a combined work that includes FreeRTOS without being obliged to provide the\r
+    source code for proprietary components outside of the FreeRTOS kernel.\r
+    FreeRTOS is distributed in the hope that it will be useful, but WITHOUT\r
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or\r
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for\r
+    more details. You should have received a copy of the GNU General Public \r
+    License and the FreeRTOS license exception along with FreeRTOS; if not it \r
+    can be viewed here: http://www.freertos.org/a00114.html and also obtained \r
+    by writing to Richard Barry, contact details for whom are available on the\r
+    FreeRTOS WEB site.\r
+\r
+    1 tab == 4 spaces!\r
+\r
+    http://www.FreeRTOS.org - Documentation, latest information, license and\r
+    contact details.\r
+\r
+    http://www.SafeRTOS.com - A version that is certified for use in safety\r
+    critical systems.\r
+\r
+    http://www.OpenRTOS.com - Commercial support, development, porting,\r
+    licensing and training services.\r
 */\r
 \r
+#ifndef INC_FREERTOS_H\r
+       #error "#include FreeRTOS.h" must appear in source files before "#include semphr.h"\r
+#endif\r
+\r
 #ifndef SEMAPHORE_H\r
 #define SEMAPHORE_H\r
 \r
@@ -41,8 +62,8 @@
 \r
 typedef xQueueHandle xSemaphoreHandle;\r
 \r
-#define semBINARY_SEMAPHORE_QUEUE_LENGTH       ( ( unsigned portCHAR ) 1 )\r
-#define semSEMAPHORE_QUEUE_ITEM_LENGTH         ( ( unsigned portCHAR ) 0 )\r
+#define semBINARY_SEMAPHORE_QUEUE_LENGTH       ( ( unsigned char ) 1 )\r
+#define semSEMAPHORE_QUEUE_ITEM_LENGTH         ( ( unsigned char ) 0 )\r
 #define semGIVE_BLOCK_TIME                                     ( ( portTickType ) 0 )\r
 \r
 \r
@@ -94,7 +115,7 @@ typedef xQueueHandle xSemaphoreHandle;
 \r
 /**\r
  * semphr. h\r
- * xSemaphoreTake( \r
+ * <pre>xSemaphoreTake( \r
  *                   xSemaphoreHandle xSemaphore, \r
  *                   portTickType xBlockTime \r
  *               )</pre>\r
@@ -183,7 +204,7 @@ typedef xQueueHandle xSemaphoreHandle;
  * exactly five times.\r
  *\r
  * @param xMutex A handle to the mutex being obtained.  This is the\r
- * handle returned by xSemaphoreCreateMutex();\r
+ * handle returned by xSemaphoreCreateRecursiveMutex();\r
  *\r
  * @param xBlockTime The time in ticks to wait for the semaphore to become\r
  * available.  The macro portTICK_RATE_MS can be used to convert this to a\r
@@ -225,17 +246,17 @@ typedef xQueueHandle xSemaphoreHandle;
                        // code these would not be just sequential calls as this would make\r
                        // no sense.  Instead the calls are likely to be buried inside\r
                        // a more complex call structure.\r
-            xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 );\r
-            xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 );\r
+            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );\r
+            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );\r
 \r
             // The mutex has now been 'taken' three times, so will not be \r
                        // available to another task until it has also been given back\r
                        // three times.  Again it is unlikely that real code would have\r
                        // these calls sequentially, but instead buried in a more complex\r
                        // call structure.  This is just for illustrative purposes.\r
-            xSemaphoreGiveRecursive( xSemaphore );\r
-                       xSemaphoreGiveRecursive( xSemaphore );\r
-                       xSemaphoreGiveRecursive( xSemaphore );\r
+            xSemaphoreGiveRecursive( xMutex );\r
+                       xSemaphoreGiveRecursive( xMutex );\r
+                       xSemaphoreGiveRecursive( xMutex );\r
 \r
                        // Now the mutex can be taken by other tasks.\r
         }\r
@@ -332,7 +353,7 @@ typedef xQueueHandle xSemaphoreHandle;
 \r
 /**\r
  * semphr. h\r
- * <pre>xSemaphoreGiveRecursive( xSemaphoreHandle xSemaphore )</pre>\r
+ * <pre>xSemaphoreGiveRecursive( xSemaphoreHandle xMutex )</pre>\r
  *\r
  * <i>Macro</i> to recursively release, or 'give', a mutex type semaphore.\r
  * The mutex must have previously been created using a call to \r
@@ -375,7 +396,7 @@ typedef xQueueHandle xSemaphoreHandle;
     {\r
         // See if we can obtain the mutex.  If the mutex is not available\r
         // wait 10 ticks to see if it becomes free.    \r
-        if( xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 ) == pdTRUE )\r
+        if( xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 ) == pdTRUE )\r
         {\r
             // We were able to obtain the mutex and can now access the\r
             // shared resource.\r
@@ -386,8 +407,8 @@ typedef xQueueHandle xSemaphoreHandle;
                        // code these would not be just sequential calls as this would make\r
                        // no sense.  Instead the calls are likely to be buried inside\r
                        // a more complex call structure.\r
-            xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 );\r
-            xSemaphoreTakeRecursive( xSemaphore, ( portTickType ) 10 );\r
+            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );\r
+            xSemaphoreTakeRecursive( xMutex, ( portTickType ) 10 );\r
 \r
             // The mutex has now been 'taken' three times, so will not be \r
                        // available to another task until it has also been given back\r
@@ -395,9 +416,9 @@ typedef xQueueHandle xSemaphoreHandle;
                        // these calls sequentially, it would be more likely that the calls\r
                        // to xSemaphoreGiveRecursive() would be called as a call stack\r
                        // unwound.  This is just for demonstrative purposes.\r
-            xSemaphoreGiveRecursive( xSemaphore );\r
-                       xSemaphoreGiveRecursive( xSemaphore );\r
-                       xSemaphoreGiveRecursive( xSemaphore );\r
+            xSemaphoreGiveRecursive( xMutex );\r
+                       xSemaphoreGiveRecursive( xMutex );\r
+                       xSemaphoreGiveRecursive( xMutex );\r
 \r
                        // Now the mutex can be taken by other tasks.\r
         }\r
@@ -433,7 +454,7 @@ typedef xQueueHandle xSemaphoreHandle;
  * <pre>\r
  xSemaphoreGiveFromISR( \r
                           xSemaphoreHandle xSemaphore, \r
-                          portSHORT sTaskPreviouslyWoken \r
+                          signed portBASE_TYPE *pxHigherPriorityTaskWoken\r
                       )</pre>\r
  *\r
  * <i>Macro</i> to  release a semaphore.  The semaphore must have previously been\r
@@ -447,20 +468,18 @@ typedef xQueueHandle xSemaphoreHandle;
  * @param xSemaphore A handle to the semaphore being released.  This is the\r
  * handle returned when the semaphore was created.\r
  *\r
- * @param sTaskPreviouslyWoken This is included so an ISR can make multiple calls\r
- * to xSemaphoreGiveFromISR () from a single interrupt.  The first call\r
- * should always pass in pdFALSE.  Subsequent calls should pass in\r
- * the value returned from the previous call.  See the file serial .c in the\r
- * PC port for a good example of using xSemaphoreGiveFromISR ().\r
+ * @param pxHigherPriorityTaskWoken xSemaphoreGiveFromISR() will set\r
+ * *pxHigherPriorityTaskWoken to pdTRUE if giving the semaphore caused a task\r
+ * to unblock, and the unblocked task has a priority higher than the currently\r
+ * running task.  If xSemaphoreGiveFromISR() sets this value to pdTRUE then\r
+ * a context switch should be requested before the interrupt is exited.\r
  *\r
- * @return pdTRUE if a task was woken by releasing the semaphore.  This is \r
- * used by the ISR to determine if a context switch may be required following\r
- * the ISR.\r
+ * @return pdTRUE if the semaphore was successfully given, otherwise errQUEUE_FULL.\r
  *\r
  * Example usage:\r
  <pre>\r
- #define LONG_TIME 0xffff\r
#define TICKS_TO_WAIT 10\r
\#define LONG_TIME 0xffff\r
\#define TICKS_TO_WAIT        10\r
  xSemaphoreHandle xSemaphore = NULL;\r
 \r
  // Repetitive task.\r
@@ -489,26 +508,26 @@ typedef xQueueHandle xSemaphoreHandle;
  // Timer ISR\r
  void vTimerISR( void * pvParameters )\r
  {\r
- static unsigned portCHAR ucLocalTickCount = 0;\r
- static portBASE_TYPE xTaskWoken;\r
+ static unsigned char ucLocalTickCount = 0;\r
+ static signed portBASE_TYPE xHigherPriorityTaskWoken;\r
 \r
     // A timer tick has occurred.\r
 \r
     // ... Do other time functions.\r
 \r
     // Is it time for vATask () to run?\r
-       xTaskWoken = pdFALSE;\r
+       xHigherPriorityTaskWoken = pdFALSE;\r
     ucLocalTickCount++;\r
     if( ucLocalTickCount >= TICKS_TO_WAIT )\r
     {\r
         // Unblock the task by releasing the semaphore.\r
-        xTaskWoken = xSemaphoreGiveFromISR( xSemaphore, xTaskWoken );\r
+        xSemaphoreGiveFromISR( xSemaphore, &xHigherPriorityTaskWoken );\r
 \r
         // Reset the count so we release the semaphore again in 10 ticks time.\r
         ucLocalTickCount = 0;\r
     }\r
 \r
-    if( xTaskWoken != pdFALSE )\r
+    if( xHigherPriorityTaskWoken != pdFALSE )\r
     {\r
         // We can force a context switch here.  Context switching from an\r
         // ISR uses port specific syntax.  Check the demo task for your port\r
@@ -519,7 +538,7 @@ typedef xQueueHandle xSemaphoreHandle;
  * \defgroup xSemaphoreGiveFromISR xSemaphoreGiveFromISR\r
  * \ingroup Semaphores\r
  */\r
-#define xSemaphoreGiveFromISR( xSemaphore, xTaskPreviouslyWoken )                      xQueueGenericSendFromISR( ( xQueueHandle ) xSemaphore, NULL, xTaskPreviouslyWoken, queueSEND_TO_BACK )\r
+#define xSemaphoreGiveFromISR( xSemaphore, pxHigherPriorityTaskWoken )                 xQueueGenericSendFromISR( ( xQueueHandle ) xSemaphore, NULL, pxHigherPriorityTaskWoken, queueSEND_TO_BACK )\r
 \r
 /**\r
  * semphr. h\r
@@ -538,7 +557,7 @@ typedef xQueueHandle xSemaphoreHandle;
  *\r
  * Mutex type semaphores cannot be used from within interrupt service routines.  \r
  *\r
- * See xSemaphoreCreateBinary() for an alternative implementation that can be \r
+ * See vSemaphoreCreateBinary() for an alternative implementation that can be \r
  * used for pure synchronisation (where one task or interrupt always 'gives' the \r
  * semaphore and another always 'takes' the semaphore) and from within interrupt \r
  * service routines.\r
@@ -593,7 +612,7 @@ typedef xQueueHandle xSemaphoreHandle;
  *\r
  * Mutex type semaphores cannot be used from within interrupt service routines.  \r
  *\r
- * See xSemaphoreCreateBinary() for an alternative implementation that can be \r
+ * See vSemaphoreCreateBinary() for an alternative implementation that can be \r
  * used for pure synchronisation (where one task or interrupt always 'gives' the \r
  * semaphore and another always 'takes' the semaphore) and from within interrupt \r
  * service routines.\r