2274|7

234

帖子

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-5-17 17:04

回复

234

帖子

0

TA的资源

纯净的硅(中级)

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

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

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

 


 

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

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


回复

4960

帖子

0

TA的资源

五彩晶圆(中级)

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

点评

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

回复

6934

帖子

193

TA的资源

五彩晶圆(高级)

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

点评

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

回复

234

帖子

0

TA的资源

纯净的硅(中级)

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

好悬啊!

幸亏我早发布上来了


回复

234

帖子

0

TA的资源

纯净的硅(中级)

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

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

点评

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

回复

6934

帖子

193

TA的资源

五彩晶圆(高级)

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

兄弟是做芯片验证的?

点评

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

回复

234

帖子

0

TA的资源

纯净的硅(中级)

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

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


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

相关帖子
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
推荐帖子
[视频]C语言视频教程及汇编视频教程(在线观看)

C语言视频教程(在线观看)地址http://219.144.186.220/cyy/汇编语言视频教程(在线观看)地址http://219.144.186.220/hbywjjk/ ...

PCB设计技巧

PCB设计技巧

分享 电力参数测量毕业论文

交流电压电流有功功率无功功率功率因素15387

智林测控开发板.强烈推荐

这是个ARM最小系统开发板,大家可以上淘宝买一个玩,不到50元的成本, 本帖最后由 jxb01033016 于 2009-9-17 11:57 编辑 ]

[DIY]二十四小时的感动(现代版) 自制LED点阵电子时钟

二楼已经上传全部电路图和PCB板图文件,以及全套C语言源代码,包括工程文件。 十八年前的我,每次路过学校门卫室的时候, ...

【TI Sitara 处理器】直播颁奖啦~

活动详情:有奖直播:TI Sitara 处理器;Arm Cortex-A9;支持 10 种以上的以太网协议、串行协议 领奖截止日期:即日起--2018 ...

bq27411-g1(单节电量计)    bq27541(单节电量计)  bq27546-g1 (单节电量计)

bq27411-g1(单节电量计) bq27541(单节电量计) bq27546-g1 (单节电量计) TI的这三款电量计哪个熟悉的?比如更换不同厂家的电芯 ...

数字调制系列:IQ基本理论

数字IQ调制凭借高数据速率以及易于实现等优势,广泛应用于无线通信系统。与传统的模拟调制不同,数字调制采用了新颖的IQ调制架构 ...

[平头哥RVB2601创意应用开发] 1:环境搭建与Hello world

RV架构到现在已经有不少芯片面世了。可能笔者了解的比较少,目前没太看到有小公司使用这些芯片做产品,一方面可能是新事物大家都 ...

24GHz人体检测雷达

请问有人了解24GHz人体检测雷达吗。目前知道华为海凌科在做

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