- Read the
- [FAQ]
- [Quick overview]
BTW: Those two links result in “404 not found” error.
Description
What MCU/Processor/Board and compiler are you using?
Custom board with
- stm32f429b1t6
- LCD TFT050-84ATP
- external SDRAM is42s32000j-6tl (2Meg x 32 x 4 banks)
Code generated with
- Cubemx-6.1.2
- HAL FW 1.25.2
- FreeRTOS
- LVGL-7.11.0
- gcc-9.3.0
- newlib-3.1.0
Memory management defined like this:
#define LV_MEM_CUSTOM 0
# define LV_MEM_CUSTOM_INCLUDE <stdlib.h> /*Header for the dynamic memory function*/
# define LV_MEM_CUSTOM_ALLOC malloc /*Wrapper to malloc*/
# define LV_MEM_CUSTOM_FREE free /*Wrapper to free*/
What do you want to achieve?
I get random crashes, refresh errors and hardfault errors.
What have you tried so far?
I’ve added this snippet to help track down the problem:
diff --git a/src/lv_core/lv_refr.c b/src/lv_core/lv_refr.c
index 8199f4ea..af931428 100644
--- a/src/lv_core/lv_refr.c
+++ b/src/lv_core/lv_refr.c
@@ -223,6 +223,7 @@ void _lv_disp_refr_task(lv_task_t * task)
#else
copy_buf = _lv_mem_buf_get(disp_refr->driver.hor_res * sizeof(lv_color_t));
#endif
+ LV_LOG_WARN("_lv_mem_buf_get()->%p", copy_buf);
uint8_t * buf_act = (uint8_t *)vdb->buf_act;
uint8_t * buf_ina = (uint8_t *)vdb->buf_act == vdb->buf1 ? vdb->buf2 : vdb->buf1;
@@ -254,6 +255,7 @@ void _lv_disp_refr_task(lv_task_t * task)
}
}
+ LV_LOG_WARN("release %p", copy_buf);
if(copy_buf) _lv_mem_buf_release(copy_buf);
}
} /*End of true double buffer handling*/
diff --git a/src/lv_misc/lv_mem.c b/src/lv_misc/lv_mem.c
index 805bbfe5..1a4e09a2 100644
--- a/src/lv_misc/lv_mem.c
+++ b/src/lv_misc/lv_mem.c
@@ -152,6 +152,7 @@ void _lv_mem_deinit(void)
void * lv_mem_alloc(size_t size)
{
if(size == 0) {
+ LV_LOG_WARN("_lv_mem_alloc()->%p", &zero_mem);
return &zero_mem;
}
@@ -209,6 +210,7 @@ void * lv_mem_alloc(size_t size)
#endif
}
+ LV_LOG_WARN("_lv_mem_alloc()->%p", &alloc);
return alloc;
}
@@ -530,6 +532,8 @@ void _lv_mem_buf_release(void * p)
{
uint8_t i;
+ LV_LOG_WARN("lv_mem_buf_release: %p", p);
+
/*Try small static buffers first*/
for(i = 0; i < sizeof(mem_buf_small) / sizeof(mem_buf_small[0]); i++) {
if(mem_buf_small[i].p == p) {
@@ -545,7 +549,7 @@ void _lv_mem_buf_release(void * p)
}
}
- LV_LOG_ERROR("lv_mem_buf_release: p is not a known buffer")
+ LV_LOG_ERROR("lv_mem_buf_release: %p is not a known buffer", p);
}
/**
@@ -554,6 +558,9 @@ void _lv_mem_buf_release(void * p)
void _lv_mem_buf_free_all(void)
{
uint8_t i;
+
+ LV_LOG_WARN("lv_mem_buf_free_all");
+
for(i = 0; i < sizeof(mem_buf_small) / sizeof(mem_buf_small[0]); i++) {
mem_buf_small[i].used = 0;
}
With this, I see that there is an attempt to free a pointer twice
WARNING: File: lvgl//src/lv_misc/lv_mem.c#535: _lv_mem_buf_release: lv_mem_buf_release: C0002000
WARNING: File: lvgl//src/lv_misc/lv_mem.c#535: _lv_mem_buf_release: lv_mem_buf_release: C0002000
ERROR: File: lvgl//src/lv_misc/lv_mem.c#552: _lv_mem_buf_release: lv_mem_buf_release: C0002000 is not a known buffer
Here’s the gdb backtrace:
#2 0x080251be in _lv_log_add (level=level@entry=3 '\003', file=file@entry=0x80f4490 "lvgl//src/lv_misc/lv_mem.c", line=line@entry=552,
func=func@entry=0x80f45ec <__func__.6790> "_lv_mem_buf_release", format=format@entry=0x80f44f4 "lv_mem_buf_release: %p is not a known buffer")
at lvgl//src/lv_misc/lv_log.c:89
#3 0x0802420e in _lv_mem_buf_release (p=p@entry=0xc0002000) at lvgl//src/lv_misc/lv_mem.c:552
#4 0x080313d6 in lv_draw_map (map_area=map_area@entry=0x20006dd0 <ucHeap+19816>, clip_area=clip_area@entry=0x20006d50 <ucHeap+19688>, map_p=<optimized out>,
draw_dsc=draw_dsc@entry=0x20006dd8 <ucHeap+19824>, chroma_key=chroma_key@entry=false, alpha_byte=alpha_byte@entry=true)
at lvgl//src/lv_draw/lv_draw_img.c:472
#5 0x08031af4 in lv_img_draw_core (coords=coords@entry=0x20006dd0 <ucHeap+19816>, clip_area=clip_area@entry=0x20006dc8 <ucHeap+19808>, src=<optimized out>,
draw_dsc=0x20006dd8 <ucHeap+19824>) at lvgl//src/lv_draw/lv_draw_img.c:277
#6 0x08031c34 in lv_draw_img (coords=coords@entry=0x20006dd0 <ucHeap+19816>, mask=mask@entry=0x20006dc8 <ucHeap+19808>, src=<optimized out>,
dsc=dsc@entry=0x20006dd8 <ucHeap+19824>) at lvgl//src/lv_draw/lv_draw_img.c:85
#7 0x08021616 in lv_img_design (img=<optimized out>, clip_area=0x20006e90 <ucHeap+20008>, mode=<optimized out>) at lvgl//src/lv_widgets/lv_img.c:712
#8 0x0801b634 in lv_refr_obj (obj=obj@entry=0xc00012ac, mask_ori_p=mask_ori_p@entry=0x20006eb0 <ucHeap+20040>) at lvgl//src/lv_core/lv_refr.c:696
#9 0x0801b6be in lv_refr_obj (obj=obj@entry=0xc0001248, mask_ori_p=mask_ori_p@entry=0x20006ee8 <ucHeap+20096>) at lvgl//src/lv_core/lv_refr.c:736
#10 0x0801b6be in lv_refr_obj (obj=obj@entry=0xc0000e58, mask_ori_p=mask_ori_p@entry=0x20006fa0 <ucHeap+20280>) at lvgl//src/lv_core/lv_refr.c:736
#11 0x0801b6d2 in lv_refr_obj_and_children (top_p=top_p@entry=0xc0000e58, mask_p=mask_p@entry=0x20006fa0 <ucHeap+20280>) at lvgl//src/lv_core/lv_refr.c:638
#12 0x0801b93e in lv_refr_area_part (area_p=area_p@entry=0xc00008fa) at lvgl//src/lv_core/lv_refr.c:569
#13 0x0801ba70 in lv_refr_area (area_p=0xc00008fa) at lvgl//src/lv_core/lv_refr.c:424
#14 0x0801bc42 in lv_refr_areas () at lvgl//src/lv_core/lv_refr.c:402
#15 0x0801bcbe in _lv_disp_refr_task (task=0xc0000a1c) at lvgl//src/lv_core/lv_refr.c:199
#16 0x0801be68 in lv_refr_now (disp=0xc0000890) at lvgl//src/lv_core/lv_refr.c:88
#17 0x08012c18 in ilvgl_test_show () at app/lvgl-test.c:327
#18 0x08012f76 in lvgl_test_show_start () at app/lvgl-test.c:434
#19 0x0800fee0 in app_entry () at app/app-entry.c:59
#20 0x0800d1ac in vPortFree (pv=0x0) at cubemx/Middlewares/Third_Party/FreeRTOS/Source/portable/MemMang/heap_4.c:305
The offending piece of code is:
static void lvgl_test_show(void)
{
/* Setup some styles, initial screen and some buttons
*/
lvgl_test_setup();
lv_scr_load(it1010_main_screen);
lv_refr_now(lv_disp_get_default()); /* Here we crash */
}
Any help to track this problem down?