这几天玩ESP8266,并且移植了LVGL(LVGL版本是V7.10.1),通过lvgl的图片显示功能,每隔5秒切换一张图片,图片使用NXP的GUI Builder直接生成的保存到ROM里面,通过调用lv_img_set_src实现图片的切换,经过一段时间测试,会发现反复调用这个函数后会死机,屏蔽掉后系统运行正常。运行平台:ESP8266。有知道的小伙伴帮忙答疑一下。
技术狂,追求技术更高层,哈哈哈
离线
你是不是每次设置的时候都重新创建了一个img对象,导致ram溢出了?
我也尝试使用lv_obj_del删除img对象,然后再重新创建,发现结果还是一样的。
技术狂,追求技术更高层,哈哈哈
离线
C标准库的:void *memset(void *dest, int c, size_t count);
楼主的用法:memset(var_buff,"hello lvgl",64);
memset不是这样用的吧?难道是私有memset?
不好意思,那个是因为贴本网站上源码,删减一些没用的源码时不小心删错的,memset和memcpy两个删重组了,这个问题可以忽略。目前是重复调用lv_img_set_src的时候会造成死机。
技术狂,追求技术更高层,哈哈哈
离线
用memcpy试试
不好意思,那个是回帖子贴源码时删减不当造成的(memset和memcpy删减),这个memset的问题可以忽略,目前是重复调用lv_img_set_src会死机。
如果吧这句话(lv_img_set_src)屏蔽,ESP8266重新断开wifi连接后,不会死机,设备可以正常运行;当调用lv_img-set_src时,同样的操作设备会死机。
技术狂,追求技术更高层,哈哈哈
离线
如果可以的话,建议把代码发出来看一看
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);
}
}
技术狂,追求技术更高层,哈哈哈
离线
@一篮子bug
首先,我是使用的lvgl自带的任务函数创建的一个任务显示操作的任务,并没有在2个线程中操作lvgl相关的函数之类的,所以这个排除了,而且我也尝试过使用lv_obj_del(立即删除对象)和lv_obj_async_del(下个周期删除对象),结果还是会死机。
技术狂,追求技术更高层,哈哈哈
离线
问题已解决,2个地方:
1:在wifi断开连接后,不应该继续调用esp_wifi_sta_get_ap_info函数来获取AP信息。
2:最后发现NXP的gui builder创建的工程控件布置不知什么时候都错乱了(之前没有错乱,可能是拷贝.guiguider文件并直接修改导致的,虽然显示正常,但是父级子级关系乱了,重新改过来,摆正关系后,正常)
技术狂,追求技术更高层,哈哈哈
离线
@达克罗德
你说的和我操作的情况不一样,首先,我没有在两个线程中操作GUI,也没有在调用UI Handle的线程中独立操作GUI,而是在GUI提供的回调接口中操作的。所以不存在抢占的问题。而且是间隔5秒执行一次GUI回调(LVGL提供的多任务回调注册接口)。
技术狂,追求技术更高层,哈哈哈
离线
@达克罗德
我的问题已经解决了,在上面评论中,我自己做的回复,另外对LVGL内存使用的监控(采用串口打印LVGL动态内存使用情况)也很重要,如果LVGL内存临界的话,也会出现死机或者其他的问题。
技术狂,追求技术更高层,哈哈哈
离线