小明分享|LVGL调试日志
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调试日志相关推荐
- 小明分享|8ms平台下工程源码分析
今天小明为大家分享的是开发工具平台-8ms(www.8ms.xyz)工程源码分析 1.打开"8ms平台",创建工程制作完UI后,选中"编译"一栏,等待结束后,选 ...
- 小明分享|sigmstar SSD201/SSD202 针对MIPI的LCD屏配置操作说明分享,更多Sigmastar相关技术文档及沟通讨论,可以给小明留言,小明邀请你进入我们的技术沟通群
小明会定期分享SigmastarSSD201/202相关芯片技术文档!我们也有一个Sigmastar技术沟通群聊!有感兴趣的开发小伙伴也可以留言给小明,小明邀请你进入! SSD20X 平 台 LCD ...
- 小明分享:SSD201/202系统烧录篇,多种烧录方式,小明都做了分享,有需要的小伙伴拿走不谢哈!更多资料需求可以关注我,我是启明云端的小明MM!
一.ISP 烧录 当 flash 没有烧过系统或系统损坏时,可以先通过 ISP 烧录 boot,然后再通过 eth.usb 或 sd 烧录完整的系统. 下载并解压 tools/ssd201_ISP_5 ...
- 小明分享|嵌入式LINUX开发日志-错误汇总①
SSD201 QT移植编译错误解决 book@100ask:~/SSD201/qt-everywhere-src-5.15.0$ ./make.sh mkdir: cannot create dire ...
- 小明分享|基于VSCode Espress IDF软件环境搭建
VS code下载网址: --现版本安装包大小大约60M左右,是一个轻量级但功能强大的源代码编辑器,适用于Windows.macOS和Linux.支持安装扩展各类应用插件. https://code. ...
- 小明分享|NRF52840和NRF52810蓝牙模块测试
一.主机模式-从机模式蓝牙测试(WT52840-S1) WT52840-S1是启明云端基于Nordic公司的nRF52840为核心处理器的高性能.超低功耗(Bluetooth Low Energy)的 ...
- 小明分享|nRF52840 蓝牙模块连接测试
一.可主从配对蓝牙模组 1.测试前准备 硬件准备 两台PC机.(2块)WT52840-S1模组,转接板,USB数据线 软件准备 蓝牙串口调试助手 2.测试 (1)将WT52840-S1模组分别通过转接 ...
- 小明分享:8ms平台入门教程
www.8ms.xyz 入门教程, [详细资料获取](http://doc.8ms.xyz/docs/gui-001/gui-001-1cinrj630tggq) 一. 注册个人账号 1.点击主页的& ...
- 小明分享:Esp32下softAP+tcp_server的简单实现
***提示:对于初学者尽量选择ESP32开发板来完成***原因如下: [ ]WT-ESP32-DevKitC V4的射频性能已经调试完善,用户进行应用设计和开发时无需考虑射频和天线设计.此开发板包含了 ...
最新文章
- Oracle 数据库 - sql语句筛选出符合查询条件的第一条结果实例演示,sql查询结果只显示指定行数的数据方法
- 垃圾热解气化工艺的电气、仪表及控制系统设计
- Qt 中 QXml/QDom*** api设计吐槽
- C# 中居然也有切片语法糖,太厉害了
- tyvj/joyOI 1305-最大子序和【单调队列】
- C++11新特性之左值右值及移动语句与完美转发
- 让我们在退烧中更清醒:谨慎投机性创业和投资的危害
- 列出IIS上的虚拟目录和网站信息。
- 理解Android的手势识别
- MySQL-5.6.14-winx64的免安装配置方法
- linux项目实验ppt下载,实验一Linux系统的使用.ppt
- Axure制作微信APP原型(二)登录注册模块
- 35岁逃离北上广,40岁失业送外卖,中年人的“体面”在于投资自己
- DTL相关知识整理初稿
- Xiuno 简约白色主题
- 1、什么是实际的电压源与电流源?
- latex数学公式神器Mathpix
- 前端微信签名验证工具_微信支付服务商签名验证无误,但是统一下单后服务器返回【签名错误】...
- UVa12325 12325 - Zombie‘s Treasure Chest(思路+代码)
- uniapp 微信小程序 swiper修改指示点的位置和样式
热门文章
- openstack万兆交换机设置mtu值
- pandas(二) -- Dataframe创建及索引
- 使用docker-compose配置redis服务
- 【收藏】webpack configuration.module has an unknown property ‘loaders‘. These properties arevalid: 解决办法
- 【收藏】spark中map与mapPartitions区别
- docker数据卷volume详解
- nginx 配置文件nginx.conf结构
- redis sorted_set数据类型常用命令及跳表skip_list原理
- Mysql 8.0下载与安装详解,并修改安装路径
- php 求数组合集,PHP数组排序函数合集 以及它们之间的联系分析