refactor(lua): refine display and heap module APIs

Rename the display lifecycle API from create_screen/destroy_screen to init/deinit.

Fix display HAL teardown so callbacks and synchronization primitives are released on deinit and can be registered again on the next init.

Trim stack sizes, enable periodic task stack logging, and remove obsolete Lua GC/coroutine demos.
This commit is contained in:
zhouli
2026-04-12 19:41:10 +08:00
parent 2f79685723
commit 700d79e9f9
14 changed files with 79 additions and 163 deletions
@@ -57,6 +57,7 @@ typedef struct {
static display_hal_state_t s_state;
static void display_hal_clear_clip_locked(void);
static esp_err_t display_hal_clear_io_callbacks_locked(void);
static bool display_hal_flush_done_isr(esp_lcd_panel_io_handle_t panel_io,
esp_lcd_panel_io_event_data_t *edata,
void *user_ctx);
@@ -151,6 +152,8 @@ fail:
esp_err_t display_hal_destroy(void)
{
esp_err_t ret = display_hal_lock();
SemaphoreHandle_t flush_done_to_delete = NULL;
SemaphoreHandle_t lock_to_delete = NULL;
if (ret != ESP_OK) {
return ret;
@@ -164,6 +167,14 @@ esp_err_t display_hal_destroy(void)
}
}
if (s_state.display_callbacks_registered) {
ret = display_hal_clear_io_callbacks_locked();
if (ret != ESP_OK) {
display_hal_unlock();
return ret;
}
}
for (size_t i = 0; i < DISPLAY_HAL_FRAMEBUFFER_COUNT_MAX; ++i) {
heap_caps_free(s_state.framebuffers[i]);
s_state.framebuffers[i] = NULL;
@@ -173,8 +184,12 @@ esp_err_t display_hal_destroy(void)
s_state.painter = NULL;
}
flush_done_to_delete = s_state.display_flush_done;
lock_to_delete = s_state.lock;
s_state.panel = NULL;
s_state.io = NULL;
s_state.display_callbacks_registered = false;
s_state.width = 0;
s_state.height = 0;
s_state.framebuffer_bytes = 0;
@@ -190,8 +205,18 @@ esp_err_t display_hal_destroy(void)
s_state.clip_y = 0;
s_state.clip_width = 0;
s_state.clip_height = 0;
s_state.display_flush_done = NULL;
s_state.lock = NULL;
display_hal_unlock();
if (lock_to_delete) {
xSemaphoreGive(lock_to_delete);
}
if (flush_done_to_delete) {
vSemaphoreDelete(flush_done_to_delete);
}
if (lock_to_delete) {
vSemaphoreDelete(lock_to_delete);
}
return ESP_OK;
}
@@ -204,6 +229,21 @@ static void display_hal_clear_clip_locked(void)
s_state.clip_height = s_state.height;
}
static esp_err_t display_hal_clear_io_callbacks_locked(void)
{
const esp_lcd_panel_io_callbacks_t callbacks = {0};
if (!s_state.io) {
s_state.display_callbacks_registered = false;
return ESP_OK;
}
ESP_RETURN_ON_ERROR(esp_lcd_panel_io_register_event_callbacks(s_state.io, &callbacks, NULL),
TAG, "clear flush callback failed");
s_state.display_callbacks_registered = false;
return ESP_OK;
}
static uint16_t *display_hal_get_draw_framebuffer_locked(void)
{
if (s_state.framebuffer_count == 0) {
@@ -84,7 +84,7 @@ static void *lua_display_check_lightuserdata_arg(lua_State *L, int index, const
* Screen lifecycle
* ---------------------------------------------------------------------- */
static int lua_display_create_screen(lua_State *L)
static int lua_display_init(lua_State *L)
{
esp_lcd_panel_handle_t panel_handle =
(esp_lcd_panel_handle_t)lua_display_check_lightuserdata_arg(
@@ -97,19 +97,19 @@ static int lua_display_create_screen(lua_State *L)
esp_err_t err = display_hal_create(panel_handle, io_handle, lcd_width, lcd_height);
if (err != ESP_OK) {
return luaL_error(L, "display create_screen failed: %s", esp_err_to_name(err));
return luaL_error(L, "display init failed: %s", esp_err_to_name(err));
}
lua_pushboolean(L, 1);
return 1;
}
static int lua_display_destroy_screen(lua_State *L)
static int lua_display_deinit(lua_State *L)
{
(void)L;
esp_err_t err = display_hal_destroy();
if (err != ESP_OK) {
return luaL_error(L, "display destroy_screen failed: %s", esp_err_to_name(err));
return luaL_error(L, "display deinit failed: %s", esp_err_to_name(err));
}
lua_pushboolean(L, 1);
@@ -1184,10 +1184,10 @@ int luaopen_display(lua_State *L)
{
lua_newtable(L);
lua_pushcfunction(L, lua_display_create_screen);
lua_setfield(L, -2, "create_screen");
lua_pushcfunction(L, lua_display_destroy_screen);
lua_setfield(L, -2, "destroy_screen");
lua_pushcfunction(L, lua_display_init);
lua_setfield(L, -2, "init");
lua_pushcfunction(L, lua_display_deinit);
lua_setfield(L, -2, "deinit");
lua_pushcfunction(L, lua_display_width);
lua_setfield(L, -2, "width");