[LVGL]移植记录:v8.3 运行demo跑飞进入HardFault_Handler 学习记录_1

运行环境:

GD32F450ZGT6(cortex-M4) + ST7735 LCD
代码框架使用cubemx生成F429ZGT系列的基础代码
移植LVGL v8.3


问题描述

第一次进行LVGL代码移植,在测试是否移植成功时尝试运行官方的Demo程序:lv_demo_widgets,结果卡死并且显示停止在初始化结束一刻。黑屏
使用keil的调试功能查找原因


解决方法:

堆栈溢出,增大Stack Size

启动文件:startup.s中进行修改
在这里插入图片描述
Cubemx生成的代码一般默认栈的最小空间为0x400,测试改为0x800后可以正常运行demo,具体需要改多大还需实际使用后自行拿捏。请添加图片描述


分析过程:

使用debug连接MCU运行后,一段时间后停止运行,发现程序进入HardFault_Handler的循环中,
意味着发生了一个异常
发生异常时,硬件会自动执行将LR保存EXC_RETURN值,
并将8个寄存器的值(xPSR、PC、LR、R12以及 R3~R0)压入异常发生时所使用的堆栈中并更新SP、MSP、PSP等
因此可以通过调试功能查看R14(LR)寄存器,判断产生异常时所使用的堆栈,并找出对应的错误代码

在这里插入图片描述

LR对应
0xFFFFFFF1返回MSP并使用handler模式
0xFFFFFFFD返回PSP并使用thread模式
0xFFFFFFF9返回MSP并使用thread模式

MSP:Main Stack Pointer PSP:Process Stack Pointer


在这里插入图片描述如图可见LR的值为0xFFFFFFF9,说明在MSP运行时中断,查看MSP中对应地址的值:

可以看到MSP指向的地址单元与理论中存入的前几个寄存器相对应,由此看到LR返回地址(即正常情况下即将执行的下一行代码)所对应的汇编代码和C代码,
由此可知是LR的前一段代码运行时发生异常
此子函数的作用是:刷新绘图缓冲区的内容
发生异常代码的作用:等待所有后台操作完成。

if(draw_ctx->wait_for_finish) draw_ctx->wait_for_finish(draw_ctx);	

在这里插入图片描述

一般HardFault发生原因有两种:
1.内存溢出(一般是由于代码问题如数组越界引起,由于是移植的官方代码暂时排除)
2.堆栈溢出
由于对LVGL接触尚浅,无从得知后台操作时为何导致程序卡死,个人猜测是刷新过程中堆栈溢出,
所以调整了堆栈大小后进行尝试,烧录后问题解决

仅作记录,若有错误欢迎指出

  • 10
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
在 FreeRTOS 中,当系统发生硬件故障(如访问无效的内存地址或执行非法指令)时,会触发 HardFault_HandlerHardFault_Handler 是一个特殊的异常处理函数,用于处理硬件故障。 进入 HardFault_Handler 的过程如下: 1. 当发生硬件故障时,处理器会将当前的上下文信息(寄存器状态、堆栈等)保存到特定的存储区域。 2. 处理器会跳转到预定义的 HardFault_Handler 函数。 3. 在 HardFault_Handler 中,你可以根据需要进行一些处理,例如记录日志、重启系统等。 要进入 HardFault_Handler,你可以在 FreeRTOS 中通过以下步骤进行设置: 1. 在你的代码中包含 CMSIS(Cortex Microcontroller Software Interface Standard)头文件,通常是 "core_cm3.h"、"core_cm4.h" 或类似的。 2. 实现 HardFault_Handler 函数,并在其中添加你的处理逻辑。例如,你可以通过读取相应的寄存器状态来分析故障原因,并采取适当的措施。 3. 使用 CMSIS 提供的宏将 HardFault_Handler 函数注册为 HardFault 异常的处理函数。例如,在 ARM Cortex-M 系列处理器中,你可以使用以下代码进行注册: ```c void HardFault_Handler(void) { // 处理逻辑 } __attribute__((naked)) void HardFault_Handler(void) { __asm volatile ( "tst lr, #4\n" "ite eq\n" "mrseq r0, msp\n" "mrsne r0, psp\n" "ldr r1, [r0, #24]\n" "ldr r2, handler_address_const\n" "bx r2\n" "handler_address_const: .word HardFault_Handler_C\n" ); } ``` 这段代码将 HardFault_Handler 注册为 HardFault 异常的处理函数,并将其与 HardFault_Handler_C 函数关联起来。 请注意,以上代码是针对 ARM Cortex-M 系列处理器的示例,如果你使用的是其他类型的处理器,请参考相应的文档和头文件来进行配置。此外,根据你的需求,你可能还需要对 HardFault_Handler 函数进行适当的修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值