mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
freertos: Add wrapper functions to create objects with capabilities
This commit adds various ...WithCaps() functions to create FreeRTOS objects with specific memory capabilities.
This commit is contained in:
parent
478e041ce5
commit
4e7cd2e706
@ -22,6 +22,7 @@ endif()
|
|||||||
|
|
||||||
set(srcs
|
set(srcs
|
||||||
"heap_idf.c"
|
"heap_idf.c"
|
||||||
|
"esp_additions/idf_additions.c"
|
||||||
"${kernel_dir}/list.c"
|
"${kernel_dir}/list.c"
|
||||||
"${kernel_dir}/queue.c"
|
"${kernel_dir}/queue.c"
|
||||||
"${kernel_dir}/tasks.c"
|
"${kernel_dir}/tasks.c"
|
||||||
|
275
components/freertos/esp_additions/idf_additions.c
Normal file
275
components/freertos/esp_additions/idf_additions.c
Normal file
@ -0,0 +1,275 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "sdkconfig.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
#include "freertos/FreeRTOS.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 "freertos/timers.h"
|
||||||
|
#include "freertos/idf_additions.h"
|
||||||
|
#include "esp_heap_caps.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file contains the implementation for some the functions in
|
||||||
|
* idf_additions.h
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* -----------------------------------------------------------------------------
|
||||||
|
* Creation With Memory Caps
|
||||||
|
* -------------------------------------------------------------------------- */
|
||||||
|
|
||||||
|
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
|
||||||
|
|
||||||
|
/* ---------------------------------- Queue --------------------------------- */
|
||||||
|
|
||||||
|
QueueHandle_t xQueueCreateWithCaps( UBaseType_t uxQueueLength,
|
||||||
|
UBaseType_t uxItemSize,
|
||||||
|
UBaseType_t uxMemoryCaps )
|
||||||
|
{
|
||||||
|
QueueHandle_t xQueue;
|
||||||
|
StaticQueue_t * pxQueueBuffer;
|
||||||
|
uint8_t * pucQueueStorageBuffer;
|
||||||
|
|
||||||
|
/* Allocate memory for the queue using the provided memory caps */
|
||||||
|
pxQueueBuffer = heap_caps_malloc( sizeof( StaticQueue_t ), ( uint32_t ) uxMemoryCaps );
|
||||||
|
|
||||||
|
if( uxItemSize == 0 )
|
||||||
|
{
|
||||||
|
pucQueueStorageBuffer = NULL;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pucQueueStorageBuffer = heap_caps_malloc( uxQueueLength * uxItemSize, ( uint32_t ) uxMemoryCaps );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( ( pxQueueBuffer == NULL ) || ( ( uxItemSize > 0 ) && ( pucQueueStorageBuffer == NULL ) ) )
|
||||||
|
{
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the queue using static creation API */
|
||||||
|
xQueue = xQueueCreateStatic( uxQueueLength, uxItemSize, pucQueueStorageBuffer, pxQueueBuffer );
|
||||||
|
|
||||||
|
if( xQueue == NULL )
|
||||||
|
{
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return xQueue;
|
||||||
|
|
||||||
|
err:
|
||||||
|
heap_caps_free( pucQueueStorageBuffer );
|
||||||
|
heap_caps_free( pxQueueBuffer );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vQueueDeleteWithCaps( QueueHandle_t xQueue )
|
||||||
|
{
|
||||||
|
BaseType_t xResult;
|
||||||
|
StaticQueue_t * pxQueueBuffer;
|
||||||
|
uint8_t * pucQueueStorageBuffer;
|
||||||
|
|
||||||
|
/* Retrieve the buffers used to create the queue before deleting it */
|
||||||
|
xResult = xQueueGetStaticBuffers( xQueue, &pucQueueStorageBuffer, &pxQueueBuffer );
|
||||||
|
configASSERT( xResult == pdTRUE );
|
||||||
|
|
||||||
|
/* Delete the queue */
|
||||||
|
vQueueDelete( xQueue );
|
||||||
|
|
||||||
|
/* Free the memory buffers */
|
||||||
|
heap_caps_free( pxQueueBuffer );
|
||||||
|
heap_caps_free( pucQueueStorageBuffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* -------------------------------- Semaphore ------------------------------- */
|
||||||
|
|
||||||
|
SemaphoreHandle_t xSemaphoreCreateGenericWithCaps( UBaseType_t uxMaxCount,
|
||||||
|
UBaseType_t uxInitialCount,
|
||||||
|
const uint8_t ucQueueType,
|
||||||
|
UBaseType_t uxMemoryCaps )
|
||||||
|
{
|
||||||
|
SemaphoreHandle_t xSemaphore;
|
||||||
|
StaticSemaphore_t * pxSemaphoreBuffer;
|
||||||
|
|
||||||
|
/* Allocate memory for the semaphore using the provided memory caps */
|
||||||
|
pxSemaphoreBuffer = heap_caps_malloc( sizeof( StaticSemaphore_t ), ( uint32_t ) uxMemoryCaps );
|
||||||
|
|
||||||
|
if( pxSemaphoreBuffer == NULL )
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the semaphore using static creation API */
|
||||||
|
if( ucQueueType == queueQUEUE_TYPE_MUTEX )
|
||||||
|
{
|
||||||
|
xSemaphore = xSemaphoreCreateMutexStatic( pxSemaphoreBuffer );
|
||||||
|
}
|
||||||
|
else if( ucQueueType == queueQUEUE_TYPE_COUNTING_SEMAPHORE )
|
||||||
|
{
|
||||||
|
xSemaphore = xSemaphoreCreateCountingStatic( uxMaxCount, uxInitialCount, pxSemaphoreBuffer );
|
||||||
|
}
|
||||||
|
else if( ucQueueType == queueQUEUE_TYPE_BINARY_SEMAPHORE )
|
||||||
|
{
|
||||||
|
xSemaphore = xSemaphoreCreateBinaryStatic( pxSemaphoreBuffer );
|
||||||
|
}
|
||||||
|
else /* ucQueueType == queueQUEUE_TYPE_RECURSIVE_MUTEX */
|
||||||
|
{
|
||||||
|
xSemaphore = xSemaphoreCreateRecursiveMutexStatic( pxSemaphoreBuffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( xSemaphore == NULL )
|
||||||
|
{
|
||||||
|
heap_caps_free( pxSemaphoreBuffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
return xSemaphore;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vSemaphoreDeleteWithCaps( SemaphoreHandle_t xSemaphore )
|
||||||
|
{
|
||||||
|
BaseType_t xResult;
|
||||||
|
StaticSemaphore_t * pxSemaphoreBuffer;
|
||||||
|
|
||||||
|
/* Retrieve the buffer used to create the semaphore before deleting it
|
||||||
|
* */
|
||||||
|
xResult = xSemaphoreGetStaticBuffer( xSemaphore, &pxSemaphoreBuffer );
|
||||||
|
configASSERT( xResult == pdTRUE );
|
||||||
|
|
||||||
|
/* Delete the semaphore */
|
||||||
|
vSemaphoreDelete( xSemaphore );
|
||||||
|
|
||||||
|
/* Free the memory buffer */
|
||||||
|
heap_caps_free( pxSemaphoreBuffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------- Stream & Message Buffers ----------------------- */
|
||||||
|
|
||||||
|
StreamBufferHandle_t xStreamBufferGenericCreateWithCaps( size_t xBufferSizeBytes,
|
||||||
|
size_t xTriggerLevelBytes,
|
||||||
|
BaseType_t xIsMessageBuffer,
|
||||||
|
UBaseType_t uxMemoryCaps )
|
||||||
|
{
|
||||||
|
StreamBufferHandle_t xStreamBuffer;
|
||||||
|
StaticStreamBuffer_t * pxStaticStreamBuffer;
|
||||||
|
uint8_t * pucStreamBufferStorageArea;
|
||||||
|
|
||||||
|
/* Allocate memory for the stream or message buffer using the provided
|
||||||
|
* memory caps */
|
||||||
|
pxStaticStreamBuffer = heap_caps_malloc( sizeof( StaticStreamBuffer_t ), ( uint32_t ) uxMemoryCaps );
|
||||||
|
pucStreamBufferStorageArea = heap_caps_malloc( xBufferSizeBytes, ( uint32_t ) uxMemoryCaps );
|
||||||
|
|
||||||
|
if( ( pxStaticStreamBuffer == NULL ) || ( pucStreamBufferStorageArea == NULL ) )
|
||||||
|
{
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the stream or message buffer using static creation API */
|
||||||
|
if( xIsMessageBuffer == pdTRUE )
|
||||||
|
{
|
||||||
|
xStreamBuffer = ( StreamBufferHandle_t ) xMessageBufferCreateStatic( xBufferSizeBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xStreamBuffer = xStreamBufferCreateStatic( xBufferSizeBytes, xTriggerLevelBytes, pucStreamBufferStorageArea, pxStaticStreamBuffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
if( xStreamBuffer == NULL )
|
||||||
|
{
|
||||||
|
goto err;
|
||||||
|
}
|
||||||
|
|
||||||
|
return xStreamBuffer;
|
||||||
|
|
||||||
|
err:
|
||||||
|
heap_caps_free( pucStreamBufferStorageArea );
|
||||||
|
heap_caps_free( pxStaticStreamBuffer );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vStreamBufferGenericDeleteWithCaps( StreamBufferHandle_t xStreamBuffer,
|
||||||
|
BaseType_t xIsMessageBuffer )
|
||||||
|
{
|
||||||
|
BaseType_t xResult;
|
||||||
|
StaticStreamBuffer_t * pxStaticStreamBuffer;
|
||||||
|
uint8_t * pucStreamBufferStorageArea;
|
||||||
|
|
||||||
|
/* Retrieve the buffers used to create the stream or message buffer
|
||||||
|
* before deleting it */
|
||||||
|
if( xIsMessageBuffer == pdTRUE )
|
||||||
|
{
|
||||||
|
xResult = xMessageBufferGetStaticBuffers( xStreamBuffer, &pucStreamBufferStorageArea, &pxStaticStreamBuffer );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
xResult = xStreamBufferGetStaticBuffers( xStreamBuffer, &pucStreamBufferStorageArea, &pxStaticStreamBuffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
configASSERT( xResult == pdTRUE );
|
||||||
|
|
||||||
|
/* Delete the stream or message buffer */
|
||||||
|
if( xIsMessageBuffer == pdTRUE )
|
||||||
|
{
|
||||||
|
vMessageBufferDelete( xStreamBuffer );
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
vSemaphoreDelete( xStreamBuffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Free the memory buffers */
|
||||||
|
heap_caps_free( pxStaticStreamBuffer );
|
||||||
|
heap_caps_free( pucStreamBufferStorageArea );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ------------------------------ Event Groups ------------------------------ */
|
||||||
|
|
||||||
|
EventGroupHandle_t xEventGroupCreateWithCaps( UBaseType_t uxMemoryCaps )
|
||||||
|
{
|
||||||
|
EventGroupHandle_t xEventGroup;
|
||||||
|
StaticEventGroup_t * pxEventGroupBuffer;
|
||||||
|
|
||||||
|
/* Allocate memory for the event group using the provided memory caps */
|
||||||
|
pxEventGroupBuffer = heap_caps_malloc( sizeof( StaticEventGroup_t ), uxMemoryCaps );
|
||||||
|
|
||||||
|
if( pxEventGroupBuffer == NULL )
|
||||||
|
{
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create the event group using static creation API */
|
||||||
|
xEventGroup = xEventGroupCreateStatic( pxEventGroupBuffer );
|
||||||
|
|
||||||
|
if( xEventGroup == NULL )
|
||||||
|
{
|
||||||
|
heap_caps_free( pxEventGroupBuffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
return xEventGroup;
|
||||||
|
}
|
||||||
|
|
||||||
|
void vEventGroupDeleteWithCaps( EventGroupHandle_t xEventGroup )
|
||||||
|
{
|
||||||
|
BaseType_t xResult;
|
||||||
|
StaticEventGroup_t * pxEventGroupBuffer;
|
||||||
|
|
||||||
|
/* Retrieve the buffer used to create the event group before deleting it
|
||||||
|
* */
|
||||||
|
xResult = xEventGroupGetStaticBuffer( xEventGroup, &pxEventGroupBuffer );
|
||||||
|
configASSERT( xResult == pdTRUE );
|
||||||
|
|
||||||
|
/* Delete the event group */
|
||||||
|
vEventGroupDelete( xEventGroup );
|
||||||
|
|
||||||
|
/* Free the memory buffer */
|
||||||
|
heap_caps_free( pxEventGroupBuffer );
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,12 @@ entries:
|
|||||||
tasks:prvTaskPriorityRaise (default)
|
tasks:prvTaskPriorityRaise (default)
|
||||||
tasks:prvTaskPriorityRestore (default)
|
tasks:prvTaskPriorityRestore (default)
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------------------------------------------
|
||||||
|
# idf_additions.c
|
||||||
|
# Placement Rules: Functions always in flash as they are never called from an ISR
|
||||||
|
# ------------------------------------------------------------------------------------------------------------------
|
||||||
|
idf_additions (default)
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------------------------------------------
|
# ------------------------------------------------------------------------------------------------------------------
|
||||||
# app_startup.c
|
# app_startup.c
|
||||||
# Placement Rules: Functions always in flash as they are never called from an ISR
|
# Placement Rules: Functions always in flash as they are never called from an ISR
|
||||||
|
@ -191,6 +191,7 @@ INPUT = \
|
|||||||
$(PROJECT_PATH)/components/fatfs/diskio/diskio_sdmmc.h \
|
$(PROJECT_PATH)/components/fatfs/diskio/diskio_sdmmc.h \
|
||||||
$(PROJECT_PATH)/components/fatfs/diskio/diskio_wl.h \
|
$(PROJECT_PATH)/components/fatfs/diskio/diskio_wl.h \
|
||||||
$(PROJECT_PATH)/components/fatfs/vfs/esp_vfs_fat.h \
|
$(PROJECT_PATH)/components/fatfs/vfs/esp_vfs_fat.h \
|
||||||
|
$(PROJECT_PATH)/components/freertos/esp_additions/include/freertos/idf_additions.h \
|
||||||
$(PROJECT_PATH)/components/freertos/FreeRTOS-Kernel/include/freertos/event_groups.h \
|
$(PROJECT_PATH)/components/freertos/FreeRTOS-Kernel/include/freertos/event_groups.h \
|
||||||
$(PROJECT_PATH)/components/freertos/FreeRTOS-Kernel/include/freertos/message_buffer.h \
|
$(PROJECT_PATH)/components/freertos/FreeRTOS-Kernel/include/freertos/message_buffer.h \
|
||||||
$(PROJECT_PATH)/components/freertos/FreeRTOS-Kernel/include/freertos/queue.h \
|
$(PROJECT_PATH)/components/freertos/FreeRTOS-Kernel/include/freertos/queue.h \
|
||||||
|
@ -430,6 +430,12 @@ When implementing TLSP callbacks, users should note the following:
|
|||||||
- The callback **must never attempt to block or yield** and critical sections should be kept as short as possible
|
- The callback **must never attempt to block or yield** and critical sections should be kept as short as possible
|
||||||
- The callback is called shortly before a deleted task's memory is freed. Thus, the callback can either be called from :cpp:func:`vTaskDelete` itself, or from the idle task.
|
- The callback is called shortly before a deleted task's memory is freed. Thus, the callback can either be called from :cpp:func:`vTaskDelete` itself, or from the idle task.
|
||||||
|
|
||||||
|
.. ----------------------------------------------- IDF Additional API --------------------------------------------------
|
||||||
|
|
||||||
|
IDF Additional API
|
||||||
|
------------------
|
||||||
|
|
||||||
|
The :component_file:`freertos/esp_additions/include/freertos/idf_additions.h` header contains FreeRTOS related helper functions added by ESP-IDF. Users can include this header via ``#include "freertos/idf_additions.h"``.
|
||||||
|
|
||||||
.. ------------------------------------------ Component Specific Properties --------------------------------------------
|
.. ------------------------------------------ Component Specific Properties --------------------------------------------
|
||||||
|
|
||||||
@ -455,3 +461,8 @@ Hooks API
|
|||||||
^^^^^^^^^
|
^^^^^^^^^
|
||||||
|
|
||||||
.. include-build-file:: inc/esp_freertos_hooks.inc
|
.. include-build-file:: inc/esp_freertos_hooks.inc
|
||||||
|
|
||||||
|
Additional API
|
||||||
|
^^^^^^^^^^^^^^
|
||||||
|
|
||||||
|
.. include-build-file:: inc/idf_additions.inc
|
||||||
|
Loading…
x
Reference in New Issue
Block a user