我还有一个关于上下文切换的内联汇编指令的问题。这段代码可能有效,但我不确定100%,所以我将此代码提交给stackoverflow的专业人员; - )
我正在为arm7TDMI使用gcc(无优化)进行编译。在某些时候,代码必须进行上下文切换。
/* Software Interrupt */
/* we must save lr in case it is called from SVC mode */
#define ngARMSwi(code) __asm__("SWI %0" : : "I"(code) : "lr")
// Note : code = 0x23
当我检查编译的代码时,我得到了这个结果:
svc 0x00000023
我之前编写此代码的人写道“我们必须保存lr”,但在编译的代码中,我没有看到任何lr被保存的痕迹。
我认为代码可能出错的原因是程序在进入重置异常之前运行了一段时间,代码执行的最后一件事是上下文切换...
答案 0 :(得分:0)
__asm__
语句将lr
列为破坏寄存器。这意味着如果需要,编译器将保存寄存器。
由于您没有看到任何保存,我认为您可以假设编译器没有使用该寄存器(至少在您的测试用例中)。
答案 1 :(得分:0)
我认为应该在用户模式下调用SWI指令。如果这是对的。在该指令之后,ARM的模式切换到SVC模式。然后ARM内核执行复制操作,将CPSR复制到SPSR_svc中,并将LR复制到LR_svc中。这应该用于保存用户模式cpu的上下文从svc模式返回。如果你的svc异常处理程序使用lr喜欢调用另一个函数,则应该要求保留lr寄存器,就像在模式更改之间使用堆栈一样。我想在你这样写之前就是这样谈论这种情况。