采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存

这篇具有很好参考价值的文章主要介绍了采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

最近有个项目在做基于stm32h7的交互界面制作,大概需要通过lvgl图形库做11个界面加上一堆控件(可以看一下下面的图,只能说真不少),然后就出现了烧录程序后,就会出现白屏(大概率就是卡死了),一开始想简化一下页面,注释了几个(治标不治本,所以再找了别的方法后面),但又会出现切换几次页面就卡死的情况。。。于是才注意到内存泄露问题,查了好几个文档,也没看太懂,就采用了一个比较粗暴的方式暂时先把问题解决了(目前11个页面疯狂切换不会卡死),之后有时间再研究一下更专业的方法,先分享一下这个比较粗暴的方法哈哈哈。

解决问题1:开机白屏

解决问题2:切换页面卡死

采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存,stm32,嵌入式硬件,单片机,人机交互

一、开机白屏

这个主要是内存不太够,直接初始化完内存就爆了所以白屏了,这部分解决的办法我是采用了外部的sdram来存储(不过正点原子说不推荐哈,但由于内存爆了实在没办法哈哈哈)

具体的操作:

可以参考正点原子的视频:第9讲 基础篇-LVGL移植(外部SRAM)_哔哩哔哩_bilibili

1、由于阿波罗板子自带sdram,所以就省去了移植。直接可以在(我是基于正点原子的例程:实验31 触摸屏实验来搭建的),可以看到在HARDWARE里面有sdram.c,同时例程main.c写好了SDRAM_Init();   所以基本的环境都做好了,直接可以操作了

采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存,stm32,嵌入式硬件,单片机,人机交互

采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存,stm32,嵌入式硬件,单片机,人机交互

2、进入sdram.c,右键选择Toggle Header/Code File跳转到sdram.h文件(也可以直接打开哈)

采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存,stm32,嵌入式硬件,单片机,人机交互

3、复制SDRAM开始地址采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存,stm32,嵌入式硬件,单片机,人机交互

4、打开lv_conf.h文件,修改LV_MEM_ADR=0为这一串代码如下图。 LV_MEM_ADR == (0XC0000000+1280*800*2),其中1280*800*2是因为LCD所需的缓存数组大小为1280*800,同时u16两个字节所以乘2(就是sdram要把这部分大小留给lcd缓存数组,所以需要对内存地址进行偏移)采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存,stm32,嵌入式硬件,单片机,人机交互采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存,stm32,嵌入式硬件,单片机,人机交互5、把内存大小修改的更合适,我原本大概是几十,直接扩大到300就完全够了采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存,stm32,嵌入式硬件,单片机,人机交互

6、烧录,不再白屏了

二、切换页面卡死

1、打开ui.c仔细看下面这个代码,也就是在按下button29的时候会触发事件切换页面,对应切换页面的代码是:

 _ui_screen_change(ui_Screen3, LV_SCR_LOAD_ANIM_FADE_ON, 500, 0);

采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存,stm32,嵌入式硬件,单片机,人机交互

可以看这个切换页面函数内容是什么(在ui_helpers.c文件内):

可以看到切换页面时候,并没有清除上个页面的东西,所以页面切换多了占得内存就多了。

所以要想办法在切换页面时候,清除上个页面的东西。

void _ui_screen_change(lv_obj_t * target, lv_scr_load_anim_t fademode, int spd, int delay)
{   lv_scr_load_anim(target, fademode, spd, delay, false);
}

一开始我看有文档说把false改成true就可以自动清除了,但我试了一下效果不是很理想,所以采用下述方式。

2、清除对象有关的函数介绍

可以参考这个视频,介绍的也很清楚

4.3-LVGL基础知识--创建对象与删除对象_哔哩哔哩_bilibili

最后采用了lv_obj_clean(lv_obj_t*obj)这个函数会比较方便。

3、修改_ui_screen_change函数

主要就是做一个清除再显示的操作。

首先创建对象,然后获取当前活动的屏幕的对象,之后删除该对象(上面的控件会一起删掉)

  lv_obj_t * act_scr = lv_scr_act();
	  lv_obj_clean(act_scr);

然后判断要切到的页面是什么,由于每次都删除了上一个页面,所以需要重新初始化(记得在ui_helpers.c内包含ui.h头文件哈),然后采用显示界面的函数~就OK啦。为什么不用原来 lv_scr_load_anim(target, fademode, spd, delay, false);这个,我也不知道,实测了发现用这个不行。。。后续再对比一下看看嘿嘿。

	if (target == ui_Screen1)
	{
	  ui_Screen1_screen_init();
    lv_disp_load_scr(ui_Screen1);
	}

 完整代码:

void _ui_screen_change(lv_obj_t * target, lv_scr_load_anim_t fademode, int spd, int delay)
{
	  lv_obj_t * act_scr = lv_scr_act();
	  lv_obj_clean(act_scr);
	if (target == ui_Screen1)
	{
	  ui_Screen1_screen_init();
      lv_disp_load_scr(ui_Screen1);
	}
		if (target == ui_Screen2)
	{
	  ui_Screen2_screen_init();
      lv_disp_load_scr(ui_Screen2);
	}
			if (target == ui_Screen3)
	{
	    ui_Screen3_screen_init();
       lv_disp_load_scr(ui_Screen3);
	}
	
			if (target == ui_Screen4)
	{
	    ui_Screen4_screen_init();
		 lv_disp_load_scr(ui_Screen4);
	}
	
			if (target == ui_Screen5)
	{
        ui_Screen5_screen_init();
		 lv_disp_load_scr(ui_Screen5);
	}
	
			if (target == ui_Screen6)
	{
	    ui_Screen6_screen_init();
      lv_disp_load_scr(ui_Screen6);
	}
	
			if (target == ui_Screen7)
	{
	    ui_Screen7_screen_init();
    lv_disp_load_scr(ui_Screen7);
	}
	

}

欢迎大家交流~文章来源地址https://www.toymoban.com/news/detail-839592.html

到了这里,关于采用一种比较粗暴的方法解决lvgl切换screen时候造成的卡死问题/LVGL/stm32/内存的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 关于小程序如何长按复制长文本的方法(比较简单的一种)

    在我们开发小程序时,可能会遇到一些场景,需要你复制弹框中的链接到手机浏览器中访问。 方法如下: 1.首先需要一个view盒子,添加css属性word-break: break-all;这个是自动换行用的避免文本过长跑出盒子外。 2.在上面的view盒子中包一个text长文本,并设置属性selectable=\\\"true\\\" user-sele

    2024年02月15日
    浏览(42)
  • 一种实现Spring动态数据源切换的方法 | 京东云技术团队

    不在现有查询代码逻辑上做任何改动,实现dao维度的数据源切换(即表维度) 节约bdp的集群资源。接入新的宽表时,通常uat验证后就会停止集群释放资源,在对应的查询服务器uat环境时需要查询的是生产库的表数据(uat库表因为bdp实时任务停止,没有数据落入),只进行服务

    2024年02月10日
    浏览(47)
  • unity多个物体多种材质切换效果实现方法(方法比较笨,还有不足之处多多指导)

    多种材质切换:获取物体的MeshRenderer组件上所有的材质球,并将其存放到数组中;创建另一个数组存放需要新材质球,通过循环遍历将将需要替换的材质球存放在创建好的数组内。 比如说同时给象棋的棋盘和棋子切换不同材质,具体步骤如下: 1.分别导入棋盘、棋子模型;黑

    2024年02月17日
    浏览(33)
  • ESP32在Arduino框架下采用SPI或8bit并口方式使用LVGL(v8.3)

    小相机,按一下能拍照,并将照片保存在sd卡中。 使用的时VSCode+PlatformIO进行开发(强力推荐,用了就回不去了),当然也可以使用ArduinoIDE进行开发。 具体怎么使用上述软件,网上有很多答案,可以自行查找。 ESP-IDF移植教程:点击这里 使用到的库: TFT_eSPI 和 lvgl 注: 8bi

    2024年02月05日
    浏览(39)
  • 一种采用KeePass+自建webdav服务的密码管理方案

    出于密码管理需求,查找了几种密码方案,发现KeePass+坚果云+keepass2android是大家反馈比较好的一种,支持电脑手机同步管理密码,深入使用后发现体验还不错,恰巧本身有公网ip,遂决定自建webdav服务来进行密码管理,进一步把安全掌握在自己手里。 需要有一台已经安装了

    2024年02月11日
    浏览(34)
  • lvgl实现动态切换横竖屏

    有两种方式。一种是通过lvgl自带的软件选择。但是这个效率很慢。而且只支持90度、180度、270度的旋转。不一定达到想要的效果。我需要实现的是这种效果。软件旋转没有办法实现。旋转后会镜像过去。而且如果你的屏幕不是等比例的。比如240*240  320*320软件旋转270度或者9

    2024年02月12日
    浏览(27)
  • 云计算采用的各种虚拟化技术比较

    KVM 是一个全虚拟化的解决方案。可以在 x86 架构的计算机上实现虚拟化功能。但 KVM 需要 CPU 中虚拟化功能的支持,只可在具有虚拟化支持的 CPU 上运行,即具有 VT 功能的 Intel CPU 和具有 AMD-V 功能的 AMD CPU。 Xen 也是 Linux 下的一个虚拟化解决方案,也将很快被编入内核中。Xen

    2024年02月01日
    浏览(35)
  • LVGL学习(5):物理按键切换焦点之焦点保存和恢复

    最近在做的项目用到了LVGL,基于实际产品使用的特殊情况,屏幕没有接触摸屏,而是使用物理按键来控制所有的object,而且硬件上只有四个按键,功能分别是:返回、左/上、右/下和确定,在切换界面的过程中,也引出了一个焦点切换问题。

    2024年02月08日
    浏览(34)
  • 服务器无法调用gym中的render,采用Monitor保存视频的方法解决

    由于服务器上没有图形化界面,所以在调用gym中的 render() 函数时,会报错 pyglet.canvas.xlib.NoSuchDisplayException: Cannot connect to \\\"None\\\" 。 思路是:把视频保存下来,下载到本地再看。 直接调用 gym.wrappers.Monitor 把视频保存到本地 代码示例如下: outdir 为视频保存路径; video_callable 表

    2023年04月09日
    浏览(26)
  • LVGL笔记(6)-电子相册使用手势切换图片(windows仿真)

    今天看了一下lvgl的EVENT枚举,有一个事件 LV_EVENT_GESTURE 是响应手势滑屏的,就把电子相册的按键改为手势操作。 参考文章: 1.作者:weixin_46964996,文章: LVGL 的 LV_EVENT_GESTURE 2.我自己的文章: LVGL笔记(2)-电子相册(windows模拟和ESP32-S3) 先看看效果: 手势滑动相册 这个lvgl的事

    2024年02月11日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包