打印
[RISC-V MCU 应用开发]

RISC-V的非向量中断

[复制链接]
110|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
黄昏收获|  楼主 | 2025-6-29 15:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
研究了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[0] = 1 mtvt2[0]为0时,中断入口使用mtvec寄存器,mtvt2[0]为1时,中断入口为mtvt2[31:2]。

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

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还要推出一个非向量中断的概念与实现中断优先级的策略。百思不得其解?看来需要在日后的工作学习中找到答案了。



使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

4

主题

10

帖子

0

粉丝