]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Source/event_groups.c
Introduce xTimerPendFunctionCall().
[freertos] / FreeRTOS / Source / event_groups.c
index 859a54439112e9271841e8abab4a0a8b42336a27..9747e04171d1dfcf6816164bdc70b148bb4d30e0 100644 (file)
@@ -87,8 +87,8 @@ privileged Vs unprivileged linkage and placement. */
        #error configUSE_TIMERS must be set to 1 to make the xEventGroupSetBitFromISR() function available.\r
 #endif\r
 \r
-#if ( INCLUDE_xEventGroupSetBitFromISR == 1 ) && ( INCLUDE_xTimerPendFunctionCallFromISR == 0 )\r
-       #error INCLUDE_xTimerPendFunctionCallFromISR must also be set to one to make the xEventGroupSetBitFromISR() function available.\r
+#if ( INCLUDE_xEventGroupSetBitFromISR == 1 ) && ( INCLUDE_xTimerPendFunctionCall == 0 )\r
+       #error INCLUDE_xTimerPendFunctionCall must also be set to one to make the xEventGroupSetBitFromISR() function available.\r
 #endif\r
 \r
 /* The following bit fields convey control information in a task's event list\r
@@ -110,6 +110,11 @@ typedef struct EVENT_GROUP_DEFINITION
 {\r
        EventBits_t uxEventBits;\r
        List_t xTasksWaitingForBits;            /*< List of tasks waiting for a bit to be set. */\r
+\r
+       #if( configUSE_TRACE_FACILITY == 1 )\r
+               UBaseType_t uxEventGroupNumber;\r
+       #endif\r
+\r
 } EventGroup_t;\r
 \r
 /*-----------------------------------------------------------*/\r
@@ -151,6 +156,7 @@ EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t u
 EventBits_t uxOriginalBitValue, uxReturn;\r
 EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;\r
 BaseType_t xAlreadyYielded;\r
+BaseType_t xTimeoutOccurred = pdFALSE;\r
 \r
        configASSERT( ( uxBitsToWaitFor & eventEVENT_BITS_CONTROL_BYTES ) == 0 );\r
        configASSERT( uxBitsToWaitFor != 0 );\r
@@ -162,8 +168,6 @@ BaseType_t xAlreadyYielded;
 \r
        vTaskSuspendAll();\r
        {\r
-               traceEVENT_GROUP_SYNC_START( xEventGroup, uxBitsToSet );\r
-\r
                uxOriginalBitValue = pxEventBits->uxEventBits;\r
 \r
                ( void ) xEventGroupSetBits( xEventGroup, uxBitsToSet );\r
@@ -183,6 +187,8 @@ BaseType_t xAlreadyYielded;
                {\r
                        if( xTicksToWait != ( TickType_t ) 0 )\r
                        {\r
+                               traceEVENT_GROUP_SYNC_BLOCK( xEventGroup, uxBitsToSet, uxBitsToWaitFor );\r
+\r
                                /* Store the bits that the calling task is waiting for in the\r
                                task's event list item so the kernel knows when a match is\r
                                found.  Then enter the blocked state. */\r
@@ -242,6 +248,8 @@ BaseType_t xAlreadyYielded;
                                }\r
                        }\r
                        taskEXIT_CRITICAL();\r
+\r
+                       xTimeoutOccurred = pdTRUE;\r
                }\r
                else\r
                {\r
@@ -251,7 +259,7 @@ BaseType_t xAlreadyYielded;
                }\r
        }\r
 \r
-       traceEVENT_GROUP_SYNC_END( xEventGroup, uxReturn );\r
+       traceEVENT_GROUP_SYNC_END( xEventGroup, uxBitsToSet, uxBitsToWaitFor, xTimeoutOccurred );\r
        return uxReturn;\r
 }\r
 /*-----------------------------------------------------------*/\r
@@ -261,6 +269,7 @@ EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits
 EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;\r
 EventBits_t uxReturn, uxControlBits = 0;\r
 BaseType_t xWaitConditionMet, xAlreadyYielded;\r
+BaseType_t xTimeoutOccurred = pdFALSE;\r
 \r
        /* Check the user is not attempting to wait on the bits used by the kernel\r
        itself, and that at least one bit is being requested. */\r
@@ -276,8 +285,6 @@ BaseType_t xWaitConditionMet, xAlreadyYielded;
        {\r
                const EventBits_t uxCurrentEventBits = pxEventBits->uxEventBits;\r
 \r
-               traceEVENT_GROUP_WAIT_BITS_START( xEventGroup, uxBitsToWaitFor );\r
-\r
                /* Check to see if the wait condition is already met or not. */\r
                xWaitConditionMet = prvTestWaitCondition( uxCurrentEventBits, uxBitsToWaitFor, xWaitForAllBits );\r
 \r
@@ -337,6 +344,8 @@ BaseType_t xWaitConditionMet, xAlreadyYielded;
                        some compilers mistakenly generate a warning about the variable\r
                        being returned without being set if it is not done. */\r
                        uxReturn = 0;\r
+\r
+                       traceEVENT_GROUP_WAIT_BITS_BLOCK( xEventGroup, uxBitsToWaitFor );\r
                }\r
        }\r
        xAlreadyYielded = xTaskResumeAll();\r
@@ -384,6 +393,8 @@ BaseType_t xWaitConditionMet, xAlreadyYielded;
                                }\r
                        }\r
                        taskEXIT_CRITICAL();\r
+\r
+                       xTimeoutOccurred = pdFALSE;\r
                }\r
                else\r
                {\r
@@ -392,8 +403,7 @@ BaseType_t xWaitConditionMet, xAlreadyYielded;
                        uxReturn &= ~eventEVENT_BITS_CONTROL_BYTES;\r
                }\r
        }\r
-\r
-       traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxReturn );\r
+       traceEVENT_GROUP_WAIT_BITS_END( xEventGroup, uxBitsToWaitFor, xTimeoutOccurred );\r
        return uxReturn;\r
 }\r
 /*-----------------------------------------------------------*/\r
@@ -608,5 +618,24 @@ BaseType_t xWaitConditionMet = pdFALSE;
 \r
        return xWaitConditionMet;\r
 }\r
+/*-----------------------------------------------------------*/\r
 \r
+#if (configUSE_TRACE_FACILITY == 1)\r
+       UBaseType_t uxEventGroupGetNumber( void* xEventGroup )\r
+       {\r
+       UBaseType_t xReturn;\r
+       EventGroup_t *pxEventBits = ( EventGroup_t * ) xEventGroup;\r
+\r
+               if( xEventGroup == NULL )\r
+               {\r
+                       xReturn = 0;\r
+               }\r
+               else\r
+               {\r
+                       xReturn = pxEventBits->uxEventGroupNumber;\r
+               }\r
+\r
+               return xReturn;\r
+       }\r
+#endif\r
 \r