mirror of
https://github.com/espressif/esp-protocols.git
synced 2025-06-25 17:31:33 +02:00
feat(mdns): support allocating mDNS task from SPIRAM
This commit is contained in:
@ -61,6 +61,16 @@ menu "mDNS"
|
|||||||
default 0x0 if MDNS_TASK_AFFINITY_CPU0
|
default 0x0 if MDNS_TASK_AFFINITY_CPU0
|
||||||
default 0x1 if MDNS_TASK_AFFINITY_CPU1
|
default 0x1 if MDNS_TASK_AFFINITY_CPU1
|
||||||
|
|
||||||
|
choice MDNS_TASK_MEMORY_ALLOC_FROM
|
||||||
|
prompt "Select mDNS task create on which type of memory"
|
||||||
|
default MDNS_TASK_CREATE_FROM_INTERNAL
|
||||||
|
config MDNS_TASK_CREATE_FROM_SPIRAM
|
||||||
|
bool "mDNS task creates on the SPIRAM"
|
||||||
|
depends on (SPIRAM_USE_CAPS_ALLOC || SPIRAM_USE_MALLOC)
|
||||||
|
config MDNS_TASK_CREATE_FROM_INTERNAL
|
||||||
|
bool "mDNS task creates on the internal RAM"
|
||||||
|
endchoice
|
||||||
|
|
||||||
config MDNS_SERVICE_ADD_TIMEOUT_MS
|
config MDNS_SERVICE_ADD_TIMEOUT_MS
|
||||||
int "mDNS adding service timeout (ms)"
|
int "mDNS adding service timeout (ms)"
|
||||||
range 10 30000
|
range 10 30000
|
||||||
|
@ -25,6 +25,8 @@ static void _mdns_browse_finish(mdns_browse_t *browse);
|
|||||||
static void _mdns_browse_add(mdns_browse_t *browse);
|
static void _mdns_browse_add(mdns_browse_t *browse);
|
||||||
static void _mdns_browse_send(mdns_browse_t *browse, mdns_if_t interface);
|
static void _mdns_browse_send(mdns_browse_t *browse, mdns_if_t interface);
|
||||||
|
|
||||||
|
static void _mdns_task_free_with_caps(void);
|
||||||
|
|
||||||
#if CONFIG_ETH_ENABLED && CONFIG_MDNS_PREDEF_NETIF_ETH
|
#if CONFIG_ETH_ENABLED && CONFIG_MDNS_PREDEF_NETIF_ETH
|
||||||
#include "esp_eth.h"
|
#include "esp_eth.h"
|
||||||
#endif
|
#endif
|
||||||
@ -62,6 +64,7 @@ static const char *TAG = "mdns";
|
|||||||
|
|
||||||
static volatile TaskHandle_t _mdns_service_task_handle = NULL;
|
static volatile TaskHandle_t _mdns_service_task_handle = NULL;
|
||||||
static SemaphoreHandle_t _mdns_service_semaphore = NULL;
|
static SemaphoreHandle_t _mdns_service_semaphore = NULL;
|
||||||
|
StackType_t *_mdns_stack_buffer;
|
||||||
|
|
||||||
static void _mdns_search_finish_done(void);
|
static void _mdns_search_finish_done(void);
|
||||||
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);
|
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)
|
|||||||
vTaskDelay(500 * portTICK_PERIOD_MS);
|
vTaskDelay(500 * portTICK_PERIOD_MS);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
_mdns_task_free_with_caps();
|
||||||
_mdns_service_task_handle = NULL;
|
_mdns_service_task_handle = NULL;
|
||||||
vTaskDelete(NULL);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _mdns_timer_cb(void *arg)
|
static void _mdns_timer_cb(void *arg)
|
||||||
@ -5462,6 +5465,32 @@ static esp_err_t _mdns_stop_timer(void)
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static esp_err_t _mdns_task_create_with_caps(void)
|
||||||
|
{
|
||||||
|
ESP_LOGI(TAG, "mDNS task will be created from %s", MDNS_TASK_MEMORY_LOG);
|
||||||
|
esp_err_t ret = ESP_OK;
|
||||||
|
static StaticTask_t mdns_task_buffer;
|
||||||
|
|
||||||
|
// Allocate memory for the mDNS task's stack using the MDNS_TASK_MEMORY_CAPS
|
||||||
|
_mdns_stack_buffer = heap_caps_malloc(MDNS_SERVICE_STACK_DEPTH, MDNS_TASK_MEMORY_CAPS);
|
||||||
|
ESP_GOTO_ON_FALSE(_mdns_stack_buffer != NULL, ESP_FAIL, err, TAG, "failed to allocate memory for the mDNS task's stack");
|
||||||
|
|
||||||
|
_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 );
|
||||||
|
ESP_GOTO_ON_FALSE(_mdns_service_task_handle != NULL, ESP_FAIL, err, TAG, "failed to create task for the mDNS");
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
|
||||||
|
err:
|
||||||
|
heap_caps_free(_mdns_stack_buffer);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void _mdns_task_free_with_caps(void)
|
||||||
|
{
|
||||||
|
vTaskDelete(_mdns_service_task_handle);
|
||||||
|
heap_caps_free(_mdns_stack_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Start the service thread if not running
|
* @brief Start the service thread if not running
|
||||||
*
|
*
|
||||||
@ -5471,30 +5500,35 @@ static esp_err_t _mdns_stop_timer(void)
|
|||||||
*/
|
*/
|
||||||
static esp_err_t _mdns_service_task_start(void)
|
static esp_err_t _mdns_service_task_start(void)
|
||||||
{
|
{
|
||||||
|
esp_err_t ret = ESP_OK;
|
||||||
if (!_mdns_service_semaphore) {
|
if (!_mdns_service_semaphore) {
|
||||||
_mdns_service_semaphore = xSemaphoreCreateMutex();
|
_mdns_service_semaphore = xSemaphoreCreateMutex();
|
||||||
if (!_mdns_service_semaphore) {
|
ESP_RETURN_ON_FALSE(_mdns_service_semaphore != NULL, ESP_FAIL, TAG, "Failed to create the mDNS service lock");
|
||||||
return ESP_FAIL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
MDNS_SERVICE_LOCK();
|
MDNS_SERVICE_LOCK();
|
||||||
if (_mdns_start_timer()) {
|
ESP_GOTO_ON_ERROR(_mdns_start_timer(), err, TAG, "Failed to start the mDNS service timer");
|
||||||
MDNS_SERVICE_UNLOCK();
|
|
||||||
return ESP_FAIL;
|
|
||||||
}
|
|
||||||
if (!_mdns_service_task_handle) {
|
if (!_mdns_service_task_handle) {
|
||||||
xTaskCreatePinnedToCore(_mdns_service_task, "mdns", MDNS_SERVICE_STACK_DEPTH, NULL, MDNS_TASK_PRIORITY,
|
ESP_GOTO_ON_ERROR(_mdns_task_create_with_caps(), err_stop_timer, TAG, "Failed to start the mDNS service task");
|
||||||
(TaskHandle_t *const)(&_mdns_service_task_handle), MDNS_TASK_AFFINITY);
|
#ifdef MDNS_ENABLE_DEBUG
|
||||||
if (!_mdns_service_task_handle) {
|
#if !CONFIG_IDF_TARGET_LINUX
|
||||||
_mdns_stop_timer();
|
StackType_t *mdns_debug_stack_buffer;
|
||||||
MDNS_SERVICE_UNLOCK();
|
StaticTask_t *mdns_debug_task_buffer;
|
||||||
vSemaphoreDelete(_mdns_service_semaphore);
|
xTaskGetStaticBuffers(_mdns_service_task_handle, &mdns_debug_stack_buffer, &mdns_debug_task_buffer);
|
||||||
_mdns_service_semaphore = NULL;
|
_mdns_dbg_printf("mdns_debug_stack_buffer:%p mdns_debug_task_buffer:%p\n", mdns_debug_stack_buffer, mdns_debug_task_buffer);
|
||||||
return ESP_FAIL;
|
#endif // CONFIG_IDF_TARGET_LINUX
|
||||||
}
|
#endif // MDNS_ENABLE_DEBUG
|
||||||
}
|
}
|
||||||
MDNS_SERVICE_UNLOCK();
|
MDNS_SERVICE_UNLOCK();
|
||||||
return ESP_OK;
|
return ret;
|
||||||
|
|
||||||
|
err_stop_timer:
|
||||||
|
_mdns_stop_timer();
|
||||||
|
err:
|
||||||
|
MDNS_SERVICE_UNLOCK();
|
||||||
|
vSemaphoreDelete(_mdns_service_semaphore);
|
||||||
|
_mdns_service_semaphore = NULL;
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -5511,7 +5545,7 @@ static esp_err_t _mdns_service_task_stop(void)
|
|||||||
mdns_action_t *a = &action;
|
mdns_action_t *a = &action;
|
||||||
action.type = ACTION_TASK_STOP;
|
action.type = ACTION_TASK_STOP;
|
||||||
if (xQueueSend(_mdns_server->action_queue, &a, (TickType_t)0) != pdPASS) {
|
if (xQueueSend(_mdns_server->action_queue, &a, (TickType_t)0) != pdPASS) {
|
||||||
vTaskDelete(_mdns_service_task_handle);
|
_mdns_task_free_with_caps();
|
||||||
_mdns_service_task_handle = NULL;
|
_mdns_service_task_handle = NULL;
|
||||||
}
|
}
|
||||||
while (_mdns_service_task_handle) {
|
while (_mdns_service_task_handle) {
|
||||||
|
@ -21,6 +21,21 @@
|
|||||||
#define _mdns_dbg_printf(...) printf(__VA_ARGS__)
|
#define _mdns_dbg_printf(...) printf(__VA_ARGS__)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if CONFIG_MDNS_TASK_CREATE_FROM_SPIRAM
|
||||||
|
#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT)
|
||||||
|
#define MDNS_TASK_MEMORY_LOG "SPIRAM"
|
||||||
|
#endif
|
||||||
|
#if CONFIG_MDNS_TASK_CREATE_FROM_INTERNAL
|
||||||
|
#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
|
||||||
|
#define MDNS_TASK_MEMORY_LOG "internal RAM"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Allocate memory from internal heap as default.
|
||||||
|
#ifndef MDNS_TASK_MEMORY_CAPS
|
||||||
|
#define MDNS_TASK_MEMORY_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)
|
||||||
|
#define MDNS_TASK_MEMORY_LOG "internal RAM"
|
||||||
|
#endif
|
||||||
|
|
||||||
/** Number of predefined interfaces */
|
/** Number of predefined interfaces */
|
||||||
#ifndef CONFIG_MDNS_PREDEF_NETIF_STA
|
#ifndef CONFIG_MDNS_PREDEF_NETIF_STA
|
||||||
#define CONFIG_MDNS_PREDEF_NETIF_STA 0
|
#define CONFIG_MDNS_PREDEF_NETIF_STA 0
|
||||||
|
Reference in New Issue
Block a user