-2

当 CPU 接收到异常时,硬件预处理 将当前 PC 和 PSW 值保存在 RAM 中(或在快速中断的情况下保存在控制寄存器中)并读取向量 跳转到异常处理例程的开始。但是,在异常处理例程中使用的除 PC 和 PSW 之外的通用寄存器和控制寄存器必须在异常处理例程开始时由用户程序代码保存在堆栈中。从异常返回时,用户代码和硬件会重复反向操作。 (参考:瑞萨 Rx62n 硬件手册,第 297 页,章节:例外)

我的问题是这个用于上下文切换的用户代码在哪里以及它是如何被调用的?

4

1 回答 1

0

根据 Renesas CC-RX 编译器文档,要将任何全局函数声明为 ISR,我们需要将其指定为

#pragma interrupt func
void func (void) { ... }

编译器将为它生成代码:
func:
PUSHM R1-R3; Saves the registers used in the function.
....
(R1, R2, and R3 are used in the function)
....
POPM R1-R3; Restores the registers saved at the entry.
RTE

此外,我们还可以指定一些其他参数,例如:
快速中断(在这种情况下,PC 和 PSW 将通过硬件保存在 Backup BPC 和 BPSW 中,否则在堆栈中)
acc 保存/恢复
嵌套 enable
在中断函数中使用有限的寄存器,并且不要'不生成用于保存/恢复 R6-R13 寄存器的指令。

这解决了我的疑问。

于 2017-10-08T12:03:38.133 回答