14932|11

684

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

异常与中断缘何设计的如此复杂——《RISC-V体系结构编程与实践 》读书笔记 [复制链接]

 
本帖最后由 jobszheng5 于 2023-5-11 15:13 编辑
在ARM公司的RISC指令集Cortex-M3系列MCU中,异常与中断的实现与处理非常简单。对于串口接收中断函数如下:
void USART1_IRQHandler(void){
  uint8_t ret = 0;
  if (USART_GetIntStatus(USART1, USART_INT_RXDNE) != RESET)  {
    uart_rx.data[uart_rx.length] = USART_ReceiveData(USART1);
    uart_rx.length++;
  }
}
进入中断函数后,检查一下是哪个中断与状态,当是接收数据中断后,在读取接收数据寄存器后,MCU硬件自动清除中断标识,并等待进入下一个中断的到来。而对于Systick滴哒定时器的中断函数则更是简单:
void SysTick_Handler(void)
{
    timeline_ms++;
}
systick中断函数触发后,MCU硬件则自己将计数器归位,每次自动执行,不需要软件来干预定时器。简单的不能再简单了。作为对比,RISC-V的MCU中断函数的实现则复杂的多的多,以GD32VF103为例:
#Save caller registers
.macro SAVE_CONTEXT

  addi sp, sp, -20*REGBYTES

  STORE x1, 0*REGBYTES(sp)
    STORE x4, 1*REGBYTES(sp)
    STORE x5, 2*REGBYTES(sp)
    STORE x6, 3*REGBYTES(sp)
    STORE x7, 4*REGBYTES(sp)
    STORE x10, 5*REGBYTES(sp)
    STORE x11, 6*REGBYTES(sp)
    STORE x12, 7*REGBYTES(sp)
    STORE x13, 8*REGBYTES(sp)
    STORE x14, 9*REGBYTES(sp)
    STORE x15, 10*REGBYTES(sp)
        STORE x16, 11*REGBYTES(sp)
    STORE x17, 12*REGBYTES(sp)
    STORE x28, 13*REGBYTES(sp)
    STORE x29, 14*REGBYTES(sp)
    STORE x30, 15*REGBYTES(sp)
    STORE x31, 16*REGBYTES(sp)
 #restore caller registers
.macro RESTORE_CONTEXT
  LOAD x1, 0*REGBYTES(sp)
    LOAD x4, 1*REGBYTES(sp)
    LOAD x5, 2*REGBYTES(sp)
    LOAD x6, 3*REGBYTES(sp)
    LOAD x7, 4*REGBYTES(sp)
    LOAD x10, 5*REGBYTES(sp)
    LOAD x11, 6*REGBYTES(sp)
    LOAD x12, 7*REGBYTES(sp)
    LOAD x13, 8*REGBYTES(sp)
    LOAD x14, 9*REGBYTES(sp)
    LOAD x15, 10*REGBYTES(sp)
        LOAD x16, 11*REGBYTES(sp)
    LOAD x17, 12*REGBYTES(sp)
    LOAD x28, 13*REGBYTES(sp)
    LOAD x29, 14*REGBYTES(sp)
    LOAD x30, 15*REGBYTES(sp)
    LOAD x31, 16*REGBYTES(sp)
不仅需要有检查中断标识的代码,而且还需要保存与恢复MCU系统堆栈寄存器的现场。
当年在试用RISC-V的MCU时,我曾公开表态RISC-V指令集这中断的处理代码——需要软件开发人员手动保存现场。但当时只知其然,并不知道所以然。在阅读了《RISC-V体系结构编程与实践 》书中第八章和第九章后,总算是明白了其中的缘由。下面就跟随我的读书笔记,一起来了解吧!
ARM公司的RISC指令集是以应用为主,经过多年的经验总结,MCU中的中断控制器实现复杂,实现用户软件开发方便——典型的商用客户需求角度考虑嘛。而RISC-V是新生,秉承“大道至简”的方针——其实在本文中,可以理解为方便硬件实现。换句话说,RISC-V的设计思路是方便硬件或逻辑设计人员上手。当然要苦了我们这些做软件开发的人员了。
我们在来看看RISC-V在发生异常时都分了几步?每步谁来参与了?又都做了什么?
当异常发生时,我们把处理过程分解为3部分:
1. 异常发生时 CPU做的事情
  • 保存当前 PC 值到mepc 寄存器中
  • 把异常的类型更新到mcause 寄存器
  • 把发生异常时的虚拟地址更新到 mtval 存器中
  • 保存异常发生前的中断状态,即把异常发生前的 MIE 字段保存到 mstatus 寄存器的MPE 字段中
  • 保存异常发生前的处理器模式(如U 模式、S 模式等),即把异常发生前的处理器模式保存到mstatus 寄存器的MPP 字段中
  • 关闭本地中断,即设置mstatus 寄存器中的MIE字段为0
  • 设置处理器模式为M模式
  • 跳转到异常向量表,即把 mtvec 寄存器的值设置到PC 寄存器中

2. 操作系统需要做的事情

操作系练需要做的事情是从异常向量表开始的。RISC-V 支持两种异常向量表处理模式。一种是直接跳转模式,另一种是异常向量模式。下面是操作系统需要做的事情。

  • 保在异常发生时的上下文,上下文包括所有通用存器的值和部分 M模式下的寄存器的值。上下文需要保存到栈里。
  • 查询 mcause 寄存器中的异常以及中断编号,跳转到合适的异常处理程序中
  • 异常或者中断处理完成之后,恢复保存在栈里的上下文
  • 执行MRET指令,返回异常现场

3. 异常返回

  • 恢复设置 MIE 字段。把 mstatus 寄存器中的 MPIE 字段设置到 mstatus 寄存器的MIE段,恢复触发异常前的中断使能状态,通常这相当于使能了本地中断
  • 将处理器模式设置成之前保存到 MPP字段的处理器模式
  • 把mepc寄存器保存的值设置到PC寄存器中,即返回异常触发的现场

RISC-V指令集的中断设计其实是设计的非常简单,只是大量的工作交由软件来做了而已。RISC-V中的中断与异常还是有很多可说的,比如异常与中断的区别?中断控制器如何实现中断嵌套?等等。限于篇幅,不再继续了。更多更权威的解读,大家直接下载RISC-V的技术文档——反正字也不多~~

下期读书笔记将为大家带来本书第十章《内存管理》的分享,欢迎大家持续关注我的帖子。

 
 
 
 
 
 
 

最新回复

感谢分享,正好有机会可以学习下,发现还有很多不足,加油   详情 回复 发表于 2023-10-16 22:36
点赞 关注(1)

回复
举报

684

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
本帖最后由 jobszheng5 于 2023-5-18 01:13 编辑

修改,调整了好几次的格式,现在仍然如此。

关键,还不知道出在哪里了?!

 


 

现在排版修改好了,其实 给管理员留言即可!管理员可以指导一切~~

给管理员和技术 一人一个赞

 
 

回复

6822

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 

这样对比的一看,RISC-V的MCU中断函数的实现确实是复杂的多的多

点评

我们现在在做ARM开源的Cortex-M3的在FPGA中的例化。在我们的应用里面,其实MCU仅是配合FPGA逻辑硬件,所以,反到是这样简单的设计更符合整体的效率,更符合裁剪。  详情 回复 发表于 2023-5-12 10:42
 
 
 

回复

7228

帖子

192

TA的资源

五彩晶圆(高级)

4
 

可以可以  你跟我想到一块啦 我本来也想分享这个

点评

好悬啊! 幸亏我早发布上来了  详情 回复 发表于 2023-5-12 10:39
 
 
 

回复

684

帖子

0

TA的资源

纯净的硅(高级)

5
 
常见泽1 发表于 2023-5-11 22:41 可以可以  你跟我想到一块啦 我本来也想分享这个

好悬啊!

幸亏我早发布上来了

 
 
 

回复

684

帖子

0

TA的资源

纯净的硅(高级)

6
 
Jacktang 发表于 2023-5-11 21:47 这样对比的一看,RISC-V的MCU中断函数的实现确实是复杂的多的多

我们现在在做ARM开源的Cortex-M3的在FPGA中的例化。在我们的应用里面,其实MCU仅是配合FPGA逻辑硬件,所以,反到是这样简单的设计更符合整体的效率,更符合裁剪。

点评

兄弟是做芯片验证的?  详情 回复 发表于 2023-5-12 19:01
 
 
 

回复

7228

帖子

192

TA的资源

五彩晶圆(高级)

7
 
jobszheng5 发表于 2023-5-12 10:42 我们现在在做ARM开源的Cortex-M3的在FPGA中的例化。在我们的应用里面,其实MCU仅是配合FPGA逻辑硬件,所 ...

兄弟是做芯片验证的?

点评

亲,您这是怎么逻辑推理出来的啊  详情 回复 发表于 2023-5-17 17:04
 
 
 

回复

684

帖子

0

TA的资源

纯净的硅(高级)

8
 
常见泽1 发表于 2023-5-12 19:01 兄弟是做芯片验证的?

亲,您这是怎么逻辑推理出来的啊

 
 
 

回复

4

帖子

0

TA的资源

一粒金砂(中级)

9
 

这样对比的一看,RISC-V的MCU中断函数的实现确实是复杂的多的多

 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

10
 
正在学习,感谢分享。
 
 
 

回复

1万

帖子

203

TA的资源

管理员

11
 

这听上去就好像有这么个事情,你做的少点我就做的多点的意思。但是我觉得RISCV这样的设定是符合需求的。因为减少硬件成本了呀这样子的话,软件试错要比硬件试错的成本低多了。

加EE小助手好友,
入技术交流群
EE服务号
精彩活动e手掌握
EE订阅号
热门资讯e网打尽
聚焦汽车电子软硬件开发
认真关注技术本身
 
个人签名玩板看这里:
https://bbs.eeworld.com.cn/elecplay.html
EEWorld测评频道众多好板等你来玩,还可以来频道许愿树许愿说说你想要玩的板子,我们都在努力为大家实现!
 
 

回复

7

帖子

0

TA的资源

一粒金砂(中级)

12
 

感谢分享,正好有机会可以学习下,发现还有很多不足,加油

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表