|
|
@@ -104,7 +104,6 @@ extern "C" {
|
|
|
* used to create a synchronisation point between multiple tasks (a
|
|
|
* 'rendezvous').
|
|
|
*
|
|
|
- * \defgroup EventGroup
|
|
|
*/
|
|
|
|
|
|
|
|
|
@@ -116,7 +115,6 @@ extern "C" {
|
|
|
* xEventGroupCreate() returns an EventGroupHandle_t variable that can then
|
|
|
* be used as a parameter to other event group functions.
|
|
|
*
|
|
|
- * \defgroup EventGroupHandle_t EventGroupHandle_t
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
typedef void * EventGroupHandle_t;
|
|
|
@@ -126,17 +124,11 @@ typedef void * EventGroupHandle_t;
|
|
|
* number of bits it holds is set by configUSE_16_BIT_TICKS (16 bits if set to 1,
|
|
|
* 32 bits if set to 0.
|
|
|
*
|
|
|
- * \defgroup EventBits_t EventBits_t
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
typedef TickType_t EventBits_t;
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- EventGroupHandle_t xEventGroupCreate( void );
|
|
|
- </pre>
|
|
|
- *
|
|
|
* Create a new event group.
|
|
|
*
|
|
|
* Internally, within the FreeRTOS implementation, event groups use a [small]
|
|
|
@@ -162,25 +154,24 @@ typedef TickType_t EventBits_t;
|
|
|
* event group then NULL is returned. See http://www.freertos.org/a00111.html
|
|
|
*
|
|
|
* Example usage:
|
|
|
- <pre>
|
|
|
- // Declare a variable to hold the created event group.
|
|
|
- EventGroupHandle_t xCreatedEventGroup;
|
|
|
-
|
|
|
- // Attempt to create the event group.
|
|
|
- xCreatedEventGroup = xEventGroupCreate();
|
|
|
-
|
|
|
- // Was the event group created successfully?
|
|
|
- if( xCreatedEventGroup == NULL )
|
|
|
- {
|
|
|
- // The event group was not created because there was insufficient
|
|
|
- // FreeRTOS heap available.
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // The event group was created.
|
|
|
- }
|
|
|
- </pre>
|
|
|
- * \defgroup xEventGroupCreate xEventGroupCreate
|
|
|
+ * @code{c}
|
|
|
+ * // Declare a variable to hold the created event group.
|
|
|
+ * EventGroupHandle_t xCreatedEventGroup;
|
|
|
+ *
|
|
|
+ * // Attempt to create the event group.
|
|
|
+ * xCreatedEventGroup = xEventGroupCreate();
|
|
|
+ *
|
|
|
+ * // Was the event group created successfully?
|
|
|
+ * if( xCreatedEventGroup == NULL )
|
|
|
+ * {
|
|
|
+ * // The event group was not created because there was insufficient
|
|
|
+ * // FreeRTOS heap available.
|
|
|
+ * }
|
|
|
+ * else
|
|
|
+ * {
|
|
|
+ * // The event group was created.
|
|
|
+ * }
|
|
|
+ * @endcode
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
#if( configSUPPORT_DYNAMIC_ALLOCATION == 1 )
|
|
|
@@ -188,11 +179,6 @@ typedef TickType_t EventBits_t;
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- EventGroupHandle_t xEventGroupCreateStatic( EventGroupHandle_t * pxEventGroupBuffer );
|
|
|
- </pre>
|
|
|
- *
|
|
|
* Create a new event group.
|
|
|
*
|
|
|
* Internally, within the FreeRTOS implementation, event groups use a [small]
|
|
|
@@ -221,35 +207,26 @@ typedef TickType_t EventBits_t;
|
|
|
* returned. If pxEventGroupBuffer was NULL then NULL is returned.
|
|
|
*
|
|
|
* Example usage:
|
|
|
- <pre>
|
|
|
- // StaticEventGroup_t is a publicly accessible structure that has the same
|
|
|
- // size and alignment requirements as the real event group structure. It is
|
|
|
- // provided as a mechanism for applications to know the size of the event
|
|
|
- // group (which is dependent on the architecture and configuration file
|
|
|
- // settings) without breaking the strict data hiding policy by exposing the
|
|
|
- // real event group internals. This StaticEventGroup_t variable is passed
|
|
|
- // into the xSemaphoreCreateEventGroupStatic() function and is used to store
|
|
|
- // the event group's data structures
|
|
|
- StaticEventGroup_t xEventGroupBuffer;
|
|
|
-
|
|
|
- // Create the event group without dynamically allocating any memory.
|
|
|
- xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer );
|
|
|
- </pre>
|
|
|
+ * @code{c}
|
|
|
+ * // StaticEventGroup_t is a publicly accessible structure that has the same
|
|
|
+ * // size and alignment requirements as the real event group structure. It is
|
|
|
+ * // provided as a mechanism for applications to know the size of the event
|
|
|
+ * // group (which is dependent on the architecture and configuration file
|
|
|
+ * // settings) without breaking the strict data hiding policy by exposing the
|
|
|
+ * // real event group internals. This StaticEventGroup_t variable is passed
|
|
|
+ * // into the xSemaphoreCreateEventGroupStatic() function and is used to store
|
|
|
+ * // the event group's data structures
|
|
|
+ * StaticEventGroup_t xEventGroupBuffer;
|
|
|
+ *
|
|
|
+ * // Create the event group without dynamically allocating any memory.
|
|
|
+ * xEventGroup = xEventGroupCreateStatic( &xEventGroupBuffer );
|
|
|
+ * @endcode
|
|
|
*/
|
|
|
#if( configSUPPORT_STATIC_ALLOCATION == 1 )
|
|
|
EventGroupHandle_t xEventGroupCreateStatic( StaticEventGroup_t *pxEventGroupBuffer ) PRIVILEGED_FUNCTION;
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
|
|
|
- const EventBits_t uxBitsToWaitFor,
|
|
|
- const BaseType_t xClearOnExit,
|
|
|
- const BaseType_t xWaitForAllBits,
|
|
|
- const TickType_t xTicksToWait );
|
|
|
- </pre>
|
|
|
- *
|
|
|
* [Potentially] block to wait for one or more bits to be set within a
|
|
|
* previously created event group.
|
|
|
*
|
|
|
@@ -292,54 +269,48 @@ typedef TickType_t EventBits_t;
|
|
|
* pdTRUE.
|
|
|
*
|
|
|
* Example usage:
|
|
|
- <pre>
|
|
|
- #define BIT_0 ( 1 << 0 )
|
|
|
- #define BIT_4 ( 1 << 4 )
|
|
|
-
|
|
|
- void aFunction( EventGroupHandle_t xEventGroup )
|
|
|
- {
|
|
|
- EventBits_t uxBits;
|
|
|
- const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
|
|
|
-
|
|
|
- // Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
|
|
|
- // the event group. Clear the bits before exiting.
|
|
|
- uxBits = xEventGroupWaitBits(
|
|
|
- xEventGroup, // The event group being tested.
|
|
|
- BIT_0 | BIT_4, // The bits within the event group to wait for.
|
|
|
- pdTRUE, // BIT_0 and BIT_4 should be cleared before returning.
|
|
|
- pdFALSE, // Don't wait for both bits, either bit will do.
|
|
|
- xTicksToWait ); // Wait a maximum of 100ms for either bit to be set.
|
|
|
-
|
|
|
- if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
|
|
- {
|
|
|
- // xEventGroupWaitBits() returned because both bits were set.
|
|
|
- }
|
|
|
- else if( ( uxBits & BIT_0 ) != 0 )
|
|
|
- {
|
|
|
- // xEventGroupWaitBits() returned because just BIT_0 was set.
|
|
|
- }
|
|
|
- else if( ( uxBits & BIT_4 ) != 0 )
|
|
|
- {
|
|
|
- // xEventGroupWaitBits() returned because just BIT_4 was set.
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // xEventGroupWaitBits() returned because xTicksToWait ticks passed
|
|
|
- // without either BIT_0 or BIT_4 becoming set.
|
|
|
- }
|
|
|
- }
|
|
|
- </pre>
|
|
|
- * \defgroup xEventGroupWaitBits xEventGroupWaitBits
|
|
|
+ * @code{c}
|
|
|
+ * #define BIT_0 ( 1 << 0 )
|
|
|
+ * #define BIT_4 ( 1 << 4 )
|
|
|
+ *
|
|
|
+ * void aFunction( EventGroupHandle_t xEventGroup )
|
|
|
+ * {
|
|
|
+ * EventBits_t uxBits;
|
|
|
+ * const TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
|
|
|
+ *
|
|
|
+ * // Wait a maximum of 100ms for either bit 0 or bit 4 to be set within
|
|
|
+ * // the event group. Clear the bits before exiting.
|
|
|
+ * uxBits = xEventGroupWaitBits(
|
|
|
+ * xEventGroup, // The event group being tested.
|
|
|
+ * BIT_0 | BIT_4, // The bits within the event group to wait for.
|
|
|
+ * pdTRUE, // BIT_0 and BIT_4 should be cleared before returning.
|
|
|
+ * pdFALSE, // Don't wait for both bits, either bit will do.
|
|
|
+ * xTicksToWait ); // Wait a maximum of 100ms for either bit to be set.
|
|
|
+ *
|
|
|
+ * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
|
|
+ * {
|
|
|
+ * // xEventGroupWaitBits() returned because both bits were set.
|
|
|
+ * }
|
|
|
+ * else if( ( uxBits & BIT_0 ) != 0 )
|
|
|
+ * {
|
|
|
+ * // xEventGroupWaitBits() returned because just BIT_0 was set.
|
|
|
+ * }
|
|
|
+ * else if( ( uxBits & BIT_4 ) != 0 )
|
|
|
+ * {
|
|
|
+ * // xEventGroupWaitBits() returned because just BIT_4 was set.
|
|
|
+ * }
|
|
|
+ * else
|
|
|
+ * {
|
|
|
+ * // xEventGroupWaitBits() returned because xTicksToWait ticks passed
|
|
|
+ * // without either BIT_0 or BIT_4 becoming set.
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ * @endcode{c}
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToWaitFor, const BaseType_t xClearOnExit, const BaseType_t xWaitForAllBits, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear );
|
|
|
- </pre>
|
|
|
- *
|
|
|
* Clear bits within an event group. This function cannot be called from an
|
|
|
* interrupt.
|
|
|
*
|
|
|
@@ -352,51 +323,45 @@ EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup, const EventBits
|
|
|
* @return The value of the event group before the specified bits were cleared.
|
|
|
*
|
|
|
* Example usage:
|
|
|
- <pre>
|
|
|
- #define BIT_0 ( 1 << 0 )
|
|
|
- #define BIT_4 ( 1 << 4 )
|
|
|
-
|
|
|
- void aFunction( EventGroupHandle_t xEventGroup )
|
|
|
- {
|
|
|
- EventBits_t uxBits;
|
|
|
-
|
|
|
- // Clear bit 0 and bit 4 in xEventGroup.
|
|
|
- uxBits = xEventGroupClearBits(
|
|
|
- xEventGroup, // The event group being updated.
|
|
|
- BIT_0 | BIT_4 );// The bits being cleared.
|
|
|
-
|
|
|
- if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
|
|
- {
|
|
|
- // Both bit 0 and bit 4 were set before xEventGroupClearBits() was
|
|
|
- // called. Both will now be clear (not set).
|
|
|
- }
|
|
|
- else if( ( uxBits & BIT_0 ) != 0 )
|
|
|
- {
|
|
|
- // Bit 0 was set before xEventGroupClearBits() was called. It will
|
|
|
- // now be clear.
|
|
|
- }
|
|
|
- else if( ( uxBits & BIT_4 ) != 0 )
|
|
|
- {
|
|
|
- // Bit 4 was set before xEventGroupClearBits() was called. It will
|
|
|
- // now be clear.
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // Neither bit 0 nor bit 4 were set in the first place.
|
|
|
- }
|
|
|
- }
|
|
|
- </pre>
|
|
|
- * \defgroup xEventGroupClearBits xEventGroupClearBits
|
|
|
+ * @code{c}
|
|
|
+ * #define BIT_0 ( 1 << 0 )
|
|
|
+ * #define BIT_4 ( 1 << 4 )
|
|
|
+ *
|
|
|
+ * void aFunction( EventGroupHandle_t xEventGroup )
|
|
|
+ * {
|
|
|
+ * EventBits_t uxBits;
|
|
|
+ *
|
|
|
+ * // Clear bit 0 and bit 4 in xEventGroup.
|
|
|
+ * uxBits = xEventGroupClearBits(
|
|
|
+ * xEventGroup, // The event group being updated.
|
|
|
+ * BIT_0 | BIT_4 );// The bits being cleared.
|
|
|
+ *
|
|
|
+ * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
|
|
+ * {
|
|
|
+ * // Both bit 0 and bit 4 were set before xEventGroupClearBits() was
|
|
|
+ * // called. Both will now be clear (not set).
|
|
|
+ * }
|
|
|
+ * else if( ( uxBits & BIT_0 ) != 0 )
|
|
|
+ * {
|
|
|
+ * // Bit 0 was set before xEventGroupClearBits() was called. It will
|
|
|
+ * // now be clear.
|
|
|
+ * }
|
|
|
+ * else if( ( uxBits & BIT_4 ) != 0 )
|
|
|
+ * {
|
|
|
+ * // Bit 4 was set before xEventGroupClearBits() was called. It will
|
|
|
+ * // now be clear.
|
|
|
+ * }
|
|
|
+ * else
|
|
|
+ * {
|
|
|
+ * // Neither bit 0 nor bit 4 were set in the first place.
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ * @endcode
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToClear ) PRIVILEGED_FUNCTION;
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- BaseType_t xEventGroupClearBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
|
|
|
- </pre>
|
|
|
- *
|
|
|
* A version of xEventGroupClearBits() that can be called from an interrupt.
|
|
|
*
|
|
|
* Setting bits in an event group is not a deterministic operation because there
|
|
|
@@ -420,28 +385,27 @@ EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBit
|
|
|
* if the timer service queue was full.
|
|
|
*
|
|
|
* Example usage:
|
|
|
- <pre>
|
|
|
- #define BIT_0 ( 1 << 0 )
|
|
|
- #define BIT_4 ( 1 << 4 )
|
|
|
-
|
|
|
- // An event group which it is assumed has already been created by a call to
|
|
|
- // xEventGroupCreate().
|
|
|
- EventGroupHandle_t xEventGroup;
|
|
|
-
|
|
|
- void anInterruptHandler( void )
|
|
|
- {
|
|
|
- // Clear bit 0 and bit 4 in xEventGroup.
|
|
|
- xResult = xEventGroupClearBitsFromISR(
|
|
|
- xEventGroup, // The event group being updated.
|
|
|
- BIT_0 | BIT_4 ); // The bits being set.
|
|
|
-
|
|
|
- if( xResult == pdPASS )
|
|
|
- {
|
|
|
- // The message was posted successfully.
|
|
|
- }
|
|
|
- }
|
|
|
- </pre>
|
|
|
- * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR
|
|
|
+ * @code{c}
|
|
|
+ * #define BIT_0 ( 1 << 0 )
|
|
|
+ * #define BIT_4 ( 1 << 4 )
|
|
|
+ *
|
|
|
+ * // An event group which it is assumed has already been created by a call to
|
|
|
+ * // xEventGroupCreate().
|
|
|
+ * EventGroupHandle_t xEventGroup;
|
|
|
+ *
|
|
|
+ * void anInterruptHandler( void )
|
|
|
+ * {
|
|
|
+ * // Clear bit 0 and bit 4 in xEventGroup.
|
|
|
+ * xResult = xEventGroupClearBitsFromISR(
|
|
|
+ * xEventGroup, // The event group being updated.
|
|
|
+ * BIT_0 | BIT_4 ); // The bits being set.
|
|
|
+ *
|
|
|
+ * if( xResult == pdPASS )
|
|
|
+ * {
|
|
|
+ * // The message was posted successfully.
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ * @endcode
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
#if( configUSE_TRACE_FACILITY == 1 )
|
|
|
@@ -451,11 +415,6 @@ EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBit
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
|
|
|
- </pre>
|
|
|
- *
|
|
|
* Set bits within an event group.
|
|
|
* This function cannot be called from an interrupt. xEventGroupSetBitsFromISR()
|
|
|
* is a version that can be called from an interrupt.
|
|
|
@@ -480,56 +439,50 @@ EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup, const EventBit
|
|
|
* event group value before the call to xEventGroupSetBits() returns.
|
|
|
*
|
|
|
* Example usage:
|
|
|
- <pre>
|
|
|
- #define BIT_0 ( 1 << 0 )
|
|
|
- #define BIT_4 ( 1 << 4 )
|
|
|
-
|
|
|
- void aFunction( EventGroupHandle_t xEventGroup )
|
|
|
- {
|
|
|
- EventBits_t uxBits;
|
|
|
-
|
|
|
- // Set bit 0 and bit 4 in xEventGroup.
|
|
|
- uxBits = xEventGroupSetBits(
|
|
|
- xEventGroup, // The event group being updated.
|
|
|
- BIT_0 | BIT_4 );// The bits being set.
|
|
|
-
|
|
|
- if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
|
|
- {
|
|
|
- // Both bit 0 and bit 4 remained set when the function returned.
|
|
|
- }
|
|
|
- else if( ( uxBits & BIT_0 ) != 0 )
|
|
|
- {
|
|
|
- // Bit 0 remained set when the function returned, but bit 4 was
|
|
|
- // cleared. It might be that bit 4 was cleared automatically as a
|
|
|
- // task that was waiting for bit 4 was removed from the Blocked
|
|
|
- // state.
|
|
|
- }
|
|
|
- else if( ( uxBits & BIT_4 ) != 0 )
|
|
|
- {
|
|
|
- // Bit 4 remained set when the function returned, but bit 0 was
|
|
|
- // cleared. It might be that bit 0 was cleared automatically as a
|
|
|
- // task that was waiting for bit 0 was removed from the Blocked
|
|
|
- // state.
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- // Neither bit 0 nor bit 4 remained set. It might be that a task
|
|
|
- // was waiting for both of the bits to be set, and the bits were
|
|
|
- // cleared as the task left the Blocked state.
|
|
|
- }
|
|
|
- }
|
|
|
- </pre>
|
|
|
- * \defgroup xEventGroupSetBits xEventGroupSetBits
|
|
|
+ * @code{c}
|
|
|
+ * #define BIT_0 ( 1 << 0 )
|
|
|
+ * #define BIT_4 ( 1 << 4 )
|
|
|
+ *
|
|
|
+ * void aFunction( EventGroupHandle_t xEventGroup )
|
|
|
+ * {
|
|
|
+ * EventBits_t uxBits;
|
|
|
+ *
|
|
|
+ * // Set bit 0 and bit 4 in xEventGroup.
|
|
|
+ * uxBits = xEventGroupSetBits(
|
|
|
+ * xEventGroup, // The event group being updated.
|
|
|
+ * BIT_0 | BIT_4 );// The bits being set.
|
|
|
+ *
|
|
|
+ * if( ( uxBits & ( BIT_0 | BIT_4 ) ) == ( BIT_0 | BIT_4 ) )
|
|
|
+ * {
|
|
|
+ * // Both bit 0 and bit 4 remained set when the function returned.
|
|
|
+ * }
|
|
|
+ * else if( ( uxBits & BIT_0 ) != 0 )
|
|
|
+ * {
|
|
|
+ * // Bit 0 remained set when the function returned, but bit 4 was
|
|
|
+ * // cleared. It might be that bit 4 was cleared automatically as a
|
|
|
+ * // task that was waiting for bit 4 was removed from the Blocked
|
|
|
+ * // state.
|
|
|
+ * }
|
|
|
+ * else if( ( uxBits & BIT_4 ) != 0 )
|
|
|
+ * {
|
|
|
+ * // Bit 4 remained set when the function returned, but bit 0 was
|
|
|
+ * // cleared. It might be that bit 0 was cleared automatically as a
|
|
|
+ * // task that was waiting for bit 0 was removed from the Blocked
|
|
|
+ * // state.
|
|
|
+ * }
|
|
|
+ * else
|
|
|
+ * {
|
|
|
+ * // Neither bit 0 nor bit 4 remained set. It might be that a task
|
|
|
+ * // was waiting for both of the bits to be set, and the bits were
|
|
|
+ * // cleared as the task left the Blocked state.
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ * @endcode{c}
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet ) PRIVILEGED_FUNCTION;
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );
|
|
|
- </pre>
|
|
|
- *
|
|
|
* A version of xEventGroupSetBits() that can be called from an interrupt.
|
|
|
*
|
|
|
* Setting bits in an event group is not a deterministic operation because there
|
|
|
@@ -561,39 +514,38 @@ EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_
|
|
|
* if the timer service queue was full.
|
|
|
*
|
|
|
* Example usage:
|
|
|
- <pre>
|
|
|
- #define BIT_0 ( 1 << 0 )
|
|
|
- #define BIT_4 ( 1 << 4 )
|
|
|
-
|
|
|
- // An event group which it is assumed has already been created by a call to
|
|
|
- // xEventGroupCreate().
|
|
|
- EventGroupHandle_t xEventGroup;
|
|
|
-
|
|
|
- void anInterruptHandler( void )
|
|
|
- {
|
|
|
- BaseType_t xHigherPriorityTaskWoken, xResult;
|
|
|
-
|
|
|
- // xHigherPriorityTaskWoken must be initialised to pdFALSE.
|
|
|
- xHigherPriorityTaskWoken = pdFALSE;
|
|
|
-
|
|
|
- // Set bit 0 and bit 4 in xEventGroup.
|
|
|
- xResult = xEventGroupSetBitsFromISR(
|
|
|
- xEventGroup, // The event group being updated.
|
|
|
- BIT_0 | BIT_4 // The bits being set.
|
|
|
- &xHigherPriorityTaskWoken );
|
|
|
-
|
|
|
- // Was the message posted successfully?
|
|
|
- if( xResult == pdPASS )
|
|
|
- {
|
|
|
- // If xHigherPriorityTaskWoken is now set to pdTRUE then a context
|
|
|
- // switch should be requested. The macro used is port specific and
|
|
|
- // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -
|
|
|
- // refer to the documentation page for the port being used.
|
|
|
- portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
|
|
- }
|
|
|
- }
|
|
|
- </pre>
|
|
|
- * \defgroup xEventGroupSetBitsFromISR xEventGroupSetBitsFromISR
|
|
|
+ * @code{c}
|
|
|
+ * #define BIT_0 ( 1 << 0 )
|
|
|
+ * #define BIT_4 ( 1 << 4 )
|
|
|
+ *
|
|
|
+ * // An event group which it is assumed has already been created by a call to
|
|
|
+ * // xEventGroupCreate().
|
|
|
+ * EventGroupHandle_t xEventGroup;
|
|
|
+ *
|
|
|
+ * void anInterruptHandler( void )
|
|
|
+ * {
|
|
|
+ * BaseType_t xHigherPriorityTaskWoken, xResult;
|
|
|
+ *
|
|
|
+ * // xHigherPriorityTaskWoken must be initialised to pdFALSE.
|
|
|
+ * xHigherPriorityTaskWoken = pdFALSE;
|
|
|
+ *
|
|
|
+ * // Set bit 0 and bit 4 in xEventGroup.
|
|
|
+ * xResult = xEventGroupSetBitsFromISR(
|
|
|
+ * xEventGroup, // The event group being updated.
|
|
|
+ * BIT_0 | BIT_4 // The bits being set.
|
|
|
+ * &xHigherPriorityTaskWoken );
|
|
|
+ *
|
|
|
+ * // Was the message posted successfully?
|
|
|
+ * if( xResult == pdPASS )
|
|
|
+ * {
|
|
|
+ * // If xHigherPriorityTaskWoken is now set to pdTRUE then a context
|
|
|
+ * // switch should be requested. The macro used is port specific and
|
|
|
+ * // will be either portYIELD_FROM_ISR() or portEND_SWITCHING_ISR() -
|
|
|
+ * // refer to the documentation page for the port being used.
|
|
|
+ * portYIELD_FROM_ISR( xHigherPriorityTaskWoken );
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ * @endcode
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
#if( configUSE_TRACE_FACILITY == 1 )
|
|
|
@@ -603,14 +555,6 @@ EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_
|
|
|
#endif
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,
|
|
|
- const EventBits_t uxBitsToSet,
|
|
|
- const EventBits_t uxBitsToWaitFor,
|
|
|
- TickType_t xTicksToWait );
|
|
|
- </pre>
|
|
|
- *
|
|
|
* Atomically set bits within an event group, then wait for a combination of
|
|
|
* bits to be set within the same event group. This functionality is typically
|
|
|
* used to synchronise multiple tasks, where each task has to wait for the other
|
|
|
@@ -648,93 +592,87 @@ EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_
|
|
|
* automatically cleared.
|
|
|
*
|
|
|
* Example usage:
|
|
|
- <pre>
|
|
|
- // Bits used by the three tasks.
|
|
|
- #define TASK_0_BIT ( 1 << 0 )
|
|
|
- #define TASK_1_BIT ( 1 << 1 )
|
|
|
- #define TASK_2_BIT ( 1 << 2 )
|
|
|
-
|
|
|
- #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )
|
|
|
-
|
|
|
- // Use an event group to synchronise three tasks. It is assumed this event
|
|
|
- // group has already been created elsewhere.
|
|
|
- EventGroupHandle_t xEventBits;
|
|
|
-
|
|
|
- void vTask0( void *pvParameters )
|
|
|
- {
|
|
|
- EventBits_t uxReturn;
|
|
|
- TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
|
|
|
-
|
|
|
- for( ;; )
|
|
|
- {
|
|
|
- // Perform task functionality here.
|
|
|
-
|
|
|
- // Set bit 0 in the event flag to note this task has reached the
|
|
|
- // sync point. The other two tasks will set the other two bits defined
|
|
|
- // by ALL_SYNC_BITS. All three tasks have reached the synchronisation
|
|
|
- // point when all the ALL_SYNC_BITS are set. Wait a maximum of 100ms
|
|
|
- // for this to happen.
|
|
|
- uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );
|
|
|
-
|
|
|
- if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
|
|
|
- {
|
|
|
- // All three tasks reached the synchronisation point before the call
|
|
|
- // to xEventGroupSync() timed out.
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- void vTask1( void *pvParameters )
|
|
|
- {
|
|
|
- for( ;; )
|
|
|
- {
|
|
|
- // Perform task functionality here.
|
|
|
-
|
|
|
- // Set bit 1 in the event flag to note this task has reached the
|
|
|
- // synchronisation point. The other two tasks will set the other two
|
|
|
- // bits defined by ALL_SYNC_BITS. All three tasks have reached the
|
|
|
- // synchronisation point when all the ALL_SYNC_BITS are set. Wait
|
|
|
- // indefinitely for this to happen.
|
|
|
- xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );
|
|
|
-
|
|
|
- // xEventGroupSync() was called with an indefinite block time, so
|
|
|
- // this task will only reach here if the syncrhonisation was made by all
|
|
|
- // three tasks, so there is no need to test the return value.
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- void vTask2( void *pvParameters )
|
|
|
- {
|
|
|
- for( ;; )
|
|
|
- {
|
|
|
- // Perform task functionality here.
|
|
|
-
|
|
|
- // Set bit 2 in the event flag to note this task has reached the
|
|
|
- // synchronisation point. The other two tasks will set the other two
|
|
|
- // bits defined by ALL_SYNC_BITS. All three tasks have reached the
|
|
|
- // synchronisation point when all the ALL_SYNC_BITS are set. Wait
|
|
|
- // indefinitely for this to happen.
|
|
|
- xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );
|
|
|
-
|
|
|
- // xEventGroupSync() was called with an indefinite block time, so
|
|
|
- // this task will only reach here if the syncrhonisation was made by all
|
|
|
- // three tasks, so there is no need to test the return value.
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- </pre>
|
|
|
- * \defgroup xEventGroupSync xEventGroupSync
|
|
|
+ * @code{c}
|
|
|
+ * // Bits used by the three tasks.
|
|
|
+ * #define TASK_0_BIT ( 1 << 0 )
|
|
|
+ * #define TASK_1_BIT ( 1 << 1 )
|
|
|
+ * #define TASK_2_BIT ( 1 << 2 )
|
|
|
+ *
|
|
|
+ * #define ALL_SYNC_BITS ( TASK_0_BIT | TASK_1_BIT | TASK_2_BIT )
|
|
|
+ *
|
|
|
+ * // Use an event group to synchronise three tasks. It is assumed this event
|
|
|
+ * // group has already been created elsewhere.
|
|
|
+ * EventGroupHandle_t xEventBits;
|
|
|
+ *
|
|
|
+ * void vTask0( void *pvParameters )
|
|
|
+ * {
|
|
|
+ * EventBits_t uxReturn;
|
|
|
+ * TickType_t xTicksToWait = 100 / portTICK_PERIOD_MS;
|
|
|
+ *
|
|
|
+ * for( ;; )
|
|
|
+ * {
|
|
|
+ * // Perform task functionality here.
|
|
|
+ *
|
|
|
+ * // Set bit 0 in the event flag to note this task has reached the
|
|
|
+ * // sync point. The other two tasks will set the other two bits defined
|
|
|
+ * // by ALL_SYNC_BITS. All three tasks have reached the synchronisation
|
|
|
+ * // point when all the ALL_SYNC_BITS are set. Wait a maximum of 100ms
|
|
|
+ * // for this to happen.
|
|
|
+ * uxReturn = xEventGroupSync( xEventBits, TASK_0_BIT, ALL_SYNC_BITS, xTicksToWait );
|
|
|
+ *
|
|
|
+ * if( ( uxReturn & ALL_SYNC_BITS ) == ALL_SYNC_BITS )
|
|
|
+ * {
|
|
|
+ * // All three tasks reached the synchronisation point before the call
|
|
|
+ * // to xEventGroupSync() timed out.
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ *
|
|
|
+ * void vTask1( void *pvParameters )
|
|
|
+ * {
|
|
|
+ * for( ;; )
|
|
|
+ * {
|
|
|
+ * // Perform task functionality here.
|
|
|
+ *
|
|
|
+ * // Set bit 1 in the event flag to note this task has reached the
|
|
|
+ * // synchronisation point. The other two tasks will set the other two
|
|
|
+ * // bits defined by ALL_SYNC_BITS. All three tasks have reached the
|
|
|
+ * // synchronisation point when all the ALL_SYNC_BITS are set. Wait
|
|
|
+ * // indefinitely for this to happen.
|
|
|
+ * xEventGroupSync( xEventBits, TASK_1_BIT, ALL_SYNC_BITS, portMAX_DELAY );
|
|
|
+ *
|
|
|
+ * // xEventGroupSync() was called with an indefinite block time, so
|
|
|
+ * // this task will only reach here if the syncrhonisation was made by all
|
|
|
+ * // three tasks, so there is no need to test the return value.
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ *
|
|
|
+ * void vTask2( void *pvParameters )
|
|
|
+ * {
|
|
|
+ * for( ;; )
|
|
|
+ * {
|
|
|
+ * // Perform task functionality here.
|
|
|
+ *
|
|
|
+ * // Set bit 2 in the event flag to note this task has reached the
|
|
|
+ * // synchronisation point. The other two tasks will set the other two
|
|
|
+ * // bits defined by ALL_SYNC_BITS. All three tasks have reached the
|
|
|
+ * // synchronisation point when all the ALL_SYNC_BITS are set. Wait
|
|
|
+ * // indefinitely for this to happen.
|
|
|
+ * xEventGroupSync( xEventBits, TASK_2_BIT, ALL_SYNC_BITS, portMAX_DELAY );
|
|
|
+ *
|
|
|
+ * // xEventGroupSync() was called with an indefinite block time, so
|
|
|
+ * // this task will only reach here if the syncrhonisation was made by all
|
|
|
+ * // three tasks, so there is no need to test the return value.
|
|
|
+ * }
|
|
|
+ * }
|
|
|
+ *
|
|
|
+ * @endcode
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, const EventBits_t uxBitsToWaitFor, TickType_t xTicksToWait ) PRIVILEGED_FUNCTION;
|
|
|
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- EventBits_t xEventGroupGetBits( EventGroupHandle_t xEventGroup );
|
|
|
- </pre>
|
|
|
- *
|
|
|
* Returns the current value of the bits in an event group. This function
|
|
|
* cannot be used from an interrupt.
|
|
|
*
|
|
|
@@ -742,33 +680,22 @@ EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup, const EventBits_t u
|
|
|
*
|
|
|
* @return The event group bits at the time xEventGroupGetBits() was called.
|
|
|
*
|
|
|
- * \defgroup xEventGroupGetBits xEventGroupGetBits
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
#define xEventGroupGetBits( xEventGroup ) xEventGroupClearBits( xEventGroup, 0 )
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
|
|
|
- </pre>
|
|
|
- *
|
|
|
* A version of xEventGroupGetBits() that can be called from an ISR.
|
|
|
*
|
|
|
* @param xEventGroup The event group being queried.
|
|
|
*
|
|
|
* @return The event group bits at the time xEventGroupGetBitsFromISR() was called.
|
|
|
*
|
|
|
- * \defgroup xEventGroupGetBitsFromISR xEventGroupGetBitsFromISR
|
|
|
* \ingroup EventGroup
|
|
|
*/
|
|
|
EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
|
|
|
|
|
|
/**
|
|
|
- * event_groups.h
|
|
|
- *<pre>
|
|
|
- void xEventGroupDelete( EventGroupHandle_t xEventGroup );
|
|
|
- </pre>
|
|
|
*
|
|
|
* Delete an event group that was previously created by a call to
|
|
|
* xEventGroupCreate(). Tasks that are blocked on the event group will be
|
|
|
@@ -778,6 +705,8 @@ EventBits_t xEventGroupGetBitsFromISR( EventGroupHandle_t xEventGroup );
|
|
|
*/
|
|
|
void vEventGroupDelete( EventGroupHandle_t xEventGroup );
|
|
|
|
|
|
+/** @cond */
|
|
|
+
|
|
|
/* For internal use only. */
|
|
|
void vEventGroupSetBitsCallback( void *pvEventGroup, const uint32_t ulBitsToSet );
|
|
|
void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToClear );
|
|
|
@@ -786,6 +715,8 @@ void vEventGroupClearBitsCallback( void *pvEventGroup, const uint32_t ulBitsToCl
|
|
|
UBaseType_t uxEventGroupGetNumber( void* xEventGroup );
|
|
|
#endif
|
|
|
|
|
|
+/** @endcond */
|
|
|
+
|
|
|
#ifdef __cplusplus
|
|
|
}
|
|
|
#endif
|