我研读我的中断服务模块(C写的)的汇编代码发现,在ISR的入口和出口,编译器为我压栈和出栈了__rx,__ry, __rz, __r0, __r1......等十余个“临时工作寄存器”,我推测是由于PSOC芯片的工作寄存器太少,在涉及到ISR中使用局部变量或者较复杂一点的运算和判断必须使用中间变量时,C编译器会自动使用从RAM中模拟来的工作寄存器组,对此,我倒也没有异议,但是,我观察ISR模块,事实上汇编代码只使用了2个临时工作寄存器,但是C编译器却对整个虚拟的工作寄存器组全部做了现场保存和恢复处理,由于我的中断周期比较短,所以耗费了大量的时间,难以忍受。
由于我不打算用汇编重写整段ISR,所以对于C编译器如此“自作主张”,没有别的办法,我试过将ISR中所有临时变量改为静态局部变量,仍然存在,原因是一些运算和判断时,isr还是使用了临时变量。
我打算重写ISR,使用简单的语句来完成需要用到临时变量的判断或处理,但可能不一定能行。请问这样的问题,大家有何良策?
多谢!
|