Using ESP_LVGL_port I noticed that the flush is done way slower than expected. I see SPI activity every 500ms even if I change content at a higher rate.
Verified that the 5ms timer tick is working and lv_timer_handler() is getting called (returns 0xFFFFFFFF).
However I am changing the content from a FreeRTOS timer task
ESP IDF 5.0.1 on an ESP32S3 with LVGL 8.3
void ui_test(TimerHandle_t puiTimer)
{
static int teststage = 0;
switch(teststage)
{
case 0:
lv_label_set_text(ui_TestItem, ".");
break;
case 1:
lv_label_set_text(ui_TestItem, "..");
break;
case 2:
lv_label_set_text(ui_TestItem, "...");
break;
default:
case 3:
lv_label_set_text(ui_TestItem, "....");
break;
}
teststage++;
if(teststage>3)
teststage = 0;
}
void ui_TestScreen_init(void)
{
lv_disp_t * dispp = lv_disp_get_default();
lv_theme_t * theme = lv_theme_default_init(dispp, lv_palette_main(LV_PALETTE_BLUE), lv_palette_main(LV_PALETTE_RED), false, LV_FONT_DEFAULT);
lv_disp_set_theme(dispp, theme);
ui_TestScreen = lv_obj_create(NULL);
lv_obj_clear_flag(ui_TestScreen, LV_OBJ_FLAG_SCROLLABLE); /// Flags
ui_TestItem = lv_label_create(ui_TestScreen);
lv_obj_set_width(ui_TestItem, 32);
lv_obj_set_height(ui_TestItem, 32);
lv_obj_set_x(ui_TestItem, 320/2 - 16);
lv_obj_set_y(ui_TestItem, 50);
lv_label_set_text(ui_TestItem, "B");
lv_disp_load_scr(ui_TestScreen);
}
And somewhere in my startup I call:
ui_TestScreen_init();
uiTimer = xTimerCreate("UI_TestLoop", 25 /* ticks of 10ms */, pdTRUE, NULL, ui_test);
if (uiTimer)
xTimerStart(uiTimer, 0);
What I observe is that ui_test gets called every 250ms, yet I only see SPI activity every 500ms
And looking at the screen, I see ‘animations’ are skipped: only . and … are shown, … and … are missing
Now, if I change task_max_sleep_ms from 500ms to 250ms the update changes to 250ms
The esp_lvgl_port code is here:
The function influenced by the 500ms sleep is the one calling lv_timer_handler() :
static void lvgl_port_task(void *arg)
{
uint32_t task_delay_ms = lvgl_port_ctx.task_max_sleep_ms;
ESP_LOGI(TAG, "Starting LVGL task");
lvgl_port_ctx.running = true;
while (lvgl_port_ctx.running) {
if (lvgl_port_lock(0)) {
task_delay_ms = lv_timer_handler();
lvgl_port_unlock();
}
//debugprint("taskdelay %d ms", task_delay_ms);
if (task_delay_ms > lvgl_port_ctx.task_max_sleep_ms) {
task_delay_ms = lvgl_port_ctx.task_max_sleep_ms;
} else if (task_delay_ms < 1) {
task_delay_ms = 1;
}
vTaskDelay(pdMS_TO_TICKS(task_delay_ms));
}
lvgl_port_task_deinit();
/* Close task */
vTaskDelete( NULL );
}
As written above, task_delay_ms is set to 0xFFFFFFFF by lv_timer_handler() and then capped to 500ms
Most probably I am missing some understanding of the concepts?
EDIT:
CONFIG_LV_DISP_DEF_REFR_PERIOD=30
pointers appreciated!