明明只有两个页面,两个页面都只放了一个按钮,为啥为内存溢出?原因是什么?
LVGL卡死原因有千千万万,我访问查询论坛、百度、星火AI,得出了卡死原因大致分为以下两种:
1. 因为线程不安全,freertos任务抢占GUI资源导致的卡死
2. 因为内存溢出导致的卡死,这个也分多种,比如你编译的时候就不行了,就爆了,都没下载烧录的事;或者编译正常,LCD触摸屏却死活不正常,这个也有很多种可能;还有就是本文要讲的,因为频繁切换页面导致的卡死。
其他的原因过两天再发博客总结。
为啥频繁切换页面会卡死?我测试发现(卡死的代码),隔一秒切换一次的情况下,上电进入A界面,切换进入B,再点击A就卡死,没反应了。
首先排除线程不安全的原因,我只使用了一个GUI进程。
有可能是因为图片太大太多的原因,好吧,我承认是挺大的,480*320的16位彩色图片一张,可是我两个页面用的是同一张图片啊。万万没想到,我大胆猜测,图片不是视作同一张,居然瞎猫碰到死耗子猜中了。
在“gui_guider.h”文件中我们可以看到lv_ui结构体,这里是控件对象集合。于是我尝试改成只有一张图片。
但是只有一张图片,却也还是卡死了。我真的百思不得其解啊,按道理商业上使用相当广泛,这就爆了还玩啥。在相当郁闷的情况下我看到了下面这个论坛帖子:
一句话总结:一次创建,多次使用;用到就开,不用就关;内容太多放外边存,内容少直接一直加载。
卡死的真正原因很可能是产生了内存碎片,使得原本就不富裕的内存空间雪上加霜。页面切换采用的是动态create(),即使切换界面删除,作用相当有限,因为你还没释放完全呢。
这里的开是指关闭隐藏,关是开启隐藏。
帖子的代码我没看,一时兴奋就跑去查了lvgl文档,原来只要加flag就能隐藏。这就好办了,只要一个页面就能显示多个界面啊。不过GUI界面要重新画。
鼠标移到左下角控件的右边,能看到一个眼睛图标。
我猜测,GUI Guider能生成代码,一般来说,软件能操作的,肯定是lvgl提供的接口的子集。也就是说,软件能做到的,代码就能直接写。
在界面切换的按键控件上方右键,添加事件。
切换界面的时候把当前界面的控件关了,开即将进入的控件。
页面切换很流畅。
还有一个博主的思路也很不错,大家可以尝试一下
【LVGL开启页面切换同时清理内存引发的内存安全问题 - CSDN App】http://t.csdnimg.cn/oG6pL