LVGL切换界面输出警告
开启了一个定时器实时刷新图片源,一旦切换界面就输出警告,屏蔽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();
}
解决方法
keil遇到如下错误
解决方法
方法1
将工程编码格式切换为GB2312
方法2
点击魔术棒图标,切换到C/C++选项栏,Misc Controls 中添加编译选项:
--no-multibyte-chars
如何批量将keil文件编码转换为utf-8
对有动画的界面进行页面切换卡死
在主界面通过anim实现动画显示,点击设置进行页面切换会死机
//目标刷新
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);
}
解决方法
分析上面程序,切换页面之后主页面的组件结构体空间会被释放,导致ui->main_img_1,ui->main_label成为野指针,但是img_anim_event_handler回调函数仍然会定时调用来刷新图片,导致死机,所以在使用ui->main_img_1,ui->main_label指针之前判断是否为野指针,通过函数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);
}