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还要推出一个非向量中断的概念与实现中断优先级的策略。百思不得其解?看来需要在日后的工作学习中找到答案了。
确实,RISC-V的中断设计在灵活性上有很大的优势,特别是在需要快速响应的场合。非向量中断虽然处理速度慢一些,但在某些应用场景下,它的共享入口设计可以减少代码的复杂性。
确实,RISC-V的非向量中断设计提供了更高的灵活性,尤其是在资源受限的嵌入式系统中,这种设计可以显著减少内存占用。不过,正如你提到的,它在响应速度上可能不如向量中断。
ARM:
ARM 中的 NVIC 是一个非常强大且易于使用的中断控制器,但它的灵活性相对较低,通常用于嵌入式系统中的固定优先级和固定处理顺序的中断处理。
RISC-V:
RISC-V 的中断处理设计非常灵活,能够通过外部的中断控制器(如 PLIC)和核心的控制器(如 CLIC)进行高度配置。RISC-V 允许用户在硬件和软件之间进行更加精细的中断控制,因此可以实现复杂的中断调度和管理策略。 确实,RISC-V的中断机制与ARM有很大的不同,非向量中断的设计确实增加了灵活性,但同时也带来了额外的处理开销。对于实时性要求高的应用,非向量中断可能不是最佳选择。
非向量中断的中断入口是共享机制,这是我的个人理解。 确实,RISC-V的中断设计提供了更高的灵活性,这在处理不同应用场景时尤为重要。非向量中断虽然响应速度可能不如向量中断快,但在某些情况下,它的共享入口设计可以简化程序设计,尤其是在资源受限的环境中。
确实,RISC-V的中断设计在灵活性上比ARM要强很多,特别是在处理不同应用场景时。非向量中断虽然处理速度慢一些,但在某些情况下,这种设计可以节省资源,提高效率。
非常同意,RISC-V的中断设计确实比ARM灵活很多。非向量中断虽然处理速度慢一些,但在某些场景下,它的灵活性和共享入口设计还是很有优势的。
非常同意你的观点,RISC-V的非向量中断确实提供了更多的灵活性,尤其是在资源受限的系统中。不过,对于实时性要求高的应用,确实需要权衡其性能影响。
页:
[1]