Texas Instruments TMS320C67X/C67X+ DSP Car Speaker User Manual

Programming Considerations
Interrupts5-24 SPRU733
Example 513 shows a C-based interrupt handler that allows nested
interrupts. The steps are similar, although the compiler takes care of allocating
the stack and saving CPU registers. For more information on using C to access
control registers and write interrupt handlers, see the TMS320C6000
Optimizing C Compiler Users Guide, SPRU187.
Example 512. Assembly Interrupt Service Routine That Allows Nested Interrupts
STW B0, *B15−−[4] ; Save B0, allocate 4 words of stack
STW B1, *B15[1] ; Save B1 on stack
STW B0, *B15[2] ; Save IRP on stack
STW B0, *B15[3] ; Save CSR (and thus PGIE) on stack
OR B0, 1, B1
MVC B1, CSR ; Enable interrupts
; Interrupt service code goes here.
; Interrupts may occur while this code executes.
MVC CSR, B0 ;\
AND B0, 2, B1 ; |−− Disable interrupts.
MVC B1, CSR ;/ (Set GIE to 0)
LDW *B15[3], B0 ; get saved value of CSR into B0
NOP 4 ; wait for LDW *B15[3] to finish
MVC B0, CSR ; Restore PGIE
LDW *B15[2], B0 ; get saved value of IRP into B1
MVC B0, IRP ; Restore IRP
B IRP ; Return from interrupt
|| LDW *B15[1], B1 ; Restore B1
LDW *++B15[4], B0 ; Restore B0, release stack.
NOP 4 ; wait for B IRP and LDW to complete.