LVGL仿真调试日志-内存溢出

错误日志:

Warn: Couldn't allocate memory (lv_mem.c #208 lv_mem_alloc())
Warn: Couldn't allocate memory (lv_mem.c #208 lv_mem_realloc())
Error: _lv_mem_buf_get (lv_mem.c #533 _lv_mem_buf_get())
Error: Out of memory,can't allocate a new buffer (increase your LV_MEM_SIZE/heap size (0x00000000) (lv_debug.c #127 lv_debug_log_error())

从打印信息可以看出某个地方一直在分配内存,导致LVGL仿真时崩溃,自动停止。
(PS:当初上板时,由于LVGL打印错误信息使用的是封装好的打印函数,并没有重定位输出串口,导致没有打印出对应的错误信息,后来使用Visaul Studio仿真时,才发现是内存溢出。)

这时候我们只要找到哪个地方一直在不断偷偷的分配内存就行了,需要注意的是:LVGL是整体预先分配了个独立内存空间,如果你使用的是带操作系统的程序,是不能使用操作系统自带的内存检测函数去找到内存溢出的地方。
(PS:开始检测软件运行使用的是FreeRTOS,自带了对应的内存查询/函数,但结果是堆栈变化一直保持静止状态。)

//记录下FreeRTOS内存查询所调用的API定义位置
/*—————————————————————freertos查看堆栈空间———————————————————————————*/
#include "freertos/FreeRTOS.h"
printf("xPortGetFreeHeapSize = %d\r\n", xPortGetFreeHeapSize());
printf("xPortGetMinimumEverFreeHeapSize = %d\r\n",xPortGetMinimumEverFreeHeapSize());
#include "freertos/task.h"
printf("the min free stack size is %d \r\n",(int32_t)uxTaskGetStackHighWaterMark(NULL));

后经查询,最终在lv_mem.h中找到了LVGL官方定义的内存空间查询API:

/*** Give information about the work memory of dynamic allocation* @param mon_p pointer to a dm_mon_p variable,*              the result of the analysis will be stored here*/
void lv_mem_monitor(lv_mem_monitor_t * mon_p);/*** Heap information structure.*/
typedef struct {uint32_t total_size; /**< Total heap size */uint32_t free_cnt;uint32_t free_size; /**< Size of available memory */uint32_t free_biggest_size;uint32_t used_cnt;uint32_t max_used; /**< Max size of Heap memory used */uint8_t used_pct; /**< Percentage used */uint8_t frag_pct; /**< Amount of fragmentation */
} lv_mem_monitor_t;/*** 定义一个lv_mem_monitor_t结构体变量,再使用lv_mem_monitor()调用,最终内存使用情况将会记录在mem_monitor变量当中。*/
lv_mem_monitor_t mem_monitor;
lv_mem_monitor(mem_monitor);

其中的total_size为堆总空间,free_size为堆剩余空间,两者相减就是当前堆-也就是用户分配使用空间的情况。

通过以上API最终定位到问题所在:声明为全局的lv_style_t变量,在函数中循环调用lv_style_init()时,会导致在堆中不断的新建空间,最终导致lvgl内存空间溢出。

总结:在调试UI时,建议使用LVGL官方提供的Visual Studio进行仿真,并加入内存空间检测,防止实物在长时间运行后导致内存溢出,进而导致显示异常,最终检测无误后在上板运行。

小明分享|LVGL调试日志相关推荐

  1. 小明分享|8ms平台下工程源码分析

    今天小明为大家分享的是开发工具平台-8ms(www.8ms.xyz)工程源码分析 1.打开"8ms平台",创建工程制作完UI后,选中"编译"一栏,等待结束后,选 ...

  2. 小明分享|sigmstar SSD201/SSD202 针对MIPI的LCD屏配置操作说明分享,更多Sigmastar相关技术文档及沟通讨论,可以给小明留言,小明邀请你进入我们的技术沟通群

    小明会定期分享SigmastarSSD201/202相关芯片技术文档!我们也有一个Sigmastar技术沟通群聊!有感兴趣的开发小伙伴也可以留言给小明,小明邀请你进入! SSD20X 平 台 LCD ...

  3. 小明分享:SSD201/202系统烧录篇,多种烧录方式,小明都做了分享,有需要的小伙伴拿走不谢哈!更多资料需求可以关注我,我是启明云端的小明MM!

    一.ISP 烧录 当 flash 没有烧过系统或系统损坏时,可以先通过 ISP 烧录 boot,然后再通过 eth.usb 或 sd 烧录完整的系统. 下载并解压 tools/ssd201_ISP_5 ...

  4. 小明分享|嵌入式LINUX开发日志-错误汇总①

    SSD201 QT移植编译错误解决 book@100ask:~/SSD201/qt-everywhere-src-5.15.0$ ./make.sh mkdir: cannot create dire ...

  5. 小明分享|基于VSCode Espress IDF软件环境搭建

    VS code下载网址: --现版本安装包大小大约60M左右,是一个轻量级但功能强大的源代码编辑器,适用于Windows.macOS和Linux.支持安装扩展各类应用插件. https://code. ...

  6. 小明分享|NRF52840和NRF52810蓝牙模块测试

    一.主机模式-从机模式蓝牙测试(WT52840-S1) WT52840-S1是启明云端基于Nordic公司的nRF52840为核心处理器的高性能.超低功耗(Bluetooth Low Energy)的 ...

  7. 小明分享|nRF52840 蓝牙模块连接测试

    一.可主从配对蓝牙模组 1.测试前准备 硬件准备 两台PC机.(2块)WT52840-S1模组,转接板,USB数据线 软件准备 蓝牙串口调试助手 2.测试 (1)将WT52840-S1模组分别通过转接 ...

  8. 小明分享:8ms平台入门教程

    www.8ms.xyz 入门教程, [详细资料获取](http://doc.8ms.xyz/docs/gui-001/gui-001-1cinrj630tggq) 一. 注册个人账号 1.点击主页的& ...

  9. 小明分享:Esp32下softAP+tcp_server的简单实现

    ***提示:对于初学者尽量选择ESP32开发板来完成***原因如下: [ ]WT-ESP32-DevKitC V4的射频性能已经调试完善,用户进行应用设计和开发时无需考虑射频和天线设计.此开发板包含了 ...

最新文章

  1. Oracle 数据库 - sql语句筛选出符合查询条件的第一条结果实例演示,sql查询结果只显示指定行数的数据方法
  2. 垃圾热解气化工艺的电气、仪表及控制系统设计
  3. Qt 中 QXml/QDom*** api设计吐槽
  4. C# 中居然也有切片语法糖,太厉害了
  5. tyvj/joyOI 1305-最大子序和【单调队列】
  6. C++11新特性之左值右值及移动语句与完美转发
  7. 让我们在退烧中更清醒:谨慎投机性创业和投资的危害
  8. 列出IIS上的虚拟目录和网站信息。
  9. 理解Android的手势识别
  10. MySQL-5.6.14-winx64的免安装配置方法
  11. linux项目实验ppt下载,实验一Linux系统的使用.ppt
  12. Axure制作微信APP原型(二)登录注册模块
  13. 35岁逃离北上广,40岁失业送外卖,中年人的“体面”在于投资自己
  14. DTL相关知识整理初稿
  15. Xiuno 简约白色主题
  16. 1、什么是实际的电压源与电流源?
  17. latex数学公式神器Mathpix
  18. 前端微信签名验证工具_微信支付服务商签名验证无误,但是统一下单后服务器返回【签名错误】...
  19. UVa12325 12325 - Zombie‘s Treasure Chest(思路+代码)
  20. uniapp 微信小程序 swiper修改指示点的位置和样式

热门文章

  1. openstack万兆交换机设置mtu值
  2. pandas(二) -- Dataframe创建及索引
  3. 使用docker-compose配置redis服务
  4. 【收藏】webpack configuration.module has an unknown property ‘loaders‘. These properties arevalid: 解决办法
  5. 【收藏】spark中map与mapPartitions区别
  6. docker数据卷volume详解
  7. nginx 配置文件nginx.conf结构
  8. redis sorted_set数据类型常用命令及跳表skip_list原理
  9. Mysql 8.0下载与安装详解,并修改安装路径
  10. php 求数组合集,PHP数组排序函数合集 以及它们之间的联系分析