黄昏收获 发表于 2025-6-29 15:53

RISC-V的非向量中断

研究了RISC-V的中断,这是与ARM非常不同的一个点。RISC-V的中断的设计更灵活,可以面对不同的应用场景。针对特殊、严苛的环境也能有对应的最优解。

昨天发了帖子聊了聊RISC-V的向量中断(《RISC-V的向量中断》https://bbs.21ic.com/icview-3466050-1-1.html),今天仍将以GD32VF103为例聊聊非向量中断。多说一句,非向量中断仍然是中断。

非向量中断的中断入口是共享制,即入口函数只有一个。具体哪个外设或事件触发了,需要程序设计人员自行遍历查询。之后,再做出响应。这一套中断响应流程下来,肯定要比向量中断要慢——向量中断是直接进入函数。对于Critical的事件是不是有可能就不满足硬件实时性的要求了?

我们再来看看GD32VF103上面实现非向量中断的处理流程:

下面是非向量中断的入口:

/*
* Set ECLIC non-vector entry to be controlled
* by mtvt2 CSR register.
* Intialize ECLIC non-vector interrupt
* base address mtvt2 to irq_entry.
*/
la t0, irq_entry
csrw CSR_MTVT2, t0
csrs CSR_MTVT2, 0x1其中irq_entry表示了非向量的处理过程。csrs CSR_MTVT2, 0x1该指令的解析如下:

mtvt2 = 1 mtvt2为0时,中断入口使用mtvec寄存器,mtvt2为1时,中断入口为mtvt2。

从中断处理的原理上来讲,中断处理函数分三部分:

1. 保存当前现场

2. 进入中断处理函数

3. 恢复现场

RISC-V的实现也是如此。不过,这里要特别说明一个特性“中断咬尾”:在所有非向量中断共享的共有代码段中,在踏入中断服务程序的同时,“csrrw ra, CSR_JALMNXTI,ra”指令还会达到 JAL(Jump and Link)的效果。硬件同时更新Link寄存器的值为该指令的PC自身作为函数调用的返回地址。因此,从中断服务程序函数返回后会回到该“csrrw ra, CSR_JALMNXTI,ra”指令重新执行,重新判断是否还有中断在等待(Pending),从而达到中断咬尾的效果。

感觉上也没有啥特殊的啊!

在ARM的Cortex-M3/M4系列中,ARM对中断优先级管理分为中断优先级组与亚优先级,再者共提供4bit位宽的优先级颗粒度。而RISC-V在向量中断也提供了优先级组的概念,似乎中断优先级也是够用的。为什么RISC-V还要推出一个非向量中断的概念与实现中断优先级的策略。百思不得其解?看来需要在日后的工作学习中找到答案了。



页: [1]
查看完整版本: RISC-V的非向量中断