Advertencia de salida de la interfaz de conmutación LVGL
Active un temporizador para actualizar la fuente de la imagen en tiempo real, genere una advertencia una vez que se cambia la interfaz y la advertencia desaparece después de bloquear lv_img_set_src
static void timer_event_handler(lv_timer_t * timer)
{
//lv_img_set_src(guider_ui.main_img_1, &image_256x80);/*设置图片源 From variable*/
}
static void lv_timer_test()
{
static uint32_t user_data = 10;
lv_timer_t * timer1 = lv_timer_create(timer_event_handler,100,(void *)&user_data);
}
void GUI_APP(void)
{
setup_ui(&guider_ui);
lv_timer_test();
}
Solución
Keil encontró el siguiente error
Solución
Método 1
Cambie el formato de codificación de ingeniería a GB2312
Método 2
Haga clic en el icono de la varita mágica, cambie a la barra de opciones de C/C++ y agregue opciones de compilación a Misc Controls:
--no-multibyte-chars
Cómo convertir por lotes la codificación de archivos keil a utf-8
El cambio de página de la interfaz con animación está bloqueado
En la interfaz principal, la visualización de la animación se realiza a través de anim. Si hace clic en la configuración para cambiar de página, la máquina se bloqueará.
//目标刷新
static void tag_anim_event_handler(void *var, int32_t v)
{
}
//图片和label刷新
static void img_anim_event_handler(void *var, int32_t v)
{
lv_ui *ui = (lv_ui *)var;
lv_img_set_src(ui->main_img_1, &image_256x80);/*设置图片源 From variable*/
lv_label_set_text_fmt(ui->main_label,"%d",v);
}
static void lv_anim_test(lv_ui *ui)
{
lv_anim_t a;
lv_anim_init(&a);
lv_anim_set_var(&a, ui);
lv_anim_set_exec_cb(&a, img_anim_event_handler);
lv_anim_set_values(&a, 0, 10); //设置开始和结束值
lv_anim_set_time(&a, 2000);
lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE);
lv_anim_start(&a);
lv_anim_set_exec_cb(&a, tag_anim_event_handler);
lv_anim_set_time(&a, 2000);
lv_anim_start(&a);
}
void setup_scr_main(lv_ui *ui)
{
ui->main = lv_obj_create(NULL);
lv_anim_test(ui);
//Init events for screen
events_init_main(ui);
}
Solución
Al analizar el programa anterior, después de cambiar de página, se liberará el espacio de estructura de componentes de la página principal, lo que hará que ui->main_img_1, ui->main_label se conviertan en punteros salvajes, pero la función de devolución de llamada img_anim_event_handler aún se llamará regularmente para actualizar la imagen. , lo que provoca un bloqueo, por lo que cuando se usa antes de ui->main_img_1, el puntero ui->main_label juzga si es un puntero salvaje, a través de la función lv_obj_is_valid(ui->main_img_1).
static void img_anim_event_handler(void *var, int32_t v)
{
lv_ui *ui = (lv_ui *)var;
if(!lv_obj_is_valid(ui->main_img_1)) return; //如果是野指针,则退出
lv_img_set_src(ui->main_img_1, &image_256x80);/*设置图片源 From variable*/
lv_label_set_text_fmt(ui->main_label,"%d",v);
}