Skip to content

Commit d54ee75

Browse files
feat(esp_lvgl_port): Add LVGL task stack capabilities
Closes #567
1 parent a1b40b3 commit d54ee75

File tree

4 files changed

+28
-17
lines changed

4 files changed

+28
-17
lines changed

components/esp_lvgl_port/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# Changelog
22

3+
## [Unreleased]
4+
### Features
5+
- Added option to place LVGL task stack to external RAM
6+
37
## 2.6.0
48

59
### Features

components/esp_lvgl_port/include/esp_lvgl_port.h

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#pragma once
1313

1414
#include "esp_err.h"
15+
#include "esp_heap_caps.h"
1516
#include "lvgl.h"
1617
#include "esp_lvgl_port_disp.h"
1718
#include "esp_lvgl_port_touch.h"
@@ -48,24 +49,26 @@ typedef struct {
4849
* @brief Init configuration structure
4950
*/
5051
typedef struct {
51-
int task_priority; /*!< LVGL task priority */
52-
int task_stack; /*!< LVGL task stack size */
53-
int task_affinity; /*!< LVGL task pinned to core (-1 is no affinity) */
54-
int task_max_sleep_ms; /*!< Maximum sleep in LVGL task */
55-
int timer_period_ms; /*!< LVGL timer tick period in ms */
52+
int task_priority; /*!< LVGL task priority */
53+
int task_stack; /*!< LVGL task stack size */
54+
int task_affinity; /*!< LVGL task pinned to core (-1 is no affinity) */
55+
int task_max_sleep_ms; /*!< Maximum sleep in LVGL task */
56+
unsigned task_stack_caps; /*!< LVGL task stack memory capabilities (see esp_heap_caps.h) */
57+
int timer_period_ms; /*!< LVGL timer tick period in ms */
5658
} lvgl_port_cfg_t;
5759

5860
/**
5961
* @brief LVGL port configuration structure
6062
*
6163
*/
62-
#define ESP_LVGL_PORT_INIT_CONFIG() \
63-
{ \
64-
.task_priority = 4, \
65-
.task_stack = 7168, \
66-
.task_affinity = -1, \
67-
.task_max_sleep_ms = 500, \
68-
.timer_period_ms = 5, \
64+
#define ESP_LVGL_PORT_INIT_CONFIG() \
65+
{ \
66+
.task_priority = 4, \
67+
.task_stack = 7168, \
68+
.task_affinity = -1, \
69+
.task_max_sleep_ms = 500, \
70+
.task_stack_caps = MALLOC_CAP_DEFAULT, \
71+
.timer_period_ms = 5, \
6972
}
7073

7174
/**

components/esp_lvgl_port/src/lvgl8/esp_lvgl_port.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2024-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -13,6 +13,7 @@
1313
#include "freertos/FreeRTOS.h"
1414
#include "freertos/task.h"
1515
#include "freertos/semphr.h"
16+
#include "freertos/idf_additions.h"
1617
#include "esp_lvgl_port.h"
1718
#include "esp_lvgl_port_priv.h"
1819
#include "lvgl.h"
@@ -77,10 +78,11 @@ esp_err_t lvgl_port_init(const lvgl_port_cfg_t *cfg)
7778
ESP_GOTO_ON_FALSE(lvgl_port_ctx.task_mux, ESP_ERR_NO_MEM, err, TAG, "Create LVGL task sem fail!");
7879

7980
BaseType_t res;
81+
const uint32_t caps = cfg->task_stack_caps ? cfg->task_stack_caps : MALLOC_CAP_DEFAULT; // caps cannot be zero
8082
if (cfg->task_affinity < 0) {
81-
res = xTaskCreate(lvgl_port_task, "taskLVGL", cfg->task_stack, NULL, cfg->task_priority, &lvgl_port_ctx.lvgl_task);
83+
res = xTaskCreateWithCaps(lvgl_port_task, "taskLVGL", cfg->task_stack, NULL, cfg->task_priority, &lvgl_port_ctx.lvgl_task, caps);
8284
} else {
83-
res = xTaskCreatePinnedToCore(lvgl_port_task, "taskLVGL", cfg->task_stack, NULL, cfg->task_priority, &lvgl_port_ctx.lvgl_task, cfg->task_affinity);
85+
res = xTaskCreatePinnedToCoreWithCaps(lvgl_port_task, "taskLVGL", cfg->task_stack, NULL, cfg->task_priority, &lvgl_port_ctx.lvgl_task, cfg->task_affinity, caps);
8486
}
8587
ESP_GOTO_ON_FALSE(res == pdPASS, ESP_FAIL, err, TAG, "Create LVGL task fail!");
8688

components/esp_lvgl_port/src/lvgl9/esp_lvgl_port.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
#include "freertos/task.h"
1616
#include "freertos/semphr.h"
1717
#include "freertos/event_groups.h"
18+
#include "freertos/idf_additions.h"
1819
#include "esp_lvgl_port.h"
1920
#include "esp_lvgl_port_priv.h"
2021
#include "lvgl.h"
@@ -84,10 +85,11 @@ esp_err_t lvgl_port_init(const lvgl_port_cfg_t *cfg)
8485
ESP_GOTO_ON_FALSE(lvgl_port_ctx.lvgl_events, ESP_ERR_NO_MEM, err, TAG, "Create LVGL Event Group fail!");
8586

8687
BaseType_t res;
88+
const uint32_t caps = cfg->task_stack_caps ? cfg->task_stack_caps : MALLOC_CAP_DEFAULT; // caps cannot be zero
8789
if (cfg->task_affinity < 0) {
88-
res = xTaskCreate(lvgl_port_task, "taskLVGL", cfg->task_stack, xTaskGetCurrentTaskHandle(), cfg->task_priority, &lvgl_port_ctx.lvgl_task);
90+
res = xTaskCreateWithCaps(lvgl_port_task, "taskLVGL", cfg->task_stack, xTaskGetCurrentTaskHandle(), cfg->task_priority, &lvgl_port_ctx.lvgl_task, caps);
8991
} else {
90-
res = xTaskCreatePinnedToCore(lvgl_port_task, "taskLVGL", cfg->task_stack, xTaskGetCurrentTaskHandle(), cfg->task_priority, &lvgl_port_ctx.lvgl_task, cfg->task_affinity);
92+
res = xTaskCreatePinnedToCoreWithCaps(lvgl_port_task, "taskLVGL", cfg->task_stack, xTaskGetCurrentTaskHandle(), cfg->task_priority, &lvgl_port_ctx.lvgl_task, cfg->task_affinity, caps);
9193
}
9294
ESP_GOTO_ON_FALSE(res == pdPASS, ESP_FAIL, err, TAG, "Create LVGL task fail!");
9395

0 commit comments

Comments
 (0)