在include/asm/entry.h中定义了几个用于中断处理时的宏,如下所示:
/*
* Code to save processor context.
* We even save the register which are preserved by a function call
* - r4, r5, r6, r7, p3, p4, p5
*/
.macro save_context_with_interrupts
[--sp] = R0;
[--sp] = ( R7:0, P5:0 );
[--sp] = fp;
[--sp] = usp;
。。。
.endm
.macro save_context_no_interrupts
[--sp] = R0;
[--sp] = ( R7:0, P5:0 );
[--sp] = fp;
[--sp] = usp;
。。。
.endm
.macro restore_context_no_interrupts
sp += 4;
SYSCFG = [sp++];
SEQSTAT = [sp++];
RETE = [sp++];
RETN = [sp++];
RETX = [sp++];
r0 = [sp++];
RETI = r0;
RETS = [sp++];
。。。
.endm
.macro restore_context_with_interrupts
sp += 4;
SYSCFG = [sp++];
SEQSTAT = [sp++];
RETE = [sp++];
RETN = [sp++];
RETX = [sp++];
RETI = [sp++];
RETS = [sp++];
。。。
.endm
在之前的文章提过,应该用define来代替.macro,行动起来吧!
不过这里还有一个问题:
( R7 : 0, P5 : 0) = [ SP ++ ]; /
在VDSP下必须写成:
( R7:0, P5:0) = [ SP ++ ]; /
就是空格惹的祸。