]> git.sur5r.net Git - freertos/commitdiff
Prepare for V4.7.1 release.
authorRichardBarry <RichardBarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Tue, 22 Jan 2008 18:43:03 +0000 (18:43 +0000)
committerRichardBarry <RichardBarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Tue, 22 Jan 2008 18:43:03 +0000 (18:43 +0000)
git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@130 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

14 files changed:
Source/include/FreeRTOS.h
Source/include/queue.h
Source/include/semphr.h
Source/portable/IAR/ARM_CM3/port.c
Source/portable/IAR/ARM_CM3/portasm.s
Source/portable/IAR/AtmelSAM7S64/port.c
Source/portable/IAR/AtmelSAM7S64/portmacro.h
Source/portable/IAR/LPC2000/port.c
Source/portable/IAR/LPC2000/portmacro.h
Source/portable/IAR/STR71x/portmacro.h
Source/portable/IAR/STR75x/portmacro.h
Source/portable/IAR/STR91x/portmacro.h
Source/queue.c
Source/tasks.c

index 61061b467fe0c10e43bf17b19b6221d108f041dc..0799d522fa98e37093550aa7e97aa65539ab22c7 100644 (file)
        #error Missing definition:  configUSE_16_BIT_TICKS should be defined in FreeRTOSConfig.h as either 1 or 0.  See the Configuration section of the FreeRTOS API documentation for details.\r
 #endif\r
 \r
+#ifndef configUSE_RECURSIVE_MUTEXES\r
+       #define configUSE_RECURSIVE_MUTEXES 0\r
+#endif\r
+\r
 #ifndef configUSE_MUTEXES\r
        #define configUSE_MUTEXES 0\r
 #endif\r
index bafb5661961a88576aa43d8cf25ad361d157f2b0..9b1867e8e309f6a24f22032311e3d5cdab97af1d 100644 (file)
@@ -1201,6 +1201,13 @@ signed portBASE_TYPE xQueueCRReceive( xQueueHandle pxQueue, void *pvBuffer, port
 xQueueHandle xQueueCreateMutex( void );\r
 xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount );\r
 \r
+/*\r
+ * For internal use only.  Use xSemaphoreTakeMutexRecursive() or\r
+ * xSemaphoreGiveMutexRecursive() instead of calling these functions directly.\r
+ */\r
+portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime );\r
+portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle xMutex );\r
+\r
 #ifdef __cplusplus\r
 }\r
 #endif\r
index 02933313061afa16ad1fa9624f40e6b3238becd5..b5c61e04c2dc1f8eecefa13802a190341c573b71 100644 (file)
@@ -304,17 +304,19 @@ typedef xQueueHandle xSemaphoreHandle;
  void vTimerISR( void * pvParameters )\r
  {\r
  static unsigned portCHAR ucLocalTickCount = 0;\r
+ static portBASE_TYPE xTaskWoken;\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
     ucLocalTickCount++;\r
     if( ucLocalTickCount >= TICKS_TO_WAIT )\r
     {\r
         // Unblock the task by releasing the semaphore.\r
-        xSemaphoreGive( xSemaphore );\r
+        xSemaphoreGiveFromISR( xSemaphore, xTaskWoken );\r
 \r
         // Reset the count so we release the semaphore again in 10 ticks time.\r
         ucLocalTickCount = 0;\r
@@ -368,10 +370,11 @@ typedef xQueueHandle xSemaphoreHandle;
  * \ingroup Semaphores\r
  */\r
 #define xSemaphoreCreateMutex() xQueueCreateMutex()\r
+#define xSemaphoreCreateRecursiveMutex() xQueueCreateMutex()\r
 \r
 /**\r
  * semphr. h\r
- * <pre>xSemaphoreHandle xSemaphoreCreateCounting( uxCountValue, uxInitialCount )</pre>\r
+ * <pre>xSemaphoreHandle xSemaphoreCreateCounting( unsigned portBASE_TYPE uxMaxCount, unsigned portBASE_TYPE uxInitialCount )</pre>\r
  *\r
  * <i>Macro</i> that creates a counting semaphore by using the existing \r
  * queue mechanism.  \r
@@ -430,7 +433,10 @@ typedef xQueueHandle xSemaphoreHandle;
  * \defgroup xSemaphoreCreateCounting xSemaphoreCreateCounting\r
  * \ingroup Semaphores\r
  */\r
-#define xSemaphoreCreateCounting( uxCountValue, uxInitialCount ) xQueueCreateCountingSemaphore( uxCountValue, uxInitialCount )\r
+#define xSemaphoreCreateCounting( uxMaxCount, uxInitialCount ) xQueueCreateCountingSemaphore( uxMaxCount, uxInitialCount )\r
+\r
+#define xSemaphoreTakeRecursive( xMutex, xBlockTime )  xQueueTakeMutexRecursive( xMutex, xBlockTime )\r
+#define xSemaphoreGiveRecursive( xMutex )                              xQueueGiveMutexRecursive( xMutex )\r
 \r
 #endif /* SEMAPHORE_H */\r
 \r
index f580a63027850e3a62ae7928a37fd0d0de5acc5f..f4039f1454c1dc655ca21335d787be8177687f7f 100644 (file)
@@ -69,7 +69,7 @@
 defined.  The value 255 should also ensure backward compatibility.\r
 FreeRTOS.org versions prior to V4.3.0 did not include this definition. */\r
 #ifndef configKERNEL_INTERRUPT_PRIORITY\r
-       #define configKERNEL_INTERRUPT_PRIORITY 255\r
+       #define configKERNEL_INTERRUPT_PRIORITY 0\r
 #endif\r
 \r
 /* Each task maintains its own interrupt status in the critical nesting\r
index f6231d93f6e01d7301b5f342cf8836027a7f0592..c4280c0a66353605b825abb89d415d3845bf928e 100644 (file)
@@ -51,7 +51,8 @@ FreeRTOS.org versions prior to V4.3.0 did not include this definition. */
 #endif\r
 \r
        \r
-       RSEG ICODE:CODE\r
+       RSEG    CODE:CODE(2)\r
+       thumb\r
 \r
        EXTERN vPortYieldFromISR\r
        EXTERN vPortSwitchContext\r
index de31f23ccbb7af45e94062920c108228952c6172..4be1b6160418695e48c3779778455c2af3a52c39 100644 (file)
@@ -41,7 +41,6 @@
 \r
 /* Standard includes. */\r
 #include <stdlib.h>\r
-#include <intrinsic.h>\r
 \r
 /* Scheduler includes. */\r
 #include "FreeRTOS.h"\r
index 10372f01e7690c0e8e18e8ad63d733d04f210bae..8147233c02c0d9b7de478737cf50bbcbaca5226f 100644 (file)
@@ -38,8 +38,6 @@
 #ifndef PORTMACRO_H\r
 #define PORTMACRO_H\r
 \r
-#include <intrinsic.h>\r
-\r
 #ifdef __cplusplus\r
 extern "C" {\r
 #endif\r
index 69036f56c85dd714a404a232eebb19ce6894f1f1..b3ea9ae1aa7a8c231f9ee56a1bb5fb859ec44349 100644 (file)
 /*\r
        Changes from V3.2.2\r
 \r
-       + Bug fix - The prescale value for the timer setup is now written to T0PR \r
-         instead of T0PC.  This bug would have had no effect unless a prescale \r
+       + Bug fix - The prescale value for the timer setup is now written to T0PR\r
+         instead of T0PC.  This bug would have had no effect unless a prescale\r
          value was actually used.\r
 */\r
 \r
 /* Standard includes. */\r
 #include <stdlib.h>\r
-#include <intrinsic.h>\r
+#include <intrinsics.h>\r
 \r
 /* Scheduler includes. */\r
 #include "FreeRTOS.h"\r
index 10372f01e7690c0e8e18e8ad63d733d04f210bae..2776ede705834dcb16e946e29a296901b281486e 100644 (file)
@@ -38,7 +38,7 @@
 #ifndef PORTMACRO_H\r
 #define PORTMACRO_H\r
 \r
-#include <intrinsic.h>\r
+#include <intrinsics.h>\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
index 2e48bec58353fb80538f7e4314e6691c1ce98b3c..73b6b028beb32cba8674f8aaf865a1957b20b81e 100644 (file)
@@ -48,7 +48,7 @@
  *-----------------------------------------------------------\r
  */\r
 \r
-#include <intrinsic.h>\r
+#include <intrinsics.h>\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
index 8b0827d12cd0c11c6b71e832e435713505b41a85..e78ac0d82676628820dc580f542b92dd10236da8 100644 (file)
@@ -48,7 +48,7 @@
  *-----------------------------------------------------------\r
  */\r
 \r
-#include <intrinsic.h>\r
+#include <intrinsics.h>\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
index 95ac0873ecaed2965ab10384433b52030463876a..f2c1392252bd594d2271bd2d8597250a71905a0f 100644 (file)
@@ -48,7 +48,7 @@
  *-----------------------------------------------------------\r
  */\r
 \r
-#include <intrinsic.h>\r
+#include <intrinsics.h>\r
 \r
 #ifdef __cplusplus\r
 extern "C" {\r
index 67e24e9c31d3ad25044240a91ca5eb9531017172..782408f271b37f94f02feed610b3664f363f68ab 100644 (file)
 /* Effectively make a union out of the xQUEUE structure. */\r
 #define pxMutexHolder                          pcTail\r
 #define uxQueueType                                    pcHead\r
+#define uxRecursiveCallCount           pcReadFrom\r
 #define queueQUEUE_IS_MUTEX                    NULL\r
 \r
 /* Semaphores do not actually store or copy data, so have an items size of\r
 zero. */\r
 #define queueSEMAPHORE_QUEUE_ITEM_LENGTH ( 0 )\r
 #define queueDONT_BLOCK                                         ( ( portTickType ) 0 )\r
-\r
+#define queueMUTEX_GIVE_BLOCK_TIME              ( ( portTickType ) 0 )\r
 /*\r
  * Definition of the queue used by the scheduler.\r
  * Items are queued by copy, not reference.\r
@@ -107,6 +108,8 @@ signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, const void * co
 signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, const void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken );\r
 xQueueHandle xQueueCreateMutex( void );\r
 xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount );\r
+portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime );\r
+portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle xMutex );\r
 signed portBASE_TYPE xQueueAltGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition );\r
 signed portBASE_TYPE xQueueAltGenericReceive( xQueueHandle pxQueue, const void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking );\r
 \r
@@ -261,9 +264,84 @@ size_t xQueueSizeInBytes;
 #endif /* configUSE_MUTEXES */\r
 /*-----------------------------------------------------------*/\r
 \r
+#if configUSE_RECURSIVE_MUTEXES == 1\r
+\r
+       portBASE_TYPE xQueueGiveMutexRecursive( xQueueHandle pxMutex )\r
+       {\r
+       portBASE_TYPE xReturn;\r
+\r
+               /* If this is the task that holds the mutex then pxMutexHolder will not \r
+               change outside of this task.  If this task does not hold the mutex then\r
+               pxMutexHolder can never coincidentally equal the tasks handle, and as\r
+               this is the only condition we are interested in it does not matter if\r
+               pxMutexHolder is accessed simultaneously by another task.  Therefore no\r
+               mutual exclusion is required to test the pxMutexHolder variable. */\r
+               if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() )\r
+               {\r
+                       /* uxRecursiveCallCount cannot be zero if pxMutexHolder is equal to\r
+                       the task handle, therefore no underflow check is required.  Also, \r
+                       uxRecursiveCallCount is only modified by the mutex holder, and as\r
+                       there can only be one, no mutual exclusion is required to modify the\r
+                       uxRecursiveCallCount member. */\r
+                       ( pxMutex->uxRecursiveCallCount )--;\r
+\r
+                       /* Have we unwound the call count? */\r
+                       if( pxMutex->uxRecursiveCallCount == 0 )\r
+                       {\r
+                               /* Return the mutex.  This will automatically unblock any other\r
+                               task that might be waiting to access the mutex. */\r
+                xQueueGenericSend( pxMutex, NULL, queueMUTEX_GIVE_BLOCK_TIME, queueSEND_TO_BACK );\r
+                       }\r
+\r
+                       xReturn = pdPASS;\r
+               }\r
+               else\r
+               {\r
+                       /* We cannot give the mutex because we are not the holder. */\r
+                       xReturn = pdFAIL;\r
+               }\r
+\r
+               return xReturn;\r
+       }\r
+\r
+#endif /* configUSE_RECURSIVE_MUTEXES */\r
+/*-----------------------------------------------------------*/\r
+\r
+#if configUSE_RECURSIVE_MUTEXES == 1\r
+\r
+       portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle pxMutex, portTickType xBlockTime )\r
+       {\r
+       portBASE_TYPE xReturn;\r
+\r
+               /* Comments regarding mutual exclusion as per those within \r
+               xQueueGiveMutexRecursive(). */\r
+\r
+               if( pxMutex->pxMutexHolder == xTaskGetCurrentTaskHandle() )\r
+               {\r
+                       ( pxMutex->uxRecursiveCallCount )++;\r
+                       xReturn = pdPASS;\r
+               }\r
+               else\r
+               {\r
+            xReturn = xQueueGenericReceive( pxMutex, NULL, xBlockTime, pdFALSE );\r
+\r
+                       /* pdPASS will only be returned if we successfully obtained the mutex,\r
+                       we may have blocked to reach here. */\r
+                       if( xReturn == pdPASS )\r
+                       {\r
+                               ( pxMutex->uxRecursiveCallCount )++;\r
+                       }\r
+               }\r
+\r
+               return xReturn;\r
+       }\r
+\r
+#endif /* configUSE_RECURSIVE_MUTEXES */\r
+/*-----------------------------------------------------------*/\r
+\r
 #if configUSE_COUNTING_SEMAPHORES == 1\r
 \r
-       xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount )\r
+       xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount, portBASE_TYPE xIsRecursive )\r
        {\r
        xQueueHandle pxHandle;\r
        \r
@@ -902,6 +980,7 @@ static void prvCopyDataToQueue( xQUEUE *pxQueue, const void *pvItemToQueue, port
                        {\r
                                /* The mutex is no longer being held. */\r
                                vTaskPriorityDisinherit( ( void * const ) pxQueue->pxMutexHolder );\r
+                pxQueue->pxMutexHolder = NULL;\r
                        }\r
                }\r
                #endif\r
index a605b99f2a380651a0a2c766ca17a2a39bd5f7a5..3a4c8ce7ab6591ed8560d77a0639258e8e716729 100644 (file)
@@ -1213,7 +1213,11 @@ signed portBASE_TYPE xAlreadyYielded = pdFALSE;
                                        /* As we have processed some ticks it is appropriate to yield\r
                                        to ensure the highest priority task that is ready to run is\r
                                        the task actually running. */\r
-                                       xYieldRequired = pdTRUE;\r
+                                       #if configUSE_PREEMPTION == 1\r
+                                       {\r
+                                               xYieldRequired = pdTRUE;\r
+                                       }\r
+                                       #endif\r
                                }\r
                                \r
                                if( ( xYieldRequired == pdTRUE ) || ( xMissedYield == pdTRUE ) )\r
@@ -1985,7 +1989,7 @@ tskTCB *pxNewTCB;
                        /* Adjust the mutex holder state to account for its new priority. */\r
                        listSET_LIST_ITEM_VALUE( &( pxTCB->xEventListItem ), configMAX_PRIORITIES - ( portTickType ) pxCurrentTCB->uxPriority );\r
 \r
-                       /* If the task being modified is in the read state it will need to\r
+                       /* If the task being modified is in the ready state it will need to\r
                        be moved in to a new list. */\r
                        if( listIS_CONTAINED_WITHIN( &( pxReadyTasksLists[ pxTCB->uxPriority ] ), &( pxTCB->xGenericListItem ) ) )\r
                        {\r