]> git.sur5r.net Git - freertos/commitdiff
Add in a couple of extra list macros for use with FreeRTOS+UDP.
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Tue, 3 Jul 2012 11:16:52 +0000 (11:16 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Tue, 3 Jul 2012 11:16:52 +0000 (11:16 +0000)
Allow the ISR safe queue send and receive functions to set the higher priority task woken pointer to NULL.

git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1753 1d2547de-c912-0410-9cb9-b8ca96c0e9e2

Source/include/list.h
Source/include/queue.h
Source/queue.c

index 8a9f2bf19d9537be7821063fb5d0687dd06437ee..c36de573735cb3a923c6c2ff4ebd1d699121c4d4 100644 (file)
@@ -139,6 +139,15 @@ typedef struct xLIST
  */\r
 #define listSET_LIST_ITEM_OWNER( pxListItem, pxOwner )         ( pxListItem )->pvOwner = ( void * ) ( pxOwner )\r
 \r
+/*\r
+ * Access macro to get the owner of a list item.  The owner of a list item\r
+ * is the object (usually a TCB) that contains the list item.\r
+ *\r
+ * \page listSET_LIST_ITEM_OWNER listSET_LIST_ITEM_OWNER\r
+ * \ingroup LinkedList\r
+ */\r
+#define listGET_LIST_ITEM_OWNER( pxListItem )          ( pxListItem )->pvOwner\r
+\r
 /*\r
  * Access macro to set the value of the list item.  In most cases the value is\r
  * used to sort the list in descending order.\r
@@ -149,7 +158,7 @@ typedef struct xLIST
 #define listSET_LIST_ITEM_VALUE( pxListItem, xValue )          ( pxListItem )->xItemValue = ( xValue )\r
 \r
 /*\r
- * Access macro the retrieve the value of the list item.  The value can\r
+ * Access macro to retrieve the value of the list item.  The value can\r
  * represent anything - for example a the priority of a task, or the time at\r
  * which a task should be unblocked.\r
  *\r
@@ -244,6 +253,13 @@ xList * const pxConstList = ( pxList );                                                                                                    \
  */\r
 #define listIS_CONTAINED_WITHIN( pxList, pxListItem ) ( ( pxListItem )->pvContainer == ( void * ) ( pxList ) )\r
 \r
+/*\r
+ * This provides a crude means of knowing if a list has been initialised, as\r
+ * pxList->xListEnd.xItemValue is set to portMAX_DELAY by the vListInitialise()\r
+ * function.\r
+ */\r
+#define listLIST_IS_INITIALISED( pxList ) ( ( pxList )->xListEnd.xItemValue == portMAX_DELAY )\r
+\r
 /*\r
  * Must be called before a list is used!  This initialises all the members\r
  * of the list structure and inserts the xListEnd item into the list as a\r
index 6225196ff7062e228465ed12ee9a11f7e483bce8..4574895f3e4a70cae6b11125ace6e8b6c1d1ac9a 100644 (file)
@@ -1187,10 +1187,10 @@ signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void
  * \defgroup xQueueReceiveFromISR xQueueReceiveFromISR\r
  * \ingroup QueueManagement\r
  */\r
-signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken );\r
+signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken );\r
 \r
 /*\r
- * Utilities to query queue that are safe to use from an ISR.  These utilities\r
+ * Utilities to query queues that are safe to use from an ISR.  These utilities\r
  * should be used only from witin an ISR, or within a critical section.\r
  */\r
 signed portBASE_TYPE xQueueIsQueueEmptyFromISR( const xQueueHandle pxQueue );\r
index 5faea1d2d3b1c30f54e1c5531993ea051ccdbfac..a546dcc088da56078d1762693251ba1279bd0291 100644 (file)
@@ -157,12 +157,12 @@ typedef xQUEUE * xQueueHandle;
  * functions are documented in the API header file.\r
  */\r
 xQueueHandle xQueueGenericCreate( unsigned portBASE_TYPE uxQueueLength, unsigned portBASE_TYPE uxItemSize, unsigned char ucQueueType ) PRIVILEGED_FUNCTION;\r
-signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION;\r
+signed portBASE_TYPE xQueueGenericSend( xQueueHandle pxQueue, const void * const pvItemToQueue, portTickType xTicksToWait, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION;\r
 unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle pxQueue ) PRIVILEGED_FUNCTION;\r
 void vQueueDelete( xQueueHandle xQueue ) PRIVILEGED_FUNCTION;\r
 signed portBASE_TYPE xQueueGenericSendFromISR( xQueueHandle pxQueue, const void * const pvItemToQueue, signed portBASE_TYPE *pxHigherPriorityTaskWoken, portBASE_TYPE xCopyPosition ) PRIVILEGED_FUNCTION;\r
 signed portBASE_TYPE xQueueGenericReceive( xQueueHandle pxQueue, void * const pvBuffer, portTickType xTicksToWait, portBASE_TYPE xJustPeeking ) PRIVILEGED_FUNCTION;\r
-signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken ) PRIVILEGED_FUNCTION;\r
+signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken ) PRIVILEGED_FUNCTION;\r
 xQueueHandle xQueueCreateMutex( unsigned char ucQueueType ) PRIVILEGED_FUNCTION;\r
 xQueueHandle xQueueCreateCountingSemaphore( unsigned portBASE_TYPE uxCountValue, unsigned portBASE_TYPE uxInitialCount ) PRIVILEGED_FUNCTION;\r
 portBASE_TYPE xQueueTakeMutexRecursive( xQueueHandle xMutex, portTickType xBlockTime ) PRIVILEGED_FUNCTION;\r
@@ -905,7 +905,6 @@ signed portBASE_TYPE xReturn;
 unsigned portBASE_TYPE uxSavedInterruptStatus;\r
 \r
        configASSERT( pxQueue );\r
-       configASSERT( pxHigherPriorityTaskWoken );\r
        configASSERT( !( ( pvItemToQueue == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) );\r
 \r
        /* Similar to xQueueGenericSend, except we don't block if there is no room\r
@@ -931,7 +930,10 @@ unsigned portBASE_TYPE uxSavedInterruptStatus;
                                        {\r
                                                /* The task waiting has a higher priority so record that a\r
                                                context switch is required. */\r
-                                               *pxHigherPriorityTaskWoken = pdTRUE;\r
+                                               if( pxHigherPriorityTaskWoken != NULL )\r
+                                               {\r
+                                                       *pxHigherPriorityTaskWoken = pdTRUE;\r
+                                               }\r
                                        }\r
                                }\r
                        }\r
@@ -1105,13 +1107,12 @@ signed char *pcOriginalReadPosition;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
-signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxTaskWoken )\r
+signed portBASE_TYPE xQueueReceiveFromISR( xQueueHandle pxQueue, void * const pvBuffer, signed portBASE_TYPE *pxHigherPriorityTaskWoken )\r
 {\r
 signed portBASE_TYPE xReturn;\r
 unsigned portBASE_TYPE uxSavedInterruptStatus;\r
 \r
        configASSERT( pxQueue );\r
-       configASSERT( pxTaskWoken );\r
        configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) );\r
 \r
        uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();\r
@@ -1135,7 +1136,10 @@ unsigned portBASE_TYPE uxSavedInterruptStatus;
                                        {\r
                                                /* The task waiting has a higher priority than us so\r
                                                force a context switch. */\r
-                                               *pxTaskWoken = pdTRUE;\r
+                                               if( pxHigherPriorityTaskWoken != NULL )\r
+                                               {\r
+                                                       *pxHigherPriorityTaskWoken = pdTRUE;\r
+                                               }\r
                                        }\r
                                }\r
                        }\r