|
|
@@ -1301,6 +1301,188 @@ BaseType_t xTaskGenericNotify( TaskHandle_t xTaskToNotify,
|
|
|
#define xTaskNotifyIndexed( xTaskToNotify, uxIndexToNotify, ulValue, eAction ) \
|
|
|
xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), NULL )
|
|
|
|
|
|
+/**
|
|
|
+ * task. h
|
|
|
+ * @code{c}
|
|
|
+ * BaseType_t xTaskNotifyAndQueryIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue );
|
|
|
+ * BaseType_t xTaskNotifyAndQuery( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotifyValue );
|
|
|
+ * @endcode
|
|
|
+ *
|
|
|
+ * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.
|
|
|
+ *
|
|
|
+ * xTaskNotifyAndQueryIndexed() performs the same operation as
|
|
|
+ * xTaskNotifyIndexed() with the addition that it also returns the subject
|
|
|
+ * task's prior notification value (the notification value at the time the
|
|
|
+ * function is called rather than when the function returns) in the additional
|
|
|
+ * pulPreviousNotifyValue parameter.
|
|
|
+ *
|
|
|
+ * xTaskNotifyAndQuery() performs the same operation as xTaskNotify() with the
|
|
|
+ * addition that it also returns the subject task's prior notification value
|
|
|
+ * (the notification value as it was at the time the function is called, rather
|
|
|
+ * than when the function returns) in the additional pulPreviousNotifyValue
|
|
|
+ * parameter.
|
|
|
+ *
|
|
|
+ * \defgroup xTaskNotifyAndQueryIndexed xTaskNotifyAndQueryIndexed
|
|
|
+ * \ingroup TaskNotifications
|
|
|
+ */
|
|
|
+#define xTaskNotifyAndQuery( xTaskToNotify, ulValue, eAction, pulPreviousNotifyValue ) \
|
|
|
+ xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) )
|
|
|
+#define xTaskNotifyAndQueryIndexed( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotifyValue ) \
|
|
|
+ xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotifyValue ) )
|
|
|
+
|
|
|
+/**
|
|
|
+ * task. h
|
|
|
+ * @code{c}
|
|
|
+ * BaseType_t xTaskNotifyIndexedFromISR( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );
|
|
|
+ * BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, BaseType_t *pxHigherPriorityTaskWoken );
|
|
|
+ * @endcode
|
|
|
+ *
|
|
|
+ * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.
|
|
|
+ *
|
|
|
+ * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these
|
|
|
+ * functions to be available.
|
|
|
+ *
|
|
|
+ * A version of xTaskNotifyIndexed() that can be used from an interrupt service
|
|
|
+ * routine (ISR).
|
|
|
+ *
|
|
|
+ * Each task has a private array of "notification values" (or 'notifications'),
|
|
|
+ * each of which is a 32-bit unsigned integer (uint32_t). The constant
|
|
|
+ * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the
|
|
|
+ * array, and (for backward compatibility) defaults to 1 if left undefined.
|
|
|
+ * Prior to FreeRTOS V10.4.0 there was only one notification value per task.
|
|
|
+ *
|
|
|
+ * Events can be sent to a task using an intermediary object. Examples of such
|
|
|
+ * objects are queues, semaphores, mutexes and event groups. Task notifications
|
|
|
+ * are a method of sending an event directly to a task without the need for such
|
|
|
+ * an intermediary object.
|
|
|
+ *
|
|
|
+ * A notification sent to a task can optionally perform an action, such as
|
|
|
+ * update, overwrite or increment one of the task's notification values. In
|
|
|
+ * that way task notifications can be used to send data to a task, or be used as
|
|
|
+ * light weight and fast binary or counting semaphores.
|
|
|
+ *
|
|
|
+ * A task can use xTaskNotifyWaitIndexed() to [optionally] block to wait for a
|
|
|
+ * notification to be pending, or ulTaskNotifyTakeIndexed() to [optionally] block
|
|
|
+ * to wait for a notification value to have a non-zero value. The task does
|
|
|
+ * not consume any CPU time while it is in the Blocked state.
|
|
|
+ *
|
|
|
+ * A notification sent to a task will remain pending until it is cleared by the
|
|
|
+ * task calling xTaskNotifyWaitIndexed() or ulTaskNotifyTakeIndexed() (or their
|
|
|
+ * un-indexed equivalents). If the task was already in the Blocked state to
|
|
|
+ * wait for a notification when the notification arrives then the task will
|
|
|
+ * automatically be removed from the Blocked state (unblocked) and the
|
|
|
+ * notification cleared.
|
|
|
+ *
|
|
|
+ * **NOTE** Each notification within the array operates independently - a task
|
|
|
+ * can only block on one notification within the array at a time and will not be
|
|
|
+ * unblocked by a notification sent to any other array index.
|
|
|
+ *
|
|
|
+ * Backward compatibility information:
|
|
|
+ * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and
|
|
|
+ * all task notification API functions operated on that value. Replacing the
|
|
|
+ * single notification value with an array of notification values necessitated a
|
|
|
+ * new set of API functions that could address specific notifications within the
|
|
|
+ * array. xTaskNotifyFromISR() is the original API function, and remains
|
|
|
+ * backward compatible by always operating on the notification value at index 0
|
|
|
+ * within the array. Calling xTaskNotifyFromISR() is equivalent to calling
|
|
|
+ * xTaskNotifyIndexedFromISR() with the uxIndexToNotify parameter set to 0.
|
|
|
+ *
|
|
|
+ * @param uxIndexToNotify The index within the target task's array of
|
|
|
+ * notification values to which the notification is to be sent. uxIndexToNotify
|
|
|
+ * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyFromISR()
|
|
|
+ * does not have this parameter and always sends notifications to index 0.
|
|
|
+ *
|
|
|
+ * @param xTaskToNotify The handle of the task being notified. The handle to a
|
|
|
+ * task can be returned from the xTaskCreate() API function used to create the
|
|
|
+ * task, and the handle of the currently running task can be obtained by calling
|
|
|
+ * xTaskGetCurrentTaskHandle().
|
|
|
+ *
|
|
|
+ * @param ulValue Data that can be sent with the notification. How the data is
|
|
|
+ * used depends on the value of the eAction parameter.
|
|
|
+ *
|
|
|
+ * @param eAction Specifies how the notification updates the task's notification
|
|
|
+ * value, if at all. Valid values for eAction are as follows:
|
|
|
+ *
|
|
|
+ * eSetBits -
|
|
|
+ * The task's notification value is bitwise ORed with ulValue. xTaskNotify()
|
|
|
+ * always returns pdPASS in this case.
|
|
|
+ *
|
|
|
+ * eIncrement -
|
|
|
+ * The task's notification value is incremented. ulValue is not used and
|
|
|
+ * xTaskNotify() always returns pdPASS in this case.
|
|
|
+ *
|
|
|
+ * eSetValueWithOverwrite -
|
|
|
+ * The task's notification value is set to the value of ulValue, even if the
|
|
|
+ * task being notified had not yet processed the previous notification (the
|
|
|
+ * task already had a notification pending). xTaskNotify() always returns
|
|
|
+ * pdPASS in this case.
|
|
|
+ *
|
|
|
+ * eSetValueWithoutOverwrite -
|
|
|
+ * If the task being notified did not already have a notification pending then
|
|
|
+ * the task's notification value is set to ulValue and xTaskNotify() will
|
|
|
+ * return pdPASS. If the task being notified already had a notification
|
|
|
+ * pending then no action is performed and pdFAIL is returned.
|
|
|
+ *
|
|
|
+ * eNoAction -
|
|
|
+ * The task receives a notification without its notification value being
|
|
|
+ * updated. ulValue is not used and xTaskNotify() always returns pdPASS in
|
|
|
+ * this case.
|
|
|
+ *
|
|
|
+ * @param pxHigherPriorityTaskWoken xTaskNotifyFromISR() will set
|
|
|
+ * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the
|
|
|
+ * task to which the notification was sent to leave the Blocked state, and the
|
|
|
+ * unblocked task has a priority higher than the currently running task. If
|
|
|
+ * xTaskNotifyFromISR() sets this value to pdTRUE then a context switch should
|
|
|
+ * be requested before the interrupt is exited. How a context switch is
|
|
|
+ * requested from an ISR is dependent on the port - see the documentation page
|
|
|
+ * for the port in use.
|
|
|
+ *
|
|
|
+ * @return Dependent on the value of eAction. See the description of the
|
|
|
+ * eAction parameter.
|
|
|
+ *
|
|
|
+ * \defgroup xTaskNotifyIndexedFromISR xTaskNotifyIndexedFromISR
|
|
|
+ * \ingroup TaskNotifications
|
|
|
+ */
|
|
|
+BaseType_t xTaskGenericNotifyFromISR( TaskHandle_t xTaskToNotify,
|
|
|
+ UBaseType_t uxIndexToNotify,
|
|
|
+ uint32_t ulValue,
|
|
|
+ eNotifyAction eAction,
|
|
|
+ uint32_t * pulPreviousNotificationValue,
|
|
|
+ BaseType_t * pxHigherPriorityTaskWoken );
|
|
|
+#define xTaskNotifyFromISR( xTaskToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \
|
|
|
+ xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) )
|
|
|
+#define xTaskNotifyIndexedFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pxHigherPriorityTaskWoken ) \
|
|
|
+ xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), NULL, ( pxHigherPriorityTaskWoken ) )
|
|
|
+
|
|
|
+/**
|
|
|
+ * task. h
|
|
|
+ * @code{c}
|
|
|
+ * BaseType_t xTaskNotifyAndQueryIndexedFromISR( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken );
|
|
|
+ * BaseType_t xTaskNotifyAndQueryFromISR( TaskHandle_t xTaskToNotify, uint32_t ulValue, eNotifyAction eAction, uint32_t *pulPreviousNotificationValue, BaseType_t *pxHigherPriorityTaskWoken );
|
|
|
+ * @endcode
|
|
|
+ *
|
|
|
+ * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.
|
|
|
+ *
|
|
|
+ * xTaskNotifyAndQueryIndexedFromISR() performs the same operation as
|
|
|
+ * xTaskNotifyIndexedFromISR() with the addition that it also returns the
|
|
|
+ * subject task's prior notification value (the notification value at the time
|
|
|
+ * the function is called rather than at the time the function returns) in the
|
|
|
+ * additional pulPreviousNotifyValue parameter.
|
|
|
+ *
|
|
|
+ * xTaskNotifyAndQueryFromISR() performs the same operation as
|
|
|
+ * xTaskNotifyFromISR() with the addition that it also returns the subject
|
|
|
+ * task's prior notification value (the notification value at the time the
|
|
|
+ * function is called rather than at the time the function returns) in the
|
|
|
+ * additional pulPreviousNotifyValue parameter.
|
|
|
+ *
|
|
|
+ * \defgroup xTaskNotifyAndQueryIndexedFromISR xTaskNotifyAndQueryIndexedFromISR
|
|
|
+ * \ingroup TaskNotifications
|
|
|
+ */
|
|
|
+#define xTaskNotifyAndQueryIndexedFromISR( xTaskToNotify, uxIndexToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \
|
|
|
+ xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) )
|
|
|
+#define xTaskNotifyAndQueryFromISR( xTaskToNotify, ulValue, eAction, pulPreviousNotificationValue, pxHigherPriorityTaskWoken ) \
|
|
|
+ xTaskGenericNotifyFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulValue ), ( eAction ), ( pulPreviousNotificationValue ), ( pxHigherPriorityTaskWoken ) )
|
|
|
+
|
|
|
/**
|
|
|
* task. h
|
|
|
* @code{c}
|
|
|
@@ -1415,6 +1597,406 @@ BaseType_t xTaskGenericNotifyWait( UBaseType_t uxIndexToWaitOn,
|
|
|
#define xTaskNotifyWaitIndexed( uxIndexToWaitOn, ulBitsToClearOnEntry, ulBitsToClearOnExit, pulNotificationValue, xTicksToWait ) \
|
|
|
xTaskGenericNotifyWait( ( uxIndexToWaitOn ), ( ulBitsToClearOnEntry ), ( ulBitsToClearOnExit ), ( pulNotificationValue ), ( xTicksToWait ) )
|
|
|
|
|
|
+/**
|
|
|
+ * task. h
|
|
|
+ * @code{c}
|
|
|
+ * BaseType_t xTaskNotifyGiveIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify );
|
|
|
+ * BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
|
|
|
+ * @endcode
|
|
|
+ *
|
|
|
+ * Sends a direct to task notification to a particular index in the target
|
|
|
+ * task's notification array in a manner similar to giving a counting semaphore.
|
|
|
+ *
|
|
|
+ * See https://www.FreeRTOS.org/RTOS-task-notifications.html for more details.
|
|
|
+ *
|
|
|
+ * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these
|
|
|
+ * macros to be available.
|
|
|
+ *
|
|
|
+ * Each task has a private array of "notification values" (or 'notifications'),
|
|
|
+ * each of which is a 32-bit unsigned integer (uint32_t). The constant
|
|
|
+ * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the
|
|
|
+ * array, and (for backward compatibility) defaults to 1 if left undefined.
|
|
|
+ * Prior to FreeRTOS V10.4.0 there was only one notification value per task.
|
|
|
+ *
|
|
|
+ * Events can be sent to a task using an intermediary object. Examples of such
|
|
|
+ * objects are queues, semaphores, mutexes and event groups. Task notifications
|
|
|
+ * are a method of sending an event directly to a task without the need for such
|
|
|
+ * an intermediary object.
|
|
|
+ *
|
|
|
+ * A notification sent to a task can optionally perform an action, such as
|
|
|
+ * update, overwrite or increment one of the task's notification values. In
|
|
|
+ * that way task notifications can be used to send data to a task, or be used as
|
|
|
+ * light weight and fast binary or counting semaphores.
|
|
|
+ *
|
|
|
+ * xTaskNotifyGiveIndexed() is a helper macro intended for use when task
|
|
|
+ * notifications are used as light weight and faster binary or counting
|
|
|
+ * semaphore equivalents. Actual FreeRTOS semaphores are given using the
|
|
|
+ * xSemaphoreGive() API function, the equivalent action that instead uses a task
|
|
|
+ * notification is xTaskNotifyGiveIndexed().
|
|
|
+ *
|
|
|
+ * When task notifications are being used as a binary or counting semaphore
|
|
|
+ * equivalent then the task being notified should wait for the notification
|
|
|
+ * using the ulTaskNotificationTakeIndexed() API function rather than the
|
|
|
+ * xTaskNotifyWaitIndexed() API function.
|
|
|
+ *
|
|
|
+ * **NOTE** Each notification within the array operates independently - a task
|
|
|
+ * can only block on one notification within the array at a time and will not be
|
|
|
+ * unblocked by a notification sent to any other array index.
|
|
|
+ *
|
|
|
+ * Backward compatibility information:
|
|
|
+ * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and
|
|
|
+ * all task notification API functions operated on that value. Replacing the
|
|
|
+ * single notification value with an array of notification values necessitated a
|
|
|
+ * new set of API functions that could address specific notifications within the
|
|
|
+ * array. xTaskNotifyGive() is the original API function, and remains backward
|
|
|
+ * compatible by always operating on the notification value at index 0 in the
|
|
|
+ * array. Calling xTaskNotifyGive() is equivalent to calling
|
|
|
+ * xTaskNotifyGiveIndexed() with the uxIndexToNotify parameter set to 0.
|
|
|
+ *
|
|
|
+ * @param xTaskToNotify The handle of the task being notified. The handle to a
|
|
|
+ * task can be returned from the xTaskCreate() API function used to create the
|
|
|
+ * task, and the handle of the currently running task can be obtained by calling
|
|
|
+ * xTaskGetCurrentTaskHandle().
|
|
|
+ *
|
|
|
+ * @param uxIndexToNotify The index within the target task's array of
|
|
|
+ * notification values to which the notification is to be sent. uxIndexToNotify
|
|
|
+ * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyGive()
|
|
|
+ * does not have this parameter and always sends notifications to index 0.
|
|
|
+ *
|
|
|
+ * @return xTaskNotifyGive() is a macro that calls xTaskNotify() with the
|
|
|
+ * eAction parameter set to eIncrement - so pdPASS is always returned.
|
|
|
+ *
|
|
|
+ * \defgroup xTaskNotifyGiveIndexed xTaskNotifyGiveIndexed
|
|
|
+ * \ingroup TaskNotifications
|
|
|
+ */
|
|
|
+#define xTaskNotifyGive( xTaskToNotify ) \
|
|
|
+ xTaskGenericNotify( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( 0 ), eIncrement, NULL )
|
|
|
+#define xTaskNotifyGiveIndexed( xTaskToNotify, uxIndexToNotify ) \
|
|
|
+ xTaskGenericNotify( ( xTaskToNotify ), ( uxIndexToNotify ), ( 0 ), eIncrement, NULL )
|
|
|
+
|
|
|
+/**
|
|
|
+ * task. h
|
|
|
+ * @code{c}
|
|
|
+ * void vTaskNotifyGiveIndexedFromISR( TaskHandle_t xTaskHandle, UBaseType_t uxIndexToNotify, BaseType_t *pxHigherPriorityTaskWoken );
|
|
|
+ * void vTaskNotifyGiveFromISR( TaskHandle_t xTaskHandle, BaseType_t *pxHigherPriorityTaskWoken );
|
|
|
+ * @endcode
|
|
|
+ *
|
|
|
+ * A version of xTaskNotifyGiveIndexed() that can be called from an interrupt
|
|
|
+ * service routine (ISR).
|
|
|
+ *
|
|
|
+ * See https://www.FreeRTOS.org/RTOS-task-notifications.html for more details.
|
|
|
+ *
|
|
|
+ * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this macro
|
|
|
+ * to be available.
|
|
|
+ *
|
|
|
+ * Each task has a private array of "notification values" (or 'notifications'),
|
|
|
+ * each of which is a 32-bit unsigned integer (uint32_t). The constant
|
|
|
+ * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the
|
|
|
+ * array, and (for backward compatibility) defaults to 1 if left undefined.
|
|
|
+ * Prior to FreeRTOS V10.4.0 there was only one notification value per task.
|
|
|
+ *
|
|
|
+ * Events can be sent to a task using an intermediary object. Examples of such
|
|
|
+ * objects are queues, semaphores, mutexes and event groups. Task notifications
|
|
|
+ * are a method of sending an event directly to a task without the need for such
|
|
|
+ * an intermediary object.
|
|
|
+ *
|
|
|
+ * A notification sent to a task can optionally perform an action, such as
|
|
|
+ * update, overwrite or increment one of the task's notification values. In
|
|
|
+ * that way task notifications can be used to send data to a task, or be used as
|
|
|
+ * light weight and fast binary or counting semaphores.
|
|
|
+ *
|
|
|
+ * vTaskNotifyGiveIndexedFromISR() is intended for use when task notifications
|
|
|
+ * are used as light weight and faster binary or counting semaphore equivalents.
|
|
|
+ * Actual FreeRTOS semaphores are given from an ISR using the
|
|
|
+ * xSemaphoreGiveFromISR() API function, the equivalent action that instead uses
|
|
|
+ * a task notification is vTaskNotifyGiveIndexedFromISR().
|
|
|
+ *
|
|
|
+ * When task notifications are being used as a binary or counting semaphore
|
|
|
+ * equivalent then the task being notified should wait for the notification
|
|
|
+ * using the ulTaskNotificationTakeIndexed() API function rather than the
|
|
|
+ * xTaskNotifyWaitIndexed() API function.
|
|
|
+ *
|
|
|
+ * **NOTE** Each notification within the array operates independently - a task
|
|
|
+ * can only block on one notification within the array at a time and will not be
|
|
|
+ * unblocked by a notification sent to any other array index.
|
|
|
+ *
|
|
|
+ * Backward compatibility information:
|
|
|
+ * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and
|
|
|
+ * all task notification API functions operated on that value. Replacing the
|
|
|
+ * single notification value with an array of notification values necessitated a
|
|
|
+ * new set of API functions that could address specific notifications within the
|
|
|
+ * array. xTaskNotifyFromISR() is the original API function, and remains
|
|
|
+ * backward compatible by always operating on the notification value at index 0
|
|
|
+ * within the array. Calling xTaskNotifyGiveFromISR() is equivalent to calling
|
|
|
+ * xTaskNotifyGiveIndexedFromISR() with the uxIndexToNotify parameter set to 0.
|
|
|
+ *
|
|
|
+ * @param xTaskToNotify The handle of the task being notified. The handle to a
|
|
|
+ * task can be returned from the xTaskCreate() API function used to create the
|
|
|
+ * task, and the handle of the currently running task can be obtained by calling
|
|
|
+ * xTaskGetCurrentTaskHandle().
|
|
|
+ *
|
|
|
+ * @param uxIndexToNotify The index within the target task's array of
|
|
|
+ * notification values to which the notification is to be sent. uxIndexToNotify
|
|
|
+ * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES.
|
|
|
+ * xTaskNotifyGiveFromISR() does not have this parameter and always sends
|
|
|
+ * notifications to index 0.
|
|
|
+ *
|
|
|
+ * @param pxHigherPriorityTaskWoken vTaskNotifyGiveFromISR() will set
|
|
|
+ * *pxHigherPriorityTaskWoken to pdTRUE if sending the notification caused the
|
|
|
+ * task to which the notification was sent to leave the Blocked state, and the
|
|
|
+ * unblocked task has a priority higher than the currently running task. If
|
|
|
+ * vTaskNotifyGiveFromISR() sets this value to pdTRUE then a context switch
|
|
|
+ * should be requested before the interrupt is exited. How a context switch is
|
|
|
+ * requested from an ISR is dependent on the port - see the documentation page
|
|
|
+ * for the port in use.
|
|
|
+ *
|
|
|
+ * \defgroup vTaskNotifyGiveIndexedFromISR vTaskNotifyGiveIndexedFromISR
|
|
|
+ * \ingroup TaskNotifications
|
|
|
+ */
|
|
|
+void vTaskGenericNotifyGiveFromISR( TaskHandle_t xTaskToNotify,
|
|
|
+ UBaseType_t uxIndexToNotify,
|
|
|
+ BaseType_t * pxHigherPriorityTaskWoken );
|
|
|
+#define vTaskNotifyGiveFromISR( xTaskToNotify, pxHigherPriorityTaskWoken ) \
|
|
|
+ vTaskGenericNotifyGiveFromISR( ( xTaskToNotify ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( pxHigherPriorityTaskWoken ) );
|
|
|
+#define vTaskNotifyGiveIndexedFromISR( xTaskToNotify, uxIndexToNotify, pxHigherPriorityTaskWoken ) \
|
|
|
+ vTaskGenericNotifyGiveFromISR( ( xTaskToNotify ), ( uxIndexToNotify ), ( pxHigherPriorityTaskWoken ) );
|
|
|
+
|
|
|
+/**
|
|
|
+ * task. h
|
|
|
+ * @code{c}
|
|
|
+ * uint32_t ulTaskNotifyTakeIndexed( UBaseType_t uxIndexToWaitOn, BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
|
|
|
+ *
|
|
|
+ * uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );
|
|
|
+ * @endcode
|
|
|
+ *
|
|
|
+ * Waits for a direct to task notification on a particular index in the calling
|
|
|
+ * task's notification array in a manner similar to taking a counting semaphore.
|
|
|
+ *
|
|
|
+ * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.
|
|
|
+ *
|
|
|
+ * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for this
|
|
|
+ * function to be available.
|
|
|
+ *
|
|
|
+ * Each task has a private array of "notification values" (or 'notifications'),
|
|
|
+ * each of which is a 32-bit unsigned integer (uint32_t). The constant
|
|
|
+ * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the
|
|
|
+ * array, and (for backward compatibility) defaults to 1 if left undefined.
|
|
|
+ * Prior to FreeRTOS V10.4.0 there was only one notification value per task.
|
|
|
+ *
|
|
|
+ * Events can be sent to a task using an intermediary object. Examples of such
|
|
|
+ * objects are queues, semaphores, mutexes and event groups. Task notifications
|
|
|
+ * are a method of sending an event directly to a task without the need for such
|
|
|
+ * an intermediary object.
|
|
|
+ *
|
|
|
+ * A notification sent to a task can optionally perform an action, such as
|
|
|
+ * update, overwrite or increment one of the task's notification values. In
|
|
|
+ * that way task notifications can be used to send data to a task, or be used as
|
|
|
+ * light weight and fast binary or counting semaphores.
|
|
|
+ *
|
|
|
+ * ulTaskNotifyTakeIndexed() is intended for use when a task notification is
|
|
|
+ * used as a faster and lighter weight binary or counting semaphore alternative.
|
|
|
+ * Actual FreeRTOS semaphores are taken using the xSemaphoreTake() API function,
|
|
|
+ * the equivalent action that instead uses a task notification is
|
|
|
+ * ulTaskNotifyTakeIndexed().
|
|
|
+ *
|
|
|
+ * When a task is using its notification value as a binary or counting semaphore
|
|
|
+ * other tasks should send notifications to it using the xTaskNotifyGiveIndexed()
|
|
|
+ * macro, or xTaskNotifyIndex() function with the eAction parameter set to
|
|
|
+ * eIncrement.
|
|
|
+ *
|
|
|
+ * ulTaskNotifyTakeIndexed() can either clear the task's notification value at
|
|
|
+ * the array index specified by the uxIndexToWaitOn parameter to zero on exit,
|
|
|
+ * in which case the notification value acts like a binary semaphore, or
|
|
|
+ * decrement the notification value on exit, in which case the notification
|
|
|
+ * value acts like a counting semaphore.
|
|
|
+ *
|
|
|
+ * A task can use ulTaskNotifyTakeIndexed() to [optionally] block to wait for
|
|
|
+ * a notification. The task does not consume any CPU time while it is in the
|
|
|
+ * Blocked state.
|
|
|
+ *
|
|
|
+ * Where as xTaskNotifyWaitIndexed() will return when a notification is pending,
|
|
|
+ * ulTaskNotifyTakeIndexed() will return when the task's notification value is
|
|
|
+ * not zero.
|
|
|
+ *
|
|
|
+ * **NOTE** Each notification within the array operates independently - a task
|
|
|
+ * can only block on one notification within the array at a time and will not be
|
|
|
+ * unblocked by a notification sent to any other array index.
|
|
|
+ *
|
|
|
+ * Backward compatibility information:
|
|
|
+ * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and
|
|
|
+ * all task notification API functions operated on that value. Replacing the
|
|
|
+ * single notification value with an array of notification values necessitated a
|
|
|
+ * new set of API functions that could address specific notifications within the
|
|
|
+ * array. ulTaskNotifyTake() is the original API function, and remains backward
|
|
|
+ * compatible by always operating on the notification value at index 0 in the
|
|
|
+ * array. Calling ulTaskNotifyTake() is equivalent to calling
|
|
|
+ * ulTaskNotifyTakeIndexed() with the uxIndexToWaitOn parameter set to 0.
|
|
|
+ *
|
|
|
+ * @param uxIndexToWaitOn The index within the calling task's array of
|
|
|
+ * notification values on which the calling task will wait for a notification to
|
|
|
+ * be non-zero. uxIndexToWaitOn must be less than
|
|
|
+ * configTASK_NOTIFICATION_ARRAY_ENTRIES. xTaskNotifyTake() does
|
|
|
+ * not have this parameter and always waits for notifications on index 0.
|
|
|
+ *
|
|
|
+ * @param xClearCountOnExit if xClearCountOnExit is pdFALSE then the task's
|
|
|
+ * notification value is decremented when the function exits. In this way the
|
|
|
+ * notification value acts like a counting semaphore. If xClearCountOnExit is
|
|
|
+ * not pdFALSE then the task's notification value is cleared to zero when the
|
|
|
+ * function exits. In this way the notification value acts like a binary
|
|
|
+ * semaphore.
|
|
|
+ *
|
|
|
+ * @param xTicksToWait The maximum amount of time that the task should wait in
|
|
|
+ * the Blocked state for the task's notification value to be greater than zero,
|
|
|
+ * should the count not already be greater than zero when
|
|
|
+ * ulTaskNotifyTake() was called. The task will not consume any processing
|
|
|
+ * time while it is in the Blocked state. This is specified in kernel ticks,
|
|
|
+ * the macro pdMS_TO_TICKS( value_in_ms ) can be used to convert a time
|
|
|
+ * specified in milliseconds to a time specified in ticks.
|
|
|
+ *
|
|
|
+ * @return The task's notification count before it is either cleared to zero or
|
|
|
+ * decremented (see the xClearCountOnExit parameter).
|
|
|
+ *
|
|
|
+ * \defgroup ulTaskNotifyTakeIndexed ulTaskNotifyTakeIndexed
|
|
|
+ * \ingroup TaskNotifications
|
|
|
+ */
|
|
|
+uint32_t ulTaskGenericNotifyTake( UBaseType_t uxIndexToWaitOn,
|
|
|
+ BaseType_t xClearCountOnExit,
|
|
|
+ TickType_t xTicksToWait );
|
|
|
+#define ulTaskNotifyTake( xClearCountOnExit, xTicksToWait ) \
|
|
|
+ ulTaskGenericNotifyTake( ( tskDEFAULT_INDEX_TO_NOTIFY ), ( xClearCountOnExit ), ( xTicksToWait ) )
|
|
|
+#define ulTaskNotifyTakeIndexed( uxIndexToWaitOn, xClearCountOnExit, xTicksToWait ) \
|
|
|
+ ulTaskGenericNotifyTake( ( uxIndexToWaitOn ), ( xClearCountOnExit ), ( xTicksToWait ) )
|
|
|
+
|
|
|
+/**
|
|
|
+ * task. h
|
|
|
+ * @code{c}
|
|
|
+ * BaseType_t xTaskNotifyStateClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToCLear );
|
|
|
+ *
|
|
|
+ * BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );
|
|
|
+ * @endcode
|
|
|
+ *
|
|
|
+ * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.
|
|
|
+ *
|
|
|
+ * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these
|
|
|
+ * functions to be available.
|
|
|
+ *
|
|
|
+ * Each task has a private array of "notification values" (or 'notifications'),
|
|
|
+ * each of which is a 32-bit unsigned integer (uint32_t). The constant
|
|
|
+ * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the
|
|
|
+ * array, and (for backward compatibility) defaults to 1 if left undefined.
|
|
|
+ * Prior to FreeRTOS V10.4.0 there was only one notification value per task.
|
|
|
+ *
|
|
|
+ * If a notification is sent to an index within the array of notifications then
|
|
|
+ * the notification at that index is said to be 'pending' until it is read or
|
|
|
+ * explicitly cleared by the receiving task. xTaskNotifyStateClearIndexed()
|
|
|
+ * is the function that clears a pending notification without reading the
|
|
|
+ * notification value. The notification value at the same array index is not
|
|
|
+ * altered. Set xTask to NULL to clear the notification state of the calling
|
|
|
+ * task.
|
|
|
+ *
|
|
|
+ * Backward compatibility information:
|
|
|
+ * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and
|
|
|
+ * all task notification API functions operated on that value. Replacing the
|
|
|
+ * single notification value with an array of notification values necessitated a
|
|
|
+ * new set of API functions that could address specific notifications within the
|
|
|
+ * array. xTaskNotifyStateClear() is the original API function, and remains
|
|
|
+ * backward compatible by always operating on the notification value at index 0
|
|
|
+ * within the array. Calling xTaskNotifyStateClear() is equivalent to calling
|
|
|
+ * xTaskNotifyStateClearIndexed() with the uxIndexToNotify parameter set to 0.
|
|
|
+ *
|
|
|
+ * @param xTask The handle of the RTOS task that will have a notification state
|
|
|
+ * cleared. Set xTask to NULL to clear a notification state in the calling
|
|
|
+ * task. To obtain a task's handle create the task using xTaskCreate() and
|
|
|
+ * make use of the pxCreatedTask parameter, or create the task using
|
|
|
+ * xTaskCreateStatic() and store the returned value, or use the task's name in
|
|
|
+ * a call to xTaskGetHandle().
|
|
|
+ *
|
|
|
+ * @param uxIndexToClear The index within the target task's array of
|
|
|
+ * notification values to act upon. For example, setting uxIndexToClear to 1
|
|
|
+ * will clear the state of the notification at index 1 within the array.
|
|
|
+ * uxIndexToClear must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES.
|
|
|
+ * ulTaskNotifyStateClear() does not have this parameter and always acts on the
|
|
|
+ * notification at index 0.
|
|
|
+ *
|
|
|
+ * @return pdTRUE if the task's notification state was set to
|
|
|
+ * eNotWaitingNotification, otherwise pdFALSE.
|
|
|
+ *
|
|
|
+ * \defgroup xTaskNotifyStateClearIndexed xTaskNotifyStateClearIndexed
|
|
|
+ * \ingroup TaskNotifications
|
|
|
+ */
|
|
|
+BaseType_t xTaskGenericNotifyStateClear( TaskHandle_t xTask,
|
|
|
+ UBaseType_t uxIndexToClear );
|
|
|
+#define xTaskNotifyStateClear( xTask ) \
|
|
|
+ xTaskGenericNotifyStateClear( ( xTask ), ( tskDEFAULT_INDEX_TO_NOTIFY ) )
|
|
|
+#define xTaskNotifyStateClearIndexed( xTask, uxIndexToClear ) \
|
|
|
+ xTaskGenericNotifyStateClear( ( xTask ), ( uxIndexToClear ) )
|
|
|
+
|
|
|
+/**
|
|
|
+ * task. h
|
|
|
+ * @code{c}
|
|
|
+ * uint32_t ulTaskNotifyValueClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToClear, uint32_t ulBitsToClear );
|
|
|
+ *
|
|
|
+ * uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear );
|
|
|
+ * @endcode
|
|
|
+ *
|
|
|
+ * See https://www.FreeRTOS.org/RTOS-task-notifications.html for details.
|
|
|
+ *
|
|
|
+ * configUSE_TASK_NOTIFICATIONS must be undefined or defined as 1 for these
|
|
|
+ * functions to be available.
|
|
|
+ *
|
|
|
+ * Each task has a private array of "notification values" (or 'notifications'),
|
|
|
+ * each of which is a 32-bit unsigned integer (uint32_t). The constant
|
|
|
+ * configTASK_NOTIFICATION_ARRAY_ENTRIES sets the number of indexes in the
|
|
|
+ * array, and (for backward compatibility) defaults to 1 if left undefined.
|
|
|
+ * Prior to FreeRTOS V10.4.0 there was only one notification value per task.
|
|
|
+ *
|
|
|
+ * ulTaskNotifyValueClearIndexed() clears the bits specified by the
|
|
|
+ * ulBitsToClear bit mask in the notification value at array index uxIndexToClear
|
|
|
+ * of the task referenced by xTask.
|
|
|
+ *
|
|
|
+ * Backward compatibility information:
|
|
|
+ * Prior to FreeRTOS V10.4.0 each task had a single "notification value", and
|
|
|
+ * all task notification API functions operated on that value. Replacing the
|
|
|
+ * single notification value with an array of notification values necessitated a
|
|
|
+ * new set of API functions that could address specific notifications within the
|
|
|
+ * array. ulTaskNotifyValueClear() is the original API function, and remains
|
|
|
+ * backward compatible by always operating on the notification value at index 0
|
|
|
+ * within the array. Calling ulTaskNotifyValueClear() is equivalent to calling
|
|
|
+ * ulTaskNotifyValueClearIndexed() with the uxIndexToClear parameter set to 0.
|
|
|
+ *
|
|
|
+ * @param xTask The handle of the RTOS task that will have bits in one of its
|
|
|
+ * notification values cleared. Set xTask to NULL to clear bits in a
|
|
|
+ * notification value of the calling task. To obtain a task's handle create the
|
|
|
+ * task using xTaskCreate() and make use of the pxCreatedTask parameter, or
|
|
|
+ * create the task using xTaskCreateStatic() and store the returned value, or
|
|
|
+ * use the task's name in a call to xTaskGetHandle().
|
|
|
+ *
|
|
|
+ * @param uxIndexToClear The index within the target task's array of
|
|
|
+ * notification values in which to clear the bits. uxIndexToClear
|
|
|
+ * must be less than configTASK_NOTIFICATION_ARRAY_ENTRIES.
|
|
|
+ * ulTaskNotifyValueClear() does not have this parameter and always clears bits
|
|
|
+ * in the notification value at index 0.
|
|
|
+ *
|
|
|
+ * @param ulBitsToClear Bit mask of the bits to clear in the notification value of
|
|
|
+ * xTask. Set a bit to 1 to clear the corresponding bits in the task's notification
|
|
|
+ * value. Set ulBitsToClear to 0xffffffff (UINT_MAX on 32-bit architectures) to clear
|
|
|
+ * the notification value to 0. Set ulBitsToClear to 0 to query the task's
|
|
|
+ * notification value without clearing any bits.
|
|
|
+ *
|
|
|
+ *
|
|
|
+ * @return The value of the target task's notification value before the bits
|
|
|
+ * specified by ulBitsToClear were cleared.
|
|
|
+ * \defgroup ulTaskNotifyValueClear ulTaskNotifyValueClear
|
|
|
+ * \ingroup TaskNotifications
|
|
|
+ */
|
|
|
+uint32_t ulTaskGenericNotifyValueClear( TaskHandle_t xTask,
|
|
|
+ UBaseType_t uxIndexToClear,
|
|
|
+ uint32_t ulBitsToClear );
|
|
|
+#define ulTaskNotifyValueClear( xTask, ulBitsToClear ) \
|
|
|
+ ulTaskGenericNotifyValueClear( ( xTask ), ( tskDEFAULT_INDEX_TO_NOTIFY ), ( ulBitsToClear ) )
|
|
|
+#define ulTaskNotifyValueClearIndexed( xTask, uxIndexToClear, ulBitsToClear ) \
|
|
|
+ ulTaskGenericNotifyValueClear( ( xTask ), ( uxIndexToClear ), ( ulBitsToClear ) )
|
|
|
+
|
|
|
/*
|
|
|
* Return the handle of the calling task.
|
|
|
*/
|