RISC-V MCU中文社区

【求助】 [问题咨询](已解决):调用setjmp函数触发系统默认异常处理程序

发表于 GD32VF103 MCU 2021-03-22 17:52:41
0
3008
2

        在移植Lua解析器的过程中遇到初始化过程成触发异常中断(system_default_exception_handler),Debug怀疑是在setjmp函数的调用过程中触发的,因此找了一段 setjmp的测试代码来定位问题。


开发环境信息:

  • 操作系统版本:Windows 10 - 64位 家庭版
  • IDE版本,SEGGER Embedded Studio 5.40a / JLink V10
  • 开发板型号: GD32VF103核心板


setjmp应用代码:


#include "stdio.h"
#include "setjmp.h"

static jmp_buf env;

double func_div(double dividend, double divisor)
{
    printf("call func_div \n");
    if(divisor == 0)
        longjmp(env, 1);
    return  dividend / divisor;
}

void try_exception() 
{
    if (setjmp(env) == 0)
        func_div(2, 0);
    else
        printf("Zero divisor !!! \n");
    printf("Finished \n");
}

int main(){
	try_exception();
	return 0;
}


Debug到setjmp函数的调用中,执行单步调试到0x08001876处触发异常中断(与Lua源码调试结果一致)

    后来查询fsw指令发现是涉及浮点数的sw指令,用于保存浮点环境参数的。想到之前遇到启动文件进入FPU配置造成系统不能启动问题时没有去掉工程宏定义arch中的f参数。

修改配置重新编译Demo工程:

其中setjmp函数对应的汇编代码已经没有了保存浮点数环境参数的部分逻辑。


运行Demo正常逻辑输出:


参考链接:

setjmp是怎么工作的

RISC-V汇编语言

riscv简单指令-cs61c

SES的进阶学习

喜欢2
用户评论
moo

moo 实名认证

懒的都不写签名

积分
问答
粉丝
关注
  • RV-STAR 开发板
  • RISC-V处理器设计系列课程
  • 培养RISC-V大学土壤 共建RISC-V教育生态
RV-STAR 开发板