Merge branch 'feature/freertos_add_create_task_with_caps' into 'master'

FreeRTOS: Add xTaskCreateWithCaps()

Closes IDFGH-9922

See merge request espressif/esp-idf!23191
This commit is contained in:
Darian
2023-04-21 22:33:03 +08:00
6 changed files with 213 additions and 6 deletions
@@ -28,6 +28,73 @@
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
/* ---------------------------------- Tasks --------------------------------- */
BaseType_t xTaskCreatePinnedToCoreWithCaps( TaskFunction_t pvTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pvCreatedTask,
const BaseType_t xCoreID,
UBaseType_t uxMemoryCaps )
{
TaskHandle_t xHandle;
StaticTask_t * pxTaskBuffer;
StackType_t * pxStack;
/* Allocate memory for the task's TCB. We use pvPortMalloc() here as the
* TCB must be in internal memory. */
pxTaskBuffer = pvPortMalloc( sizeof( StaticTask_t ) );
/* Allocate memory for the task's stack using the provided memory caps
* */
pxStack = heap_caps_malloc( usStackDepth, ( uint32_t ) uxMemoryCaps );
if( ( pxTaskBuffer == NULL ) || ( pxStack == NULL ) )
{
goto err;
}
/* Create the task using static creation API*/
xHandle = xTaskCreateStaticPinnedToCore( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxStack, pxTaskBuffer, xCoreID );
if( xHandle == NULL )
{
/* Failed to create task */
goto err;
}
else if( pvCreatedTask != NULL )
{
/* Task created successfully. Return the task handle */
*pvCreatedTask = xHandle;
}
return pdPASS;
err:
heap_caps_free( pxStack );
vPortFree( pxTaskBuffer );
return pdFAIL;
}
void vTaskDeleteWithCaps( TaskHandle_t xTaskToDelete )
{
BaseType_t xResult;
StaticTask_t * pxTaskBuffer;
StackType_t * puxStackBuffer;
xResult = xTaskGetStaticBuffers( xTaskToDelete, &puxStackBuffer, &pxTaskBuffer );
configASSERT( xResult == pdTRUE );
/* Delete the task */
vTaskDelete( xTaskToDelete );
/* Free the memory buffers */
heap_caps_free( puxStackBuffer );
vPortFree( pxTaskBuffer );
}
/* ---------------------------------- Queue --------------------------------- */
QueueHandle_t xQueueCreateWithCaps( UBaseType_t uxQueueLength,
@@ -201,7 +201,89 @@
#if ( configSUPPORT_STATIC_ALLOCATION == 1 )
/* ---------------------- Queue ------------------------- */
/* ---------------------------------- Tasks --------------------------------- */
/**
* @brief Creates a pinned task where its stack has specific memory capabilities
*
* This function is similar to xTaskCreatePinnedToCore(), except that it allows
* the memory allocated for the task's stack to have specific capabilities
* (e.g., MALLOC_CAP_SPIRAM).
*
* However, the specified capabilities will NOT apply to the task's TCB as a TCB
* must always be in internal RAM.
*
* @param pvTaskCode Pointer to the task entry function
* @param pcName A descriptive name for the task
* @param usStackDepth The size of the task stack specified as the number of
* bytes
* @param pvParameters Pointer that will be used as the parameter for the task
* being created.
* @param uxPriority The priority at which the task should run.
* @param pvCreatedTask Used to pass back a handle by which the created task can
* be referenced.
* @param xCoreID Core to which the task is pinned to, or tskNO_AFFINITY if
* unpinned.
* @param uxMemoryCaps Memory capabilities of the task stack's memory (see
* esp_heap_caps.h)
* @return pdPASS if the task was successfully created and added to a ready
* list, otherwise an error code defined in the file projdefs.h
*/
BaseType_t xTaskCreatePinnedToCoreWithCaps( TaskFunction_t pvTaskCode,
const char * const pcName,
const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pvCreatedTask,
const BaseType_t xCoreID,
UBaseType_t uxMemoryCaps );
/**
* @brief Creates a task where its stack has specific memory capabilities
*
* This function is similar to xTaskCreate(), except that it allows the memory
* allocated for the task's stack to have specific capabilities (e.g.,
* MALLOC_CAP_SPIRAM).
*
* However, the specified capabilities will NOT apply to the task's TCB as a TCB
* must always be in internal RAM.
*
* @note A task created using this function must only be deleted using
* vTaskDeleteWithCaps()
* @param pvTaskCode Pointer to the task entry function
* @param pcName A descriptive name for the task
* @param usStackDepth The size of the task stack specified as the number of
* bytes
* @param pvParameters Pointer that will be used as the parameter for the task
* being created.
* @param uxPriority The priority at which the task should run.
* @param pvCreatedTask Used to pass back a handle by which the created task can
* be referenced.
* @param uxMemoryCaps Memory capabilities of the task stack's memory (see
* esp_heap_caps.h)
* @return pdPASS if the task was successfully created and added to a ready
* list, otherwise an error code defined in the file projdefs.h
*/
static inline BaseType_t xTaskCreateWithCaps( TaskFunction_t pvTaskCode,
const char * const pcName,
configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * pvCreatedTask,
UBaseType_t uxMemoryCaps )
{
return xTaskCreatePinnedToCoreWithCaps( pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pvCreatedTask, tskNO_AFFINITY, uxMemoryCaps );
}
/**
* @brief Deletes a task previously created using xTaskCreateWithCaps() or
* xTaskCreatePinnedToCoreWithCaps()
*
* @param xTaskToDelete A handle to the task to be deleted
*/
void vTaskDeleteWithCaps( TaskHandle_t xTaskToDelete );
/* ---------------------------------- Queue --------------------------------- */
/**
* @brief Creates a queue with specific memory capabilities
@@ -229,7 +311,7 @@
*/
void vQueueDeleteWithCaps( QueueHandle_t xQueue );
/* -------------------- Semaphore ----------------------- */
/* -------------------------------- Semaphore ------------------------------- */
/** @cond */ /* Doxygen command to hide this from docs */
SemaphoreHandle_t xSemaphoreCreateGenericWithCaps( UBaseType_t uxMaxCount,
@@ -323,7 +405,7 @@
*/
void vSemaphoreDeleteWithCaps( SemaphoreHandle_t xSemaphore );
/* ------------ Stream & Message Buffers ---------------- */
/* ------------------------ Stream & Message Buffers ------------------------ */
/** @cond */ /* Doxygen command to hide this from docs */
StreamBufferHandle_t xStreamBufferGenericCreateWithCaps( size_t xBufferSizeBytes,
@@ -402,7 +484,7 @@
vStreamBufferGenericDeleteWithCaps( ( StreamBufferHandle_t ) xMessageBuffer, pdTRUE );
}
/* ------------------ Event Groups ---------------------- */
/* ------------------------------ Event Groups ------------------------------ */
/**
* @brief Creates an event group with specific memory capabilities
@@ -430,5 +512,5 @@
#endif /* if ( configSUPPORT_STATIC_ALLOCATION == 1 ) */
#ifdef __cplusplus
}
}
#endif
@@ -14,6 +14,7 @@
#include "freertos/idf_additions.h"
#include "esp_memory_utils.h"
#include "unity.h"
#include "test_utils.h"
/*
Test ...Create...WithCaps() functions
@@ -33,6 +34,31 @@ Expected:
#define OBJECT_MEMORY_CAPS (MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT)
static void task_with_caps(void *arg)
{
xTaskNotifyGive((TaskHandle_t)arg);
vTaskSuspend(NULL);
}
TEST_CASE("IDF additions: Task creation with memory caps", "[freertos]")
{
TaskHandle_t task_handle = NULL;
StackType_t *puxStackBuffer;
StaticTask_t *pxTaskBuffer;
// Create a task with caps
TEST_ASSERT_EQUAL(pdPASS, xTaskCreatePinnedToCoreWithCaps(task_with_caps, "task", 4096, (void *)xTaskGetCurrentTaskHandle(), UNITY_FREERTOS_PRIORITY + 1, &task_handle, UNITY_FREERTOS_CPU, OBJECT_MEMORY_CAPS));
TEST_ASSERT_NOT_EQUAL(NULL, task_handle);
// Get the task's memory
TEST_ASSERT_EQUAL(pdTRUE, xTaskGetStaticBuffers(task_handle, &puxStackBuffer, &pxTaskBuffer));
TEST_ASSERT(esp_ptr_in_dram(puxStackBuffer));
TEST_ASSERT(esp_ptr_in_dram(pxTaskBuffer));
// Wait for the created task to block
ulTaskNotifyTake(pdTRUE, portMAX_DELAY);
// Delete the task
vTaskDeleteWithCaps(task_handle);
}
TEST_CASE("IDF additions: Queue creation with memory caps", "[freertos]")
{
QueueHandle_t queue_handle;