Menu Close

课程“RISC-V 中断及定时器中断工程-6”有一处错误

首页 论坛 RISC-V 课程“RISC-V 中断及定时器中断工程-6”有一处错误

正在查看 1 条回复
  • 作者
    帖子
    • #23743
      wangff
      参与者
      积分: 320
      举重若轻

      老师您好,“RISC-V C语言编程2(3)中断及定时器中断工程-6”有一处错误。

      在entry.S文件中有一句汇编指令“csrw mepc, a0”,根据上下文来看,a0寄存器存储的是mcause,a1寄存器存储的是mepc,所以这里的a0应该改为a1,正确的汇编指令应为“csrw mepc, a1”,老师您看我理解的对吗?

    • #23745
      Yvonne
      版主
      积分: 786
      举重若轻

      不对,见下文handle_trap函数代码。CRSW mepc,a0指的是返回时的第一个参数(handle_trap函数的返回值有且只有一个,epc)默认赋值给a0。至于你说的“ a0寄存器存储的是mcause,a1寄存器存储的是mepc ”是因为在进入handle_trap函数之前,handle_trap的参数列表中有两个参数(unsigned int handle_trap(unsigned int mcause, unsigned int epc) ),按照顺序,mcause的值由a0传递,epc的值由a1传递。

      unsigned int handle_trap(unsigned int mcause, unsigned int epc)
      {
      
          if ((mcause & MCAUSE_INT) && ((mcause & MCAUSE_CAUSE) == IRQ_M_TIMER))
          {
              handle_m_time_interrupt();
          }
          else 
          {
              printf("There is not any handle_trap available \r\n");
      
              printf("mstatus    = 0x%08x\r\n" , read_csr(mstatus) );
              printf("mie        = 0x%08x\r\n" , read_csr(mie) );
              printf("mcause     = 0x%08x\r\n" , read_csr(mcause) );
              printf("mtvec      = 0x%08x\r\n" , read_csr(mtvec));
      
          }
          return epc;
      }

       

      同学可以再听几遍视频进行理解。

      • #23804
        wangff
        参与者
        积分: 320
        举重若轻

        好的,谢谢老师,”CRSW mepc,a0″,您的意思是这里必须选择a0作为handle_trap函数返回时的第一个参数吗?可以选用其他寄存器吗?

      • #23807
        Yvonne
        版主
        积分: 786
        举重若轻

        函数的返回参数只能使用a0、a1寄存器,并且是按照顺序使用的。关于RISC-V 函数调用的参数传递,参考RISC-V 指令集手册中文2.1版(User-Level ISA)

        的第20章调用约定。

      • #23928
        wangff
        参与者
        积分: 320
        举重若轻

        好的,谢谢老师的讲解!

正在查看 1 条回复
  • 哎呀,回复话题必需登录。