]> git.sur5r.net Git - freertos/commitdiff
Update QueueOverwrite.c to include a call to xQueuePeekFromISR().
authorrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 28 Jun 2013 09:21:39 +0000 (09:21 +0000)
committerrichardbarry <richardbarry@1d2547de-c912-0410-9cb9-b8ca96c0e9e2>
Fri, 28 Jun 2013 09:21:39 +0000 (09:21 +0000)
Default new QueuePeekFromISR() trace macros.

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

FreeRTOS/Demo/Common/Minimal/QueueOverwrite.c
FreeRTOS/Source/include/FreeRTOS.h
FreeRTOS/Source/include/queue.h
FreeRTOS/Source/queue.c

index e33dcdbff04bca9266eae0b8bc078f83480e4690..b20f903a97fb4d4eeab6b8764a2b9d5e1fa78c7c 100644 (file)
@@ -233,12 +233,19 @@ unsigned long ulRx;
                        last parameter is not used because there are no tasks blocked on\r
                        this queue. */\r
                        xQueueOverwriteFromISR( xISRQueue, &ulTx1, NULL );\r
+\r
+                       /* Peek the queue to check it holds the expected value. */\r
+                       xQueuePeekFromISR( xISRQueue, &ulRx );\r
+                       if( ulRx != ulTx1 )\r
+                       {\r
+                               xISRTestStatus = pdFAIL;\r
+                       }\r
                        break;\r
 \r
                case 1:\r
                        /* The queue already holds ulTx1.  Overwrite the value in the queue\r
                        with ulTx2. */\r
-                       xQueueOverwriteFromISR( xISRQueue, &ulTx2, NULL );\r
+                       xQueueOverwriteFromISR( xISRQueue, &ulTx2, NULL );                      \r
                        break;\r
 \r
                case 2:\r
index 060523fee1594a7cef2f038a106c7b78002969ba..fbd75e3d008269787c75d838526997b2234ae971 100644 (file)
@@ -410,6 +410,10 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
        #define traceQUEUE_PEEK( pxQueue )\r
 #endif\r
 \r
+#ifndef traceQUEUE_PEEK_FROM_ISR\r
+       #define traceQUEUE_PEEK_FROM_ISR( pxQueue )\r
+#endif\r
+\r
 #ifndef traceQUEUE_RECEIVE_FAILED\r
        #define traceQUEUE_RECEIVE_FAILED( pxQueue )\r
 #endif\r
@@ -430,6 +434,10 @@ typedef portBASE_TYPE (*pdTASK_HOOK_CODE)( void * );
        #define traceQUEUE_RECEIVE_FROM_ISR_FAILED( pxQueue )\r
 #endif\r
 \r
+#ifndef traceQUEUE_PEEK_FROM_ISR_FAILED\r
+       #define traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue )\r
+#endif\r
+\r
 #ifndef traceQUEUE_DELETE\r
        #define traceQUEUE_DELETE( pxQueue )\r
 #endif\r
index 915e2ab9988b7af6c6b400078b649f494e4b0708..315b67e25f91cfe6e7f15d9ee0b4597440878340 100644 (file)
@@ -616,7 +616,9 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const
  * Successfully received items remain on the queue so will be returned again\r
  * by the next call, or a call to xQueueReceive().\r
  *\r
- * This macro must not be used in an interrupt service routine.\r
+ * This macro must not be used in an interrupt service routine.  See\r
+ * xQueuePeekFromISR() for an alternative that can be called from an interrupt\r
+ * service routine.\r
  *\r
  * @param xQueue The handle to the queue from which the item is to be\r
  * received.\r
@@ -691,6 +693,39 @@ signed portBASE_TYPE xQueueGenericSend( xQueueHandle xQueue, const void * const
  */\r
 #define xQueuePeek( xQueue, pvBuffer, xTicksToWait ) xQueueGenericReceive( ( xQueue ), ( pvBuffer ), ( xTicksToWait ), pdTRUE )\r
 \r
+/**\r
+ * queue. h\r
+ * <pre>\r
+ portBASE_TYPE xQueuePeekFromISR(\r
+                                                                       xQueueHandle xQueue,\r
+                                                                       void *pvBuffer,\r
+                                                               );</pre>\r
+ *\r
+ * A version of xQueuePeek() that can be called from an interrupt service\r
+ * routine (ISR).\r
+ *\r
+ * Receive an item from a queue without removing the item from the queue.\r
+ * The item is received by copy so a buffer of adequate size must be\r
+ * provided.  The number of bytes copied into the buffer was defined when\r
+ * the queue was created.\r
+ *\r
+ * Successfully received items remain on the queue so will be returned again\r
+ * by the next call, or a call to xQueueReceive().\r
+ *\r
+ * @param xQueue The handle to the queue from which the item is to be\r
+ * received.\r
+ *\r
+ * @param pvBuffer Pointer to the buffer into which the received item will\r
+ * be copied.\r
+ *\r
+ * @return pdTRUE if an item was successfully received from the queue,\r
+ * otherwise pdFALSE.\r
+ *\r
+ * \defgroup xQueuePeekFromISR xQueuePeekFromISR\r
+ * \ingroup QueueManagement\r
+ */\r
+signed portBASE_TYPE xQueuePeekFromISR( xQueueHandle xQueue, void * const pvBuffer );\r
+\r
 /**\r
  * queue. h\r
  * <pre>\r
index 4488169ea8195b69ce58504d380c4c7a1b3c7fab..b9024d5354da203f0b1c4920fc1e882846f9f82f 100644 (file)
@@ -1060,7 +1060,7 @@ xQUEUE *pxQueue;
                                {\r
                                        traceQUEUE_RECEIVE( pxQueue );\r
 \r
-                                       /* We are actually removing data. */\r
+                                       /* Actually removing data, not just peeking. */\r
                                        --( pxQueue->uxMessagesWaiting );\r
 \r
                                        #if ( configUSE_MUTEXES == 1 )\r
@@ -1191,7 +1191,7 @@ xQUEUE *pxQueue;
 \r
        uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();\r
        {\r
-               /* We cannot block from an ISR, so check there is data available. */\r
+               /* Cannot block in an ISR, so check there is data available. */\r
                if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 )\r
                {\r
                        traceQUEUE_RECEIVE_FROM_ISR( pxQueue );\r
@@ -1199,9 +1199,10 @@ xQUEUE *pxQueue;
                        prvCopyDataFromQueue( pxQueue, pvBuffer );\r
                        --( pxQueue->uxMessagesWaiting );\r
 \r
-                       /* If the queue is locked we will not modify the event list.  Instead\r
-                       we update the lock count so the task that unlocks the queue will know\r
-                       that an ISR has removed data while the queue was locked. */\r
+                       /* If the queue is locked the event list will not be modified.  \r
+                       Instead update the lock count so the task that unlocks the queue \r
+                       will know that an ISR has removed data while the queue was \r
+                       locked. */\r
                        if( pxQueue->xRxLock == queueUNLOCKED )\r
                        {\r
                                if( listLIST_IS_EMPTY( &( pxQueue->xTasksWaitingToSend ) ) == pdFALSE )\r
@@ -1238,6 +1239,44 @@ xQUEUE *pxQueue;
 }\r
 /*-----------------------------------------------------------*/\r
 \r
+signed portBASE_TYPE xQueuePeekFromISR( xQueueHandle xQueue, void * const pvBuffer )\r
+{\r
+signed portBASE_TYPE xReturn;\r
+unsigned portBASE_TYPE uxSavedInterruptStatus;\r
+signed char *pcOriginalReadPosition;\r
+xQUEUE *pxQueue;\r
+\r
+       pxQueue = ( xQUEUE * ) xQueue;\r
+       configASSERT( pxQueue );\r
+       configASSERT( !( ( pvBuffer == NULL ) && ( pxQueue->uxItemSize != ( unsigned portBASE_TYPE ) 0U ) ) );\r
+\r
+       uxSavedInterruptStatus = portSET_INTERRUPT_MASK_FROM_ISR();\r
+       {\r
+               /* Cannot block in an ISR, so check there is data available. */\r
+               if( pxQueue->uxMessagesWaiting > ( unsigned portBASE_TYPE ) 0 )\r
+               {\r
+                       traceQUEUE_PEEK_FROM_ISR( pxQueue );\r
+\r
+                       /* Remember the read position so it can be reset as nothing is\r
+                       actually being removed from the queue. */\r
+                       pcOriginalReadPosition = pxQueue->u.pcReadFrom;\r
+                       prvCopyDataFromQueue( pxQueue, pvBuffer );\r
+                       pxQueue->u.pcReadFrom = pcOriginalReadPosition;\r
+\r
+                       xReturn = pdPASS;\r
+               }\r
+               else\r
+               {\r
+                       xReturn = pdFAIL;\r
+                       traceQUEUE_PEEK_FROM_ISR_FAILED( pxQueue );\r
+               }\r
+       }\r
+       portCLEAR_INTERRUPT_MASK_FROM_ISR( uxSavedInterruptStatus );\r
+\r
+       return xReturn;\r
+}\r
+/*-----------------------------------------------------------*/\r
+\r
 unsigned portBASE_TYPE uxQueueMessagesWaiting( const xQueueHandle xQueue )\r
 {\r
 unsigned portBASE_TYPE uxReturn;\r