Aviso de saída da interface de comutação LVGL
Ative um cronômetro para atualizar a fonte da imagem em tempo real e emita um aviso assim que a interface for trocada, e o aviso desaparece após o bloqueio de 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();
}
Solução
Keil encontrou o seguinte erro
Solução
Método 1
Mude o formato de codificação de engenharia para GB2312
Método 2
Clique no ícone da varinha mágica, mude para a barra de opções C/C++ e adicione opções de compilação aos controles diversos:
--no-multibyte-chars
Como converter em lote a codificação de arquivo keil para utf-8
A troca de página da interface com animação está travada
Na interface principal, a exibição da animação é realizada através do anim. Se você clicar na configuração para mudar de página, a máquina irá travar.
//目标刷新
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);
}
Solução
Analisando o programa acima, após a troca de página, o espaço da estrutura do componente da página principal será liberado, fazendo com que ui-> main_img_1, ui-> main_label se tornem ponteiros selvagens, mas a função de retorno de chamada img_anim_event_handler ainda será chamada regularmente para atualizar a imagem , resultando em uma falha, portanto, ao usar Before ui->main_img_1, o ponteiro ui->main_label julga se é um ponteiro selvagem, por meio da função 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);
}