|
@@ -18,6 +18,12 @@
|
|
|
#include "sdkconfig.h"
|
|
#include "sdkconfig.h"
|
|
|
#include "freertos/FreeRTOS.h"
|
|
#include "freertos/FreeRTOS.h"
|
|
|
#include "freertos/task.h"
|
|
#include "freertos/task.h"
|
|
|
|
|
+#include "freertos/queue.h"
|
|
|
|
|
+#include "freertos/semphr.h"
|
|
|
|
|
+#include "freertos/stream_buffer.h"
|
|
|
|
|
+#include "freertos/message_buffer.h"
|
|
|
|
|
+#include "freertos/event_groups.h"
|
|
|
|
|
+#include "esp_heap_caps.h"
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
#ifdef __cplusplus
|
|
|
extern "C" {
|
|
extern "C" {
|
|
@@ -28,9 +34,11 @@
|
|
|
*
|
|
*
|
|
|
* Todo: Move IDF FreeRTOS SMP related additions to this header as well (see
|
|
* Todo: Move IDF FreeRTOS SMP related additions to this header as well (see
|
|
|
* IDF-7201)
|
|
* IDF-7201)
|
|
|
|
|
+ * Todo: Add these SMP related additions to docs once they are combined with
|
|
|
|
|
+ * IDF FreeRTOS.
|
|
|
* -------------------------------------------------------------------------- */
|
|
* -------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
-#if CONFIG_FREERTOS_SMP || __DOXYGEN__
|
|
|
|
|
|
|
+#if CONFIG_FREERTOS_SMP
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
|
* @brief Create a new task that is pinned to a particular core
|
|
* @brief Create a new task that is pinned to a particular core
|
|
@@ -133,16 +141,18 @@
|
|
|
*/
|
|
*/
|
|
|
BaseType_t xTaskGetAffinity( TaskHandle_t xTask );
|
|
BaseType_t xTaskGetAffinity( TaskHandle_t xTask );
|
|
|
|
|
|
|
|
-#endif // CONFIG_FREERTOS_SMP || __DOXYGEN__
|
|
|
|
|
|
|
+#endif // CONFIG_FREERTOS_SMP
|
|
|
|
|
|
|
|
/* -----------------------------------------------------------------------------
|
|
/* -----------------------------------------------------------------------------
|
|
|
* TLSP Deletion Callback related API additions
|
|
* TLSP Deletion Callback related API additions
|
|
|
*
|
|
*
|
|
|
* Todo: Move IDF FreeRTOS TLSP Deletion Callback related additions to this
|
|
* Todo: Move IDF FreeRTOS TLSP Deletion Callback related additions to this
|
|
|
* header as well (see IDF-7201)
|
|
* header as well (see IDF-7201)
|
|
|
|
|
+ * Todo: Add these SMP related additions to docs once they are combined with
|
|
|
|
|
+ * IDF FreeRTOS.
|
|
|
* -------------------------------------------------------------------------- */
|
|
* -------------------------------------------------------------------------- */
|
|
|
|
|
|
|
|
-#if CONFIG_FREERTOS_SMP || __DOXYGEN__
|
|
|
|
|
|
|
+#if CONFIG_FREERTOS_SMP
|
|
|
|
|
|
|
|
#if ( CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS )
|
|
#if ( CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS )
|
|
|
|
|
|
|
@@ -180,7 +190,244 @@
|
|
|
TlsDeleteCallbackFunction_t pvDelCallback );
|
|
TlsDeleteCallbackFunction_t pvDelCallback );
|
|
|
#endif // CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS
|
|
#endif // CONFIG_FREERTOS_TLSP_DELETION_CALLBACKS
|
|
|
|
|
|
|
|
-#endif // CONFIG_FREERTOS_SMP || __DOXYGEN__
|
|
|
|
|
|
|
+#endif // CONFIG_FREERTOS_SMP
|
|
|
|
|
+
|
|
|
|
|
+/* -----------------------------------------------------------------------------
|
|
|
|
|
+ * Creation With Memory Caps
|
|
|
|
|
+ *
|
|
|
|
|
+ * Helper functions to create various FreeRTOS objects (e.g., queues,
|
|
|
|
|
+ * semaphores) with specific memory capabilities (e.g., MALLOC_CAP_INTERNAL).
|
|
|
|
|
+ * -------------------------------------------------------------------------- */
|
|
|
|
|
+
|
|
|
|
|
+#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
|
|
|
|
+
|
|
|
|
|
+/* ---------------------- Queue ------------------------- */
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Creates a queue with specific memory capabilities
|
|
|
|
|
+ *
|
|
|
|
|
+ * This function is similar to xQueueCreate(), except that it allows the memory
|
|
|
|
|
+ * allocated for the queue to have specific capabilities (e.g.,
|
|
|
|
|
+ * MALLOC_CAP_INTERNAL).
|
|
|
|
|
+ *
|
|
|
|
|
+ * @note A queue created using this function must only be deleted using
|
|
|
|
|
+ * vQueueDeleteWithCaps()
|
|
|
|
|
+ * @param uxQueueLength The maximum number of items that the queue can contain.
|
|
|
|
|
+ * @param uxItemSize The number of bytes each item in the queue will require.
|
|
|
|
|
+ * @param uxMemoryCaps Memory capabilities of the queue's memory (see
|
|
|
|
|
+ * esp_heap_caps.h)
|
|
|
|
|
+ * @return Handle to the created queue or NULL on failure.
|
|
|
|
|
+ */
|
|
|
|
|
+ QueueHandle_t xQueueCreateWithCaps( UBaseType_t uxQueueLength,
|
|
|
|
|
+ UBaseType_t uxItemSize,
|
|
|
|
|
+ UBaseType_t uxMemoryCaps );
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Deletes a queue previously created using xQueueCreateWithCaps()
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param xQueue A handle to the queue to be deleted.
|
|
|
|
|
+ */
|
|
|
|
|
+ void vQueueDeleteWithCaps( QueueHandle_t xQueue );
|
|
|
|
|
+
|
|
|
|
|
+/* -------------------- Semaphore ----------------------- */
|
|
|
|
|
+
|
|
|
|
|
+/** @cond */ /* Doxygen command to hide this from docs */
|
|
|
|
|
+ SemaphoreHandle_t xSemaphoreCreateGenericWithCaps( UBaseType_t uxMaxCount,
|
|
|
|
|
+ UBaseType_t uxInitialCount,
|
|
|
|
|
+ const uint8_t ucQueueType,
|
|
|
|
|
+ UBaseType_t uxMemoryCaps );
|
|
|
|
|
+/** @endcond */
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Creates a binary semaphore with specific memory capabilities
|
|
|
|
|
+ *
|
|
|
|
|
+ * This function is similar to vSemaphoreCreateBinary(), except that it allows
|
|
|
|
|
+ * the memory allocated for the binary semaphore to have specific capabilities
|
|
|
|
|
+ * (e.g., MALLOC_CAP_INTERNAL).
|
|
|
|
|
+ *
|
|
|
|
|
+ * @note A binary semaphore created using this function must only be deleted
|
|
|
|
|
+ * using vSemaphoreDeleteWithCaps()
|
|
|
|
|
+ * @param uxMemoryCaps Memory capabilities of the binary semaphore's memory (see
|
|
|
|
|
+ * esp_heap_caps.h)
|
|
|
|
|
+ * @return Handle to the created binary semaphore or NULL on failure.
|
|
|
|
|
+ */
|
|
|
|
|
+ static inline SemaphoreHandle_t xSemaphoreCreateBinaryWithCaps( UBaseType_t uxMemoryCaps )
|
|
|
|
|
+ {
|
|
|
|
|
+ return xSemaphoreCreateGenericWithCaps( 0, 0, queueQUEUE_TYPE_BINARY_SEMAPHORE, uxMemoryCaps );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Creates a counting semaphore with specific memory capabilities
|
|
|
|
|
+ *
|
|
|
|
|
+ * This function is similar to xSemaphoreCreateCounting(), except that it allows
|
|
|
|
|
+ * the memory allocated for the counting semaphore to have specific capabilities
|
|
|
|
|
+ * (e.g., MALLOC_CAP_INTERNAL).
|
|
|
|
|
+ *
|
|
|
|
|
+ * @note A counting semaphore created using this function must only be deleted
|
|
|
|
|
+ * using vSemaphoreDeleteWithCaps()
|
|
|
|
|
+ * @param uxMaxCount The maximum count value that can be reached.
|
|
|
|
|
+ * @param uxInitialCount The count value assigned to the semaphore when it is
|
|
|
|
|
+ * created.
|
|
|
|
|
+ * @param uxMemoryCaps Memory capabilities of the counting semaphore's memory
|
|
|
|
|
+ * (see esp_heap_caps.h)
|
|
|
|
|
+ * @return Handle to the created counting semaphore or NULL on failure.
|
|
|
|
|
+ */
|
|
|
|
|
+ static inline SemaphoreHandle_t xSemaphoreCreateCountingWithCaps( UBaseType_t uxMaxCount,
|
|
|
|
|
+ UBaseType_t uxInitialCount,
|
|
|
|
|
+ UBaseType_t uxMemoryCaps )
|
|
|
|
|
+ {
|
|
|
|
|
+ return xSemaphoreCreateGenericWithCaps( uxMaxCount, uxInitialCount, queueQUEUE_TYPE_COUNTING_SEMAPHORE, uxMemoryCaps );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Creates a mutex semaphore with specific memory capabilities
|
|
|
|
|
+ *
|
|
|
|
|
+ * This function is similar to xSemaphoreCreateMutex(), except that it allows
|
|
|
|
|
+ * the memory allocated for the mutex semaphore to have specific capabilities
|
|
|
|
|
+ * (e.g., MALLOC_CAP_INTERNAL).
|
|
|
|
|
+ *
|
|
|
|
|
+ * @note A mutex semaphore created using this function must only be deleted
|
|
|
|
|
+ * using vSemaphoreDeleteWithCaps()
|
|
|
|
|
+ * @param uxMemoryCaps Memory capabilities of the mutex semaphore's memory (see
|
|
|
|
|
+ * esp_heap_caps.h)
|
|
|
|
|
+ * @return Handle to the created mutex semaphore or NULL on failure.
|
|
|
|
|
+ */
|
|
|
|
|
+ static inline SemaphoreHandle_t xSemaphoreCreateMutexWithCaps( UBaseType_t uxMemoryCaps )
|
|
|
|
|
+ {
|
|
|
|
|
+ return xSemaphoreCreateGenericWithCaps( 0, 0, queueQUEUE_TYPE_MUTEX, uxMemoryCaps );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Creates a recursive mutex with specific memory capabilities
|
|
|
|
|
+ *
|
|
|
|
|
+ * This function is similar to xSemaphoreCreateRecursiveMutex(), except that it
|
|
|
|
|
+ * allows the memory allocated for the recursive mutex to have specific
|
|
|
|
|
+ * capabilities (e.g., MALLOC_CAP_INTERNAL).
|
|
|
|
|
+ *
|
|
|
|
|
+ * @note A recursive mutex created using this function must only be deleted
|
|
|
|
|
+ * using vSemaphoreDeleteWithCaps()
|
|
|
|
|
+ * @param uxMemoryCaps Memory capabilities of the recursive mutex's memory (see
|
|
|
|
|
+ * esp_heap_caps.h)
|
|
|
|
|
+ * @return Handle to the created recursive mutex or NULL on failure.
|
|
|
|
|
+ */
|
|
|
|
|
+ static inline SemaphoreHandle_t xSemaphoreCreateRecursiveMutexWithCaps( UBaseType_t uxMemoryCaps )
|
|
|
|
|
+ {
|
|
|
|
|
+ return xSemaphoreCreateGenericWithCaps( 0, 0, queueQUEUE_TYPE_RECURSIVE_MUTEX, uxMemoryCaps );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Deletes a semaphore previously created using one of the
|
|
|
|
|
+ * xSemaphoreCreate...WithCaps() functions
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param xSemaphore A handle to the semaphore to be deleted.
|
|
|
|
|
+ */
|
|
|
|
|
+ void vSemaphoreDeleteWithCaps( SemaphoreHandle_t xSemaphore );
|
|
|
|
|
+
|
|
|
|
|
+/* ------------ Stream & Message Buffers ---------------- */
|
|
|
|
|
+
|
|
|
|
|
+/** @cond */ /* Doxygen command to hide this from docs */
|
|
|
|
|
+ StreamBufferHandle_t xStreamBufferGenericCreateWithCaps( size_t xBufferSizeBytes,
|
|
|
|
|
+ size_t xTriggerLevelBytes,
|
|
|
|
|
+ BaseType_t xIsMessageBuffer,
|
|
|
|
|
+ UBaseType_t uxMemoryCaps );
|
|
|
|
|
+
|
|
|
|
|
+ void vStreamBufferGenericDeleteWithCaps( StreamBufferHandle_t xStreamBuffer,
|
|
|
|
|
+ BaseType_t xIsMessageBuffer );
|
|
|
|
|
+/** @endcond */
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Creates a stream buffer with specific memory capabilities
|
|
|
|
|
+ *
|
|
|
|
|
+ * This function is similar to xStreamBufferCreate(), except that it allows the
|
|
|
|
|
+ * memory allocated for the stream buffer to have specific capabilities (e.g.,
|
|
|
|
|
+ * MALLOC_CAP_INTERNAL).
|
|
|
|
|
+ *
|
|
|
|
|
+ * @note A stream buffer created using this function must only be deleted using
|
|
|
|
|
+ * vStreamBufferDeleteWithCaps()
|
|
|
|
|
+ * @param xBufferSizeBytes The total number of bytes the stream buffer will be
|
|
|
|
|
+ * able to hold at any one time.
|
|
|
|
|
+ * @param xTriggerLevelBytes The number of bytes that must be in the stream
|
|
|
|
|
+ * buffer before unblocking
|
|
|
|
|
+ * @param uxMemoryCaps Memory capabilities of the stream buffer's memory (see
|
|
|
|
|
+ * esp_heap_caps.h)
|
|
|
|
|
+ * @return Handle to the created stream buffer or NULL on failure.
|
|
|
|
|
+ */
|
|
|
|
|
+ static inline StreamBufferHandle_t xStreamBufferCreateWithCaps( size_t xBufferSizeBytes,
|
|
|
|
|
+ size_t xTriggerLevelBytes,
|
|
|
|
|
+ UBaseType_t uxMemoryCaps )
|
|
|
|
|
+ {
|
|
|
|
|
+ return xStreamBufferGenericCreateWithCaps( xBufferSizeBytes, xTriggerLevelBytes, pdFALSE, uxMemoryCaps );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Deletes a stream buffer previously created using
|
|
|
|
|
+ * xStreamBufferCreateWithCaps()
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param xStreamBuffer A handle to the stream buffer to be deleted.
|
|
|
|
|
+ */
|
|
|
|
|
+ static inline void vStreamBufferDeleteWithCaps( StreamBufferHandle_t xStreamBuffer )
|
|
|
|
|
+ {
|
|
|
|
|
+ vStreamBufferGenericDeleteWithCaps( xStreamBuffer, pdFALSE );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Creates a message buffer with specific memory capabilities
|
|
|
|
|
+ *
|
|
|
|
|
+ * This function is similar to xMessageBufferCreate(), except that it allows the
|
|
|
|
|
+ * memory allocated for the message buffer to have specific capabilities (e.g.,
|
|
|
|
|
+ * MALLOC_CAP_INTERNAL).
|
|
|
|
|
+ *
|
|
|
|
|
+ * @note A message buffer created using this function must only be deleted using
|
|
|
|
|
+ * vMessageBufferDeleteWithCaps()
|
|
|
|
|
+ * @param xBufferSizeBytes The total number of bytes (not messages) the message
|
|
|
|
|
+ * buffer will be able to hold at any one time.
|
|
|
|
|
+ * @param uxMemoryCaps Memory capabilities of the message buffer's memory (see
|
|
|
|
|
+ * esp_heap_caps.h)
|
|
|
|
|
+ * @return Handle to the created message buffer or NULL on failure.
|
|
|
|
|
+ */
|
|
|
|
|
+ static inline MessageBufferHandle_t xMessageBufferCreateWithCaps( size_t xBufferSizeBytes,
|
|
|
|
|
+ UBaseType_t uxMemoryCaps )
|
|
|
|
|
+ {
|
|
|
|
|
+ return ( MessageBufferHandle_t ) xStreamBufferGenericCreateWithCaps( xBufferSizeBytes, ( size_t ) 0, pdTRUE, uxMemoryCaps );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Deletes a stream buffer previously created using
|
|
|
|
|
+ * xMessageBufferCreateWithCaps()
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param xMessageBuffer A handle to the message buffer to be deleted.
|
|
|
|
|
+ */
|
|
|
|
|
+ static inline void vMessageBufferDeleteWithCaps( MessageBufferHandle_t xMessageBuffer )
|
|
|
|
|
+ {
|
|
|
|
|
+ vStreamBufferGenericDeleteWithCaps( ( StreamBufferHandle_t ) xMessageBuffer, pdTRUE );
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+/* ------------------ Event Groups ---------------------- */
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Creates an event group with specific memory capabilities
|
|
|
|
|
+ *
|
|
|
|
|
+ * This function is similar to xEventGroupCreate(), except that it allows the
|
|
|
|
|
+ * memory allocated for the event group to have specific capabilities (e.g.,
|
|
|
|
|
+ * MALLOC_CAP_INTERNAL).
|
|
|
|
|
+ *
|
|
|
|
|
+ * @note An event group created using this function must only be deleted using
|
|
|
|
|
+ * vEventGroupDeleteWithCaps()
|
|
|
|
|
+ * @param uxMemoryCaps Memory capabilities of the event group's memory (see
|
|
|
|
|
+ * esp_heap_caps.h)
|
|
|
|
|
+ * @return Handle to the created event group or NULL on failure.
|
|
|
|
|
+ */
|
|
|
|
|
+ EventGroupHandle_t xEventGroupCreateWithCaps( UBaseType_t uxMemoryCaps );
|
|
|
|
|
+
|
|
|
|
|
+/**
|
|
|
|
|
+ * @brief Deletes an event group previously created using
|
|
|
|
|
+ * xEventGroupCreateWithCaps()
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param xEventGroup A handle to the event group to be deleted.
|
|
|
|
|
+ */
|
|
|
|
|
+ void vEventGroupDeleteWithCaps( EventGroupHandle_t xEventGroup );
|
|
|
|
|
+
|
|
|
|
|
+#endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
|
|
|
|
|
|
|
|
#ifdef __cplusplus
|
|
#ifdef __cplusplus
|
|
|
}
|
|
}
|