搜索
bottom↓
回复: 10

lvgl内存泄漏如何处理?

[复制链接]

出5入10汤圆

发表于 2022-8-15 14:32:08 | 显示全部楼层 |阅读模式
用lvgl的画了16个运动的光球,但是发现运行一段时间就会报内存的错误
  1. Guru Meditation Error: Core  1 panic'ed (LoadProhibited). Exception was unhandled.

  2. Core  1 register dump:
  3. PC      : 0x4016481f  PS      : 0x00060430  A0      : 0x8016a024  A1      : 0x3f803b30  
  4. 0x4016481f: lv_draw_mask_free_param at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/draw/lv_draw_mask.c:216
  5. (inlined by) lv_draw_mask_free_param at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/draw/lv_draw_mask.c:210

  6. A2      : 0x3f803c24  A3      : 0x3f803bbc  A4      : 0x3f803c54  A5      : 0x00000001
  7. A6      : 0x00000000  A7      : 0x3ffc43a8  A8      : 0x00007fff  A9      : 0x0000003a
  8. A10     : 0x00000000  A11     : 0x00000000  A12     : 0x00000000  A13     : 0x3f803bbc
  9. A14     : 0x3f803bbc  A15     : 0x00000000  SAR     : 0x0000001d  EXCCAUSE: 0x0000001c
  10. EXCVADDR: 0x0000800f  LBEG    : 0x40164768  LEND    : 0x40164773  LCOUNT  : 0x0000001f
  11. 0x40164768: lv_draw_mask_add at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/draw/lv_draw_mask.c:86

  12. 0x40164773: lv_draw_mask_add at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/draw/lv_draw_mask.c:91



  13. Backtrace:0x4016481c:0x3f803b300x4016a021:0x3f803b50 0x400dc4e5:0x3f803cc0 0x400dc7a6:0x3f803d00 0x400dbfda:0x3f803d20 0x4015c2fd:0x3f803d40 0x4015c3cf:0x3f803d60 0x4016238e:0x3f803da0 0x40162373:0x3f803de0 0x401623b8:0x3f803e20 0x40162550:0x3f803e50 0x40162a06:0x3f803ec0 0x40167ebb:0x3f803f20 0x400dbf56:0x3f803f50
  14. 0x4016481c: lv_draw_mask_free_param at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/draw/lv_draw_mask.c:215
  15. (inlined by) lv_draw_mask_free_param at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/draw/lv_draw_mask.c:210

  16. 0x4016a021: lv_draw_sw_arc at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/draw/sw/lv_draw_sw_arc.c:123

  17. 0x400dc4e5: ball_color_sports at F:\MC\SpaceMan\software\esp32\build/../components/gui_task/src/sport_ball.c:199 (discriminator 3)

  18. 0x400dc7a6: ball_position_refresh at F:\MC\SpaceMan\software\esp32\build/../components/gui_task/src/sport_ball.c:327

  19. 0x400dbfda: spectrum_draw_event_cb at F:\MC\SpaceMan\software\esp32\build/../components/gui_task/src/my_music.c:79
  20. (inlined by) spectrum_draw_event_cb at F:\MC\SpaceMan\software\esp32\build/../components/gui_task/src/my_music.c:59

  21. 0x4015c2fd: event_send_core at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/core/lv_event.c:467

  22. 0x4015c3cf: lv_event_send at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/core/lv_event.c:75

  23. 0x4016238e: lv_refr_obj at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/core/lv_refr.c:188

  24. 0x40162373: lv_refr_obj at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/core/lv_refr.c:180 (discriminator 3)

  25. 0x401623b8: lv_refr_obj_and_children at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/core/lv_refr.c:720

  26. 0x40162550: lv_refr_area_part at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/core/lv_refr.c:652

  27. 0x40162a06: lv_refr_area at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/core/lv_refr.c:571
  28. (inlined by) lv_refr_areas at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/core/lv_refr.c:511
  29. (inlined by) _lv_disp_refr_timer at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/core/lv_refr.c:313

  30. 0x40167ebb: lv_timer_exec at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/misc/lv_timer.c:313
  31. (inlined by) lv_timer_handler at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/misc/lv_timer.c:109

  32. 0x400dbf56: lv_task_handler at F:\MC\SpaceMan\software\esp32\build/../components/lvgl/src/lv_api_map.h:37
  33. (inlined by) lvgl_task at F:\MC\SpaceMan\software\esp32\build/../components/gui_task/src/taskgui.c:129
复制代码


具体代码如下,看相关的资料也没有发现需要手动释放内存的地方,很是不明白为何出现这个现象?有没有对lvgl熟悉的坛友帮忙解答下?

  1. //运动的颜色光球
  2. void ball_color_sports(lv_event_t * e)
  3. {

  4.     #define BALL_SPEED 2
  5.     lv_obj_t * obj = lv_event_get_target(e);
  6.     lv_draw_ctx_t * draw_ctx = lv_event_get_draw_ctx(e);

  7.     lv_draw_arc_dsc_t draw_arc_dsc;
  8.     lv_draw_arc_dsc_init(&draw_arc_dsc);
  9.     draw_arc_dsc.opa = LV_OPA_COVER;
  10.     draw_arc_dsc.width = 8;
  11.     draw_arc_dsc.blend_mode = LV_BLEND_MODE_NORMAL;

  12.     lv_point_t pos;
  13.     for (uint8_t i = 0; i < BALL_CNT; i++)
  14.     {
  15.         pos.x = ball_buff[i].x;
  16.         pos.y = ball_buff[i].y;
  17.         draw_arc_dsc.color = lv_palette_main(COLOR_BALL[i%6]);
  18.         draw_ctx->draw_arc(draw_ctx,&draw_arc_dsc,&pos,8,0,360);
  19.     }
  20. }
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出20入0汤圆

发表于 2022-8-15 15:01:26 | 显示全部楼层
是不是很多地方建立了对象?

出5入10汤圆

 楼主| 发表于 2022-8-15 15:09:18 | 显示全部楼层
cantonguy 发表于 2022-8-15 15:01
是不是很多地方建立了对象?
(引用自2楼)

就只有这一个地方调用了,参考官方的音乐播放器写的,画矩形就没问题,就是画圆形运行一段时间就报错了
  1. static void spectrum_draw_event_cb(lv_event_t * e)
  2. {
  3.     lv_event_code_t code = lv_event_get_code(e);



  4.     if(code == LV_EVENT_REFR_EXT_DRAW_SIZE) {


  5.         lv_event_set_ext_draw_size(e, LV_VER_RES);

  6.     }
  7.     else if(code == LV_EVENT_COVER_CHECK) {
  8.         lv_event_set_cover_res(e, LV_COVER_RES_NOT_COVER);
  9.     }
  10.     else if(code == LV_EVENT_DRAW_MAIN_END) {
  11.         //ball_position_refresh(e,fft_display_mode);
  12.     }
  13.     else if(code == LV_EVENT_DRAW_POST) {

  14.         ball_position_refresh(e,fft_display_mode);
  15.         
  16.         fft_draw_pro(e,fft_display_mode);
  17.     }
  18.     else if( code == LV_EVENT_DRAW_PART_END )
  19.     {
  20.     }



  21. }
复制代码

出20入0汤圆

发表于 2022-8-15 15:20:11 | 显示全部楼层
涵潇舒雅 发表于 2022-8-15 15:09
就只有这一个地方调用了,参考官方的音乐播放器写的,画矩形就没问题,就是画圆形运行一段时间就报错了
...
(引用自3楼)

看这个看不出有什么问题,按道理创建完,对象没删除,就一直存在内存的。
会不会不是lvgl的问题,而是lvgl占用了一部分内存,但其他程序遇到内存不足的问题?

出5入10汤圆

 楼主| 发表于 2022-8-15 15:26:21 | 显示全部楼层
cantonguy 发表于 2022-8-15 15:20
看这个看不出有什么问题,按道理创建完,对象没删除,就一直存在内存的。
会不会不是lvgl的问题,而是lvg ...
(引用自4楼)

其他程序没有报错,同样的代码将圆球换成三角形,运行40分钟也不会报错,就是画圆不行,对此很不理解

出0入115汤圆

发表于 2022-8-15 16:39:05 | 显示全部楼层
用的什么芯片方案?

出5入10汤圆

 楼主| 发表于 2022-8-15 17:00:37 | 显示全部楼层
三年模拟 发表于 2022-8-15 16:39
用的什么芯片方案?
(引用自6楼)

esp32- PICO- V3-02内部集成了2M的psram

出0入42汤圆

发表于 2022-8-15 17:47:40 | 显示全部楼层
ball_position_refresh(e,fft_display_mode);内部没有删除对象的操作吗?最起码内存刷新的时候应该删除先前的。至于别的图形不易出现错误,我觉得是因为圆形占用的内存多所以容易出现。

出5入10汤圆

 楼主| 发表于 2022-8-15 21:19:56 | 显示全部楼层
liyang121316 发表于 2022-8-15 17:47
ball_position_refresh(e,fft_display_mode);内部没有删除对象的操作吗?最起码内存刷新的时候应该删除先前 ...
(引用自8楼)

看函数实现就是画完之后立马释放了,所以很奇怪

出0入42汤圆

发表于 2022-8-16 08:48:41 | 显示全部楼层
涵潇舒雅 发表于 2022-8-15 21:19
看函数实现就是画完之后立马释放了,所以很奇怪
(引用自9楼)

能仿真吗?多画点圆加快问题复现过程。

出0入0汤圆

发表于 2022-8-16 10:40:02 | 显示全部楼层
对比下当前版本的底层代码和最新的有么有区别。有可能是源码有bug
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-14 17:40

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表