Timer 在ARM中禁用内核源中用于模式切换的计时器中断

Timer 在ARM中禁用内核源中用于模式切换的计时器中断,timer,linux-kernel,arm,interrupt,armv7,Timer,Linux Kernel,Arm,Interrupt,Armv7,我在内核源代码(Linux3.0)中添加了一个小函数,它可以完成一些任务,在SVC模式下运行良好。但在中断模式下(即,当内核中通过local\u irq\u enable启用定时器中断时),它不工作。所以我想在执行我的功能之前切换到SVC模式。我从一篇文章中获取了切换模式的代码 void myfunction(…某些参数) { unsigned int oldmode=get_cpsr()&0x1f; if(oldmode==18)//检查IRQ模式 改变模式(SVC模式); //…我的代码。

我在内核源代码(Linux3.0)中添加了一个小函数,它可以完成一些任务,在SVC模式下运行良好。但在中断模式下(即,当内核中通过
local\u irq\u enable
启用定时器中断时),它不工作。所以我想在执行我的功能之前切换到SVC模式。我从一篇文章中获取了切换模式的代码

void myfunction(…某些参数)
{ 
unsigned int oldmode=get_cpsr()&0x1f;
if(oldmode==18)//检查IRQ模式
改变模式(SVC模式);
//…我的代码。。。。
恢复_模式(旧模式);
}
定义如下:

#定义模式_irq0x12
#定义模式\u SVC 0x13
#定义变更模式(模式)asm(“cps%0”:“I”(模式))
#定义恢复模式(模式)\
模式&=0x1f\
asm(“msr cpsr,%0\n”:“r”(模式):“cc”)
静态内联无符号整数get_cpsr(void)
{
无符号int-val;
__asm\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
:“=r”(val));
返回val;
}
即使在这之后,我也没有得到正确的输出。函数执行在某个地方卡住了。我已经调试了它被卡住的地址,它指向System.map的这些符号

\u异常\u文本\u开始
_斯特克斯
asm\U do\U IRQ


我对函数的使用是否正确。你能给我建议其他解决这个问题的方法吗。我在ARMv7板上运行这个映像。最后,在更改模式后,在我的函数中调用了一些内核API,如
printch()

@artless请提供有关如何实现这一点的建议。请参阅。我觉得你有些误解。armlinux几乎从不在IRQ模式下执行。最可能的问题是我的代码有一些不可重入的内容,包括您的代码调用的其他函数。@artlessnoise但是计时器中断在哪里处理。在计时器中断到来之前,代码工作正常。我发现最后执行并不断重复的函数是:
handle\u edge\u irq
->
\u raw\u spin\u lock
->
\u raw\u spin\u lock
->
添加抢占计数
->
子抢占计数
。你能指出哪里出了问题吗。我所说的例外情况发生在对
gic_irq
@notlikethat调用之后。在
handle\u edge\u irq
中还调用了irq\u check\u poll。