本帖最后由 [鑫森淼焱垚] 于 2024-5-23 17:36 编辑
【APM32F411V Tiny Board测评】Debug运行LVGL出问题
HardFault 追溯
运行一个最简单的 lvgl 示例工程,却导致了 HardFault。
stack 回溯,函数 fill_normal() 中变量 dest_buf, dest_area 两个变量地址变异了,变成了 0xF7BEF7BE,这是异常情况,这两个变量是指针,不应该是这个地址。
另外变量 color 地址是 0x20011878 内容是 0xF7BE,和上面两个变量有点关联,但不是 dest_buf/dest_area 两个指针变异的原因。
call stack 再往前回溯, lv_draw_sw_blend_baisc() 函数中也有异常情况:
dest_buf 地址 0x200105C4,是正常值,然而传递给 fill_normal() 处出现了异常,变成了 0xF7BEF7BE;
dsc 和 mask 两个变量变异了,地址变成 0xF7BEF7BE,不应该;
上面的 dest_buf 局部变量来自 draw_ctx->buf 变量,代码和 call stack 对应上了。
call stack 再回溯一步,转到函数 lv_draw_sw_blend() ,它的两个入口参数 draw_ctx 和 dsc 都看不到内容了,但是局部变量 blend_area 能看到,blend_area.x2 = 0xEF = 239 屏幕的最右边,blend_area.y2 = 0x09 = 9 即第10行。这个范围符合函数 lv_port_disp_init() 中设定的第一种缓冲类型,缓冲区大小 -- 屏幕的10行大小。
call stack 再回溯一步到函数 draw_bg(),它的三个入口参数 draw_ctx, dsc 和 coords 看起来都是正常的。
问题解决
所以,问题出在哪里呢?会不会是主栈大小不够?当前 startup_apm32f411.s 设置的 Stack_Size 是 0x400.如果调大一点呢,改成 0x800 = 2KB.
问题解决了,不再进入 HardFault。
|