之前的文章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函数入口处设置断点,运行结果如下:

RISC-VFreeRTOS异常处理优化:解决启动过程中的无限循环问题

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

被折叠的 条评论
为什么被折叠?



