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.



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?


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 *)
  lnk: INTEGER;
  (* 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 *)  
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.



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. :-)