Where is it looping?

03 Sep 2010

I have a program that occasionally hangs in some function (loop) and I was hoping someone has a way of telling me where the program is hung. I could ground the NMI or some other pin to tell the program to printf its pc address but that is a little much for me to do. Any suggestions would be welcome.

 

regards

03 Sep 2010

Well, you could possibly create an interrupt function, that will write the address, when a button is pressed.
I'll look into the datasheet soon, an see if possible, to get address of the program.

/ Lerche

16 Sep 2010

That would be great. I had another project 6 months ago that I had to give up on because of the same reason.

16 Sep 2010 . Edited: 17 Sep 2010

I did something similar on our ARM7 Oberon-07 system but using a timer interrupt. The interrupt handler just prints out the value of the link register (i.e. the address that the interrupt handler came from / will return to) every second or so. When the address changes become repetitive there is a good chance it is in a loop. It only took a couple of minutes to track down the culprit.

17 Sep 2010

Well, let's see the source? :-)

If you're willing to share?

/Lerche

17 Sep 2010 . Edited: 17 Sep 2010

You are certainly welcome to it but I don't think it will help you much more than I have said already. It is the technique not the actual code that is relevant - this was written in Oberon-07 for the LPC2xxx series:

PROCEDURE TimerHandler[4]; (* 4 for IRQ or FIQ *)
VAR
  lnk: INTEGER;
BEGIN
  INC(timeVal);
  (* Retrieve the saved value of the link register *)
  SYSTEM.GET(SYSTEM.FP + (13 * 4), lnk);
  Out.Char('t'); Out.Int(timeVal, 6); Out.Hex(lnk, 12); Out.Ln;
  (* Clear the MR0 interrupt *)
  SYSTEM.PUT(LPC.T1IR, {0});                       
  (* Update the VIC priority hardware *)  
  SYSTEM.PUT(LPC.VICVectAddr, 0)
END TimerHandler;

The value (13 * 4) is explained by the fact that the following instructions are excuted on entry to the interrupt handler:

stmdb      sp!, { r0 r1 r2 r3 r4 r5 r6 r7 r8 r9 r10 r11 fp lr }
mov        fp,sp

So all we are doing is accessing the value of the link register (lr = R13) using the value of the stack pointer (sp = R14) that was saved in the frame pointer (fp = R12)

It might be even easier on the LPC17xx. I can't find my mbed (being miniature is not always a good thing!) but I've just had a look at the code generated for the LPCXpresso. It looks as though lr is untouched in the IRQ handler. I just don't know the best way of accessing the value of lr using C.

Regards,

Chris.

17 Sep 2010

As you said, that doesn't help me much, but thanks anyways buddy!

My C skills isn't quite perfect, but I will look into the datasheet, as soon as I have the time. :-)

 

Regards,

Lerche