RISC-V架构异常处理与栈回溯分析(二)

文章讨论了RISC-V架构下FreeRTOS在启动过程中的异常处理问题,发现portcontextSAVE_CONTEXT_INTERNAL存在漏洞。通过修改代码,将sp指针保存到栈的不同位置,避免了异常处理中的无限循环,确保了任务调度的正常进行。

        之前的文章RISC-V FreeRTOS异常处理及任务切换分析(基于qemu+gdb跟踪调试)_Dingjun798077632的博客-优快云博客中,有提到FreeRTOS\Source\portable\GCC\RISC-V\portASM.S文件中通过宏portcontextSAVE_CONTEXT_INTERNAL保存上下文代码有点漏洞:portcontextSAVE_CONTEXT_INTERNAL最后将sp保存到pxCurrentTCB->pxTopOfStack中,在创建任务和调用vTaskStartScheduler()之前pxCurrentTCB必然是个空指针,此时触发异常处理,跳转到异常函数处理入口freertos_risc_v_trap_handler处执行,通过宏portcontextSAVE_CONTEXT_INTERNAL保存上下文又会触发异常,如此反复。这样上一篇文章RISC-V架构栈帧分析与栈回溯实现_Dingjun798077632的博客-优快云博客中增加的栈回溯等相关代码在启动过程前半部分不起效,但实际开项目中,启动过程需要做大量初始化动作,启动过程是相对比较复杂,比较容易出错的,为方便以后问题调试,最好是能够解决该问题,下面就该问题分析。

异常处理问题验证

        首先,我们先验证上面提出的问题是否存在,还是基于之前的文件FreeRTOS\Demo\RISC-V-Qemu-virt_GCC\main_blinky.c,在main_blinky函数中xTaskCreate之前调用test_fun_c,从而触发非法指令异常,代码如下:

还是用asm volatile(".word 0x1234567");触发异常

        编译后启用gdb调试,在freertos_risc_v_trap_handler和synchronous_exception函数入口处设置断点,运行结果如下:

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值