AnsweredAssumed Answered

21469: Interrupts on loops

Question asked by user123 on Aug 24, 2010
Latest reply on Oct 25, 2010 by user123

Hello,

 

I'm having some trouble handling interrupts in the middle of hardware loops. Depending on where the interrupt occurs, its "rti" instruction doesn't return the execution where it would have gone without the interrupt. I'll illustrate it with an example:

 

I have the following C code:

 

int i, j, sum = 0;

for (i = 1; i < 10; i++)
   for(j = 1; j < i; j++)
      sum += j;

 

printf("%d", sum);

 

I compile it with optimization [0] so the compiler creates hardware loops. This is the assembler output:

 

r2=m5;
r12=m6;
r1=m6;
lcntr=0x9, do (pc,0x7) until lce;
comp(r12,r1);
if ge jump (pc, 0x5);
r8=r1-1, r0=m6;
lcntr=r8, do (pc,0x2) until lce;     <--------------
r2=r2+r0;
r0=r0+1;
r1=r1+1;

(... printf ...)

 

If the code is executed without interrupts, the correct result of the sum, which is stored in R2, is 120. However, with interrupts this result is not always obtained:

I put a breakpoint in the marked instruction, the second "do until". When execution stops on the breakpoint I create by hand an IRQ0 interruption, whose handler has a single plain "rti" instruction. Execution then continues without any other interruption until the loop ends.

While in the VisualDSP++ simulator, this scenario gives an incorrect sum of 165. Working with the HPUSB-ICE emulator with the EZ-Board gives 84.

 

Am I missing something, or is this a hardware/simulator anomaly?

 

Thanks,

Aitor

Outcomes