您尚未登录。

楼主 # 2021-12-27 17:34:44

shuimogezi
会员
所在地: 北京
注册时间: 2018-07-14
已发帖子: 29
积分: 27

lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

这几天玩ESP8266,并且移植了LVGL(LVGL版本是V7.10.1),通过lvgl的图片显示功能,每隔5秒切换一张图片,图片使用NXP的GUI Builder直接生成的保存到ROM里面,通过调用lv_img_set_src实现图片的切换,经过一段时间测试,会发现反复调用这个函数后会死机,屏蔽掉后系统运行正常。运行平台:ESP8266。有知道的小伙伴帮忙答疑一下。

离线

#1 2021-12-27 17:59:46

卓林
会员
注册时间: 2021-01-10
已发帖子: 73
积分: 75.5

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

你是不是每次设置的时候都重新创建了一个img对象,导致ram溢出了?

离线

楼主 #2 2021-12-27 18:03:00

shuimogezi
会员
所在地: 北京
注册时间: 2018-07-14
已发帖子: 29
积分: 27

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

卓林 说:

你是不是每次设置的时候都重新创建了一个img对象,导致ram溢出了?

我也尝试使用lv_obj_del删除img对象,然后再重新创建,发现结果还是一样的。

离线

#3 2021-12-28 11:40:09

卓林
会员
注册时间: 2021-01-10
已发帖子: 73
积分: 75.5

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

如果可以的话,建议把代码发出来看一看

离线

#5 2021-12-28 14:14:13

novice
会员
注册时间: 2019-07-26
已发帖子: 80
积分: 66

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

C标准库的:void *memset(void *dest, int c, size_t count);

楼主的用法:memset(var_buff,"hello lvgl",64);

memset不是这样用的吧?难道是私有memset?

离线

#6 2021-12-28 21:54:27

伍零壹
会员
注册时间: 2019-12-16
已发帖子: 139
积分: 92

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

用memcpy试试

离线

楼主 #8 2021-12-28 23:23:20

shuimogezi
会员
所在地: 北京
注册时间: 2018-07-14
已发帖子: 29
积分: 27

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

novice 说:

C标准库的:void *memset(void *dest, int c, size_t count);

楼主的用法:memset(var_buff,"hello lvgl",64);

memset不是这样用的吧?难道是私有memset?

不好意思,那个是因为贴本网站上源码,删减一些没用的源码时不小心删错的,memset和memcpy两个删重组了,这个问题可以忽略。目前是重复调用lv_img_set_src的时候会造成死机。

离线

楼主 #9 2021-12-28 23:27:08

shuimogezi
会员
所在地: 北京
注册时间: 2018-07-14
已发帖子: 29
积分: 27

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

伍零壹 说:

用memcpy试试

不好意思,那个是回帖子贴源码时删减不当造成的(memset和memcpy删减),这个memset的问题可以忽略,目前是重复调用lv_img_set_src会死机。

如果吧这句话(lv_img_set_src)屏蔽,ESP8266重新断开wifi连接后,不会死机,设备可以正常运行;当调用lv_img-set_src时,同样的操作设备会死机。

离线

楼主 #10 2021-12-29 08:20:19

shuimogezi
会员
所在地: 北京
注册时间: 2018-07-14
已发帖子: 29
积分: 27

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

卓林 说:

如果可以的话,建议把代码发出来看一看

void task_gui_process_disptileview_cb(lv_task_t *task)
{
    static uint8_t var_buff[64] = {0};
    static wifi_ap_record_t ap_record_t = {0};
    lv_ui *ui = task->user_data;
   
    memset(var_buff,0x00,64);

    memcpy(var_buff,"hello",5);

    lv_label_set_text(ui->screen1_date_time, (char *)var_buff);

    esp_wifi_sta_get_ap_info(&ap_record_t);
    if(ap_record_t.rssi <= -100)
    {
        lv_img_set_src(ui->screen1_img_wifi,&_wifi_zero_alpha_18x16);
    }
    else if((-100 < ap_record_t.rssi)&&(ap_record_t.rssi <= -80))
    {
        lv_img_set_src(ui->screen1_img_wifi,&_wifi_one_alpha_18x16);
    }
    else if((-80 < ap_record_t.rssi)&&(ap_record_t.rssi <= -70))
    {
        lv_img_set_src(ui->screen1_img_wifi,&_wifi_two_alpha_18x16);
    }
    else if((-70 < ap_record_t.rssi)&&(ap_record_t.rssi < 0))
    {
        lv_img_set_src(ui->screen1_img_wifi,&_wifi_three_alpha_18x16);
    }
    else
    {
        lv_img_set_src(ui->screen1_img_wifi,&_WIFI_13_alpha_18x16);
    }
}

离线

#11 2021-12-29 10:33:22

一篮子bug
会员
注册时间: 2019-08-23
已发帖子: 82
积分: 76.5

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

我在esp32上v5.3使用的情况看,lvgl导致rtos挂掉的,多出现在在lv_task_hander之外的线程调用了lv_obj_del导致,这个跨线程删除控件,有一定的操作风险,而这个风险导致rtos挂掉是随机出现的;建议del操作,建立一个lv_task来做del;
v7版本有个lv_obj_del_async的操作就是,你可以尝试一下看
我怀疑崩掉不一定是这里的问题

最近编辑记录 一篮子bug (2021-12-29 10:35:43)

离线

楼主 #12 2021-12-29 14:49:39

shuimogezi
会员
所在地: 北京
注册时间: 2018-07-14
已发帖子: 29
积分: 27

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

@一篮子bug

首先,我是使用的lvgl自带的任务函数创建的一个任务显示操作的任务,并没有在2个线程中操作lvgl相关的函数之类的,所以这个排除了,而且我也尝试过使用lv_obj_del(立即删除对象)和lv_obj_async_del(下个周期删除对象),结果还是会死机。

离线

楼主 #13 2022-01-04 11:18:01

shuimogezi
会员
所在地: 北京
注册时间: 2018-07-14
已发帖子: 29
积分: 27

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

问题已解决,2个地方:

1:在wifi断开连接后,不应该继续调用esp_wifi_sta_get_ap_info函数来获取AP信息。

2:最后发现NXP的gui builder创建的工程控件布置不知什么时候都错乱了(之前没有错乱,可能是拷贝.guiguider文件并直接修改导致的,虽然显示正常,但是父级子级关系乱了,重新改过来,摆正关系后,正常)

离线

#14 2022-01-04 11:27:27

达克罗德
会员
注册时间: 2018-04-10
已发帖子: 1,081
积分: 1043.5

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

@shuimogezi
所有GUI都不支持多线程直接操作的(除非通过特殊的方式)。你只能在GUI的事件回调里操作UI的object,因为回调是在GUI线程被调用的。
你以为你只有一个线程在操作UI,实际上UI的事件循环那个任务就是UI主线程,你这两个线程在抢同一个资源,你设置和删除image,UI主线程又不知道,它当然会崩溃。

离线

楼主 #15 2022-01-05 13:28:07

shuimogezi
会员
所在地: 北京
注册时间: 2018-07-14
已发帖子: 29
积分: 27

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

@达克罗德
你说的和我操作的情况不一样,首先,我没有在两个线程中操作GUI,也没有在调用UI Handle的线程中独立操作GUI,而是在GUI提供的回调接口中操作的。所以不存在抢占的问题。而且是间隔5秒执行一次GUI回调(LVGL提供的多任务回调注册接口)。

离线

楼主 #16 2022-01-05 13:30:54

shuimogezi
会员
所在地: 北京
注册时间: 2018-07-14
已发帖子: 29
积分: 27

Re: lvgl7重复调用lv_img_set_src后造成系统(RTOS)死机

@达克罗德
我的问题已经解决了,在上面评论中,我自己做的回复,另外对LVGL内存使用的监控(采用串口打印LVGL动态内存使用情况)也很重要,如果LVGL内存临界的话,也会出现死机或者其他的问题。

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn