Skip to content

Commit 8fcad10

Browse files
zwx1995espdavid-cermak
authored andcommitted
feat(mdns): support allocating mDNS task from SPIRAM
1 parent 936e43f commit 8fcad10

File tree

3 files changed

+78
-19
lines changed

3 files changed

+78
-19
lines changed

components/mdns/Kconfig

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,16 @@ menu "mDNS"
6161
default 0x0 if MDNS_TASK_AFFINITY_CPU0
6262
default 0x1 if MDNS_TASK_AFFINITY_CPU1
6363

64+
choice MDNS_TASK_MEMORY_ALLOC_FROM
65+
prompt "Select mDNS task create on which type of memory"
66+
default MDNS_TASK_CREATE_FROM_INTERNAL
67+
config MDNS_TASK_CREATE_FROM_SPIRAM
68+
bool "mDNS task creates on the SPIRAM"
69+
depends on (SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC)
70+
config MDNS_TASK_CREATE_FROM_INTERNAL
71+
bool "mDNS task creates on the internal RAM"
72+
endchoice
73+
6474
config MDNS_SERVICE_ADD_TIMEOUT_MS
6575
int "mDNS adding service timeout (ms)"
6676
range 10 30000

components/mdns/mdns.c

Lines changed: 53 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ static void _mdns_browse_finish(mdns_browse_t *browse);
2525
static void _mdns_browse_add(mdns_browse_t *browse);
2626
static void _mdns_browse_send(mdns_browse_t *browse, mdns_if_t interface);
2727

28+
static void _mdns_task_free_with_caps(void);
29+
2830
#if CONFIG_ETH_ENABLED && CONFIG_MDNS_PREDEF_NETIF_ETH
2931
#include "esp_eth.h"
3032
#endif
@@ -62,6 +64,7 @@ static const char *TAG = "mdns";
6264

6365
static volatile TaskHandle_t _mdns_service_task_handle = NULL;
6466
static SemaphoreHandle_t _mdns_service_semaphore = NULL;
67+
StackType_t *_mdns_stack_buffer;
6568

6669
static void _mdns_search_finish_done(void);
6770
static mdns_search_once_t *_mdns_search_find_from(mdns_search_once_t *search, mdns_name_t *name, uint16_t type, mdns_if_t tcpip_if, mdns_ip_protocol_t ip_protocol);
@@ -5424,8 +5427,8 @@ static void _mdns_service_task(void *pvParameters)
54245427
vTaskDelay(500 * portTICK_PERIOD_MS);
54255428
}
54265429
}
5430+
_mdns_task_free_with_caps();
54275431
_mdns_service_task_handle = NULL;
5428-
vTaskDelete(NULL);
54295432
}
54305433

54315434
static void _mdns_timer_cb(void *arg)
@@ -5462,6 +5465,32 @@ static esp_err_t _mdns_stop_timer(void)
54625465
return err;
54635466
}
54645467

5468+
static esp_err_t _mdns_task_create_with_caps(void)
5469+
{
5470+
ESP_LOGI(TAG, "mDNS task will be created from %s", MDNS_TASK_MEMORY_LOG);
5471+
esp_err_t ret = ESP_OK;
5472+
static StaticTask_t mdns_task_buffer;
5473+
5474+
// Allocate memory for the mDNS task's stack using the MDNS_TASK_MEMORY_CAPS
5475+
_mdns_stack_buffer = heap_caps_malloc(MDNS_SERVICE_STACK_DEPTH, MDNS_TASK_MEMORY_CAPS);
5476+
ESP_GOTO_ON_FALSE(_mdns_stack_buffer != NULL, ESP_FAIL, err, TAG, "failed to allocate memory for the mDNS task's stack");
5477+
5478+
_mdns_service_task_handle = xTaskCreateStaticPinnedToCore( _mdns_service_task, "mdns", MDNS_SERVICE_STACK_DEPTH, NULL, MDNS_TASK_PRIORITY, _mdns_stack_buffer, &mdns_task_buffer, MDNS_TASK_AFFINITY );
5479+
ESP_GOTO_ON_FALSE(_mdns_service_task_handle != NULL, ESP_FAIL, err, TAG, "failed to create task for the mDNS");
5480+
5481+
return ret;
5482+
5483+
err:
5484+
heap_caps_free(_mdns_stack_buffer);
5485+
return ret;
5486+
}
5487+
5488+
static void _mdns_task_free_with_caps(void)
5489+
{
5490+
vTaskDelete(_mdns_service_task_handle);
5491+
heap_caps_free(_mdns_stack_buffer);
5492+
}
5493+
54655494
/**
54665495
* @brief Start the service thread if not running
54675496
*
@@ -5471,30 +5500,35 @@ static esp_err_t _mdns_stop_timer(void)
54715500
*/
54725501
static esp_err_t _mdns_service_task_start(void)
54735502
{
5503+
esp_err_t ret = ESP_OK;
54745504
if (!_mdns_service_semaphore) {
54755505
_mdns_service_semaphore = xSemaphoreCreateMutex();
5476-
if (!_mdns_service_semaphore) {
5477-
return ESP_FAIL;
5478-
}
5506+
ESP_RETURN_ON_FALSE(_mdns_service_semaphore != NULL, ESP_FAIL, TAG, "Failed to create the mDNS service lock");
54795507
}
54805508
MDNS_SERVICE_LOCK();
5481-
if (_mdns_start_timer()) {
5482-
MDNS_SERVICE_UNLOCK();
5483-
return ESP_FAIL;
5484-
}
5509+
ESP_GOTO_ON_ERROR(_mdns_start_timer(), err, TAG, "Failed to start the mDNS service timer");
5510+
54855511
if (!_mdns_service_task_handle) {
5486-
xTaskCreatePinnedToCore(_mdns_service_task, "mdns", MDNS_SERVICE_STACK_DEPTH, NULL, MDNS_TASK_PRIORITY,
5487-
(TaskHandle_t *const)(&_mdns_service_task_handle), MDNS_TASK_AFFINITY);
5488-
if (!_mdns_service_task_handle) {
5489-
_mdns_stop_timer();
5490-
MDNS_SERVICE_UNLOCK();
5491-
vSemaphoreDelete(_mdns_service_semaphore);
5492-
_mdns_service_semaphore = NULL;
5493-
return ESP_FAIL;
5494-
}
5512+
ESP_GOTO_ON_ERROR(_mdns_task_create_with_caps(), err_stop_timer, TAG, "Failed to start the mDNS service task");
5513+
#ifdef MDNS_ENABLE_DEBUG
5514+
#if !CONFIG_IDF_TARGET_LINUX
5515+
StackType_t *mdns_debug_stack_buffer;
5516+
StaticTask_t *mdns_debug_task_buffer;
5517+
xTaskGetStaticBuffers(_mdns_service_task_handle, &mdns_debug_stack_buffer, &mdns_debug_task_buffer);
5518+
_mdns_dbg_printf("mdns_debug_stack_buffer:%p mdns_debug_task_buffer:%p\n", mdns_debug_stack_buffer, mdns_debug_task_buffer);
5519+
#endif // CONFIG_IDF_TARGET_LINUX
5520+
#endif // MDNS_ENABLE_DEBUG
54955521
}
54965522
MDNS_SERVICE_UNLOCK();
5497-
return ESP_OK;
5523+
return ret;
5524+
5525+
err_stop_timer:
5526+
_mdns_stop_timer();
5527+
err:
5528+
MDNS_SERVICE_UNLOCK();
5529+
vSemaphoreDelete(_mdns_service_semaphore);
5530+
_mdns_service_semaphore = NULL;
5531+
return ret;
54985532
}
54995533

55005534
/**
@@ -5511,7 +5545,7 @@ static esp_err_t _mdns_service_task_stop(void)
55115545
mdns_action_t *a = &action;
55125546
action.type = ACTION_TASK_STOP;
55135547
if (xQueueSend(_mdns_server->action_queue, &a, (TickType_t)0) != pdPASS) {
5514-
vTaskDelete(_mdns_service_task_handle);
5548+
_mdns_task_free_with_caps();
55155549
_mdns_service_task_handle = NULL;
55165550
}
55175551
while (_mdns_service_task_handle) {

components/mdns/private_include/mdns_private.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,21 @@
2121
#define _mdns_dbg_printf(...) printf(__VA_ARGS__)
2222
#endif
2323

24+
#if CONFIG_MDNS_TASK_CREATE_FROM_SPIRAM
25+
#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT)
26+
#define MDNS_TASK_MEMORY_LOG "SPIRAM"
27+
#endif
28+
#if CONFIG_MDNS_TASK_CREATE_FROM_INTERNAL
29+
#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
30+
#define MDNS_TASK_MEMORY_LOG "internal RAM"
31+
#endif
32+
33+
// Allocate memory from internal heap as default.
34+
#ifndef MDNS_TASK_MEMORY_CAPS
35+
#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
36+
#define MDNS_TASK_MEMORY_LOG "internal RAM"
37+
#endif
38+
2439
/** Number of predefined interfaces */
2540
#ifndef CONFIG_MDNS_PREDEF_NETIF_STA
2641
#define CONFIG_MDNS_PREDEF_NETIF_STA 0

0 commit comments

Comments
 (0)