原帖 | 海底 | 2024-05-22 12:24 | 👍0 | 阅读约1
以下两个问题我找了一天,没找出来因为什么,后面发现是自己看文档不仔细才让我浪费这么久的时间,先在这里大致记录一下。
在N级别risc-v的架构下,rtos需要加上“csrrw sp, CSR_MSCRATCHCSWL, sp”这样一行代码来实现中断与应用的栈空间分离;但是risc-v中中断的保存上下文都是软件实现的,还支持中断嵌套,在我的理解中出现一个中断嵌套就又跑了一遍这个指令代码,这不又切换成应用程序的栈空间了嘛,这个应该怎么理解啊?
还有就是芯来的N级别risc-v这种类型的寄存器提供了两个:mscratchcsw和mscratchcswl。第一个用于在不同特权模式间切换;第二个用于支持同一特权模式下出现中断程序与应用程序切换。这个又该怎么确定用哪个,毕竟risc-v中非向量中断都是统一入口,我的理解中这个应该很难保证实际场景中到底哪个满足使用条件吧?
以上两个问题都可以用以下的解释来解答:
这是关于上面两个寄存器的伪代码解释
csrrw rd, mscratchcsw, rs1
~~~c
csrrw rd, mscratchcsw, rs1
// Pseudocode operation.
if (mcause.mpp!=M-mode) then {
t = rs1; rd = mscratch; mscratch = t;
} else {
rd = rs1; // mscratch unchanged.
}
// Usual use: csrrw sp, mscratchcsw, sp
这个很好理解,就看中断前的模式是否为机器模式,不是的话就交换sp寄存器,否则不交换。而且有中断嵌套也不会满足if语句,并不会交换sp寄存器
csrrw rd, mscratchcswl, rs1
// Pseudocode operation.
if ( (mcause.mpil==0) != (mintstatus.mil == 0) ) then {
t = rs1; rd = mscratch; mscratch = t;
} else {
rd = rs1; // mscratch unchanged.
}
risc-v机器模式的普通情况,mil默认就是0,天然处于中断等级0的环境中,表示没有异常或者中断。如果来异常或者中断,机器模式的子模式会发生变化,中断等级会发生变化,就会满足if判断,发生交换;如果出现中断嵌套,就会发现if条件不满足:(mintstatus.mil == 0)为flase,(mcause.mpil==0)也为flase。不满足if条件语句,也就不会交换sp寄存器。
相关笔记