Hi everyone. I’m trying to run an LVGL task currently alongside a USB task and am experiencing issues with a blue blinking screen. I think is a problem of priority but don’t know who to fix it.
What I’ve tried:
- Changing task priorities
- Adding vTaskDelay()
- Adding mutex (lv_lock())
Others informations:
- Freertos tickrate: 1000Hz
- Refresh rate: 33ms
- LV_MEM 128kb
Code:
void usb_host_task(void *param) {
(void) param;
printf("TinyUSB Init\r\n");
init_tinyusb();
while (1) {
lv_lock();
tuh_task();
lv_unlock();
vTaskDelay(5);
}
}
void lvgl_task(void *pvParameters) {
while (1) {
lv_lock();
ui_tick();
lv_unlock();
uint32_t time_till_next;
time_till_next = lv_timer_handler();
if(time_till_next == LV_NO_TIMER_READY) time_till_next = LV_DEF_REFR_PERIOD;
vTaskDelay(5);
}
}
void init_screen(void)
{
ESP_LOGI(TAG, "Init Screen...");
bsp_display_cfg_t cfg = {
.lvgl_port_cfg = ESP_LVGL_PORT_INIT_CONFIG(),
.buffer_size = BSP_LCD_DRAW_BUFF_SIZE,
.double_buffer = BSP_LCD_DRAW_BUFF_DOUBLE,
.flags = {
.buff_dma = true,
.buff_spiram = false,
.sw_rotate = false,
}
};
lv_display_t *display = bsp_display_start_with_config(&cfg);
// LVGL needs a system tick to know elapsed time for animations and other tasks.
lv_tick_set_cb(xTaskGetTickCount);
bsp_display_backlight_on();
lv_lock();
ui_init();
lv_unlock();
TaskHandle_t lvgl_task_handle;
xTaskCreate(lvgl_task, "LVGL_Task", 16384, NULL, 5, &lvgl_task_handle);
}
void initTask(void *pvParameters)
{
esp_err_t err;
esp_err_t err = nvs_flash_init();
if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
ESP_ERROR_CHECK(nvs_flash_erase());
err = nvs_flash_init();
}
init_screen();
usb_init();
xTaskCreateStatic(usb_host_task, "usbh", USB_STACK_SIZE, NULL, configMAX_PRIORITIES-5, usb_stack, &usb_taskdef);
set_var_loading_status("Loading programs and files...");
print_dev_conf();
init_fs();
set_var_loading_status("Inizializing network services...");
err = esp_event_loop_create_default();
if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
ESP_ERROR_CHECK(err);
}
err = esp_netif_init();
if (err != ESP_OK && err != ESP_ERR_INVALID_STATE) {
ESP_ERROR_CHECK(err);
}
init_net();
set_var_loading_status("Initialization complete");
set_var_boot_finished(true);
vTaskDelete(NULL);
}
void app_main(void)
{
xTaskCreate(initTask, "InitTask", 8192, NULL, 10, &init_task);
}