首先,我做了一些研究:
我希望能够获取并设置MCU程序计数器。我正在研究一些内核代码,并希望实现基本的上下文切换,以便在其中存储密钥寄存器和PC,以便稍后进行恢复。
我正在uC32开发板上使用PIC32MX340F512器件(忽略该事实是针对Aurduino的。)
我可以获取EPC(异常程序计数器)值,但是它仅存储最后一个异常的PC值。但是您可以对其进行写操作,然后调用eret
asm指令将PC跳转到其位置。如果我可以在代码中感兴趣的位置创建一个伪造的异常,那么我可能可以获取该值?似乎有点黑。
我已经看到一些人通过PCL和PCH寄存器写入PC的示例,但是这些似乎没有在我的MPLAB工作区(XC编译器)中定义。
有什么想法吗?我已经包括了TNKernel的要点,该要点为PIC32器件进行了上下文切换,但是它是汇编语言,很不幸我并不理解。但它看起来确实像是在ISR中完成的,这是有道理的。当我们跳入ISR时,无论如何都必须进行上下文切换。
答案 0 :(得分:0)
仅当cpu处于内核模式时,才可以更改EPC寄存器的值。最简单的方法是在程序集中实现ISR,因为中断是在内核模式下处理的。您可以创建一个简单的ISR函数,并从MPLABX的反汇编窗口中获取用于处理中断的汇编代码,并且在执行eret函数之前,可以将新值设置为EPC寄存器。当eret返回EPC寄存器中的地址时,所有cpu寄存器将在进入ISR之前恢复为以前的值,因此您应该在从ISR返回之前备份$ ra和$ epc寄存器,并使用其他功能进行其余操作,其地址在EPC寄存器中。