GUI Guider生成,lvgl切换页面导致内存溢出卡死终极解决方案

明明只有两个页面,两个页面都只放了一个按钮,为啥为内存溢出?原因是什么?

LVGL卡死原因有千千万万,我访问查询论坛、百度、星火AI,得出了卡死原因大致分为以下两种:

1. 因为线程不安全,freertos任务抢占GUI资源导致的卡死

2. 因为内存溢出导致的卡死,这个也分多种,比如你编译的时候就不行了,就爆了,都没下载烧录的事;或者编译正常,LCD触摸屏却死活不正常,这个也有很多种可能;还有就是本文要讲的,因为频繁切换页面导致的卡死。

其他的原因过两天再发博客总结。

http://t.csdnimg.cn/Nn8Vn

为啥频繁切换页面会卡死?我测试发现(卡死的代码),隔一秒切换一次的情况下,上电进入A界面,切换进入B,再点击A就卡死,没反应了。

首先排除线程不安全的原因,我只使用了一个GUI进程。

有可能是因为图片太大太多的原因,好吧,我承认是挺大的,480*320的16位彩色图片一张,可是我两个页面用的是同一张图片啊。万万没想到,我大胆猜测,图片不是视作同一张,居然瞎猫碰到死耗子猜中了。

在“gui_guider.h”文件中我们可以看到lv_ui结构体,这里是控件对象集合。于是我尝试改成只有一张图片。

5d97d28d793346758e954d06a7632ece.png

但是只有一张图片,却也还是卡死了。我真的百思不得其解啊,按道理商业上使用相当广泛,这就爆了还玩啥。在相当郁闷的情况下我看到了下面这个论坛帖子:

LVGL求助,在主线程里调用芯片的定时器切换界面,结果导致界面卡死,怎么解决定时器线程卡死这个问题呀 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! (armbbs.cn)

一句话总结:一次创建,多次使用;用到就开,不用就关;内容太多放外边存,内容少直接一直加载。

卡死的真正原因很可能是产生了内存碎片,使得原本就不富裕的内存空间雪上加霜。页面切换采用的是动态create(),即使切换界面删除,作用相当有限,因为你还没释放完全呢。

这里的开是指关闭隐藏,关是开启隐藏。

帖子的代码我没看,一时兴奋就跑去查了lvgl文档,原来只要加flag就能隐藏。这就好办了,只要一个页面就能显示多个界面啊。不过GUI界面要重新画。

52c18f9044e949e58f2318723d4fae20.png

73bef0e0cf7b474b82999585d6cf8a7a.png

鼠标移到左下角控件的右边,能看到一个眼睛图标。

f10942b8d4164839a0faf9ab8e352bcb.png

我猜测,GUI Guider能生成代码,一般来说,软件能操作的,肯定是lvgl提供的接口的子集。也就是说,软件能做到的,代码就能直接写。 

在界面切换的按键控件上方右键,添加事件。

d1dcb68a542f4f62bf8d4240da118bec.png

切换界面的时候把当前界面的控件关了,开即将进入的控件。

页面切换很流畅。

还有一个博主的思路也很不错,大家可以尝试一下

【LVGL开启页面切换同时清理内存引发的内存安全问题 - CSDN App】http://t.csdnimg.cn/oG6pL

  • 26
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值