[En-Nut-Discussion] Ethernut on TI's Cortex-M3 (Stellaris LM3S...)

Ole Reinhardt ole.reinhardt at embedded-it.de
Mon Oct 15 16:11:05 CEST 2012

Hi Philipp,

> Anyway, the problem I'm facing now is that the controller seems to hit 
> an unexpected interrupt or even an exception when running the example 
> code. The end result is that the LED does not blink, but according to 
> GDB the processor hangs in one of the endless loops found in 
> cortex_init.c, namely in IntDefaultHandler(). If I comment the loop 
> there, it looks like the CPU hits a BusFault, at least this is what 
> GDB/OpenOCD says.
> Could anyone give me a hint on what to do now? I couldn't figure out how 
> to single-step through the program using GDB to find out where it enters 
> the handler and I don't really know the way through all of the Nut/OS 
> sources.

You use openocd? Great! So you can simply figure out where you are and
what caused the exception:

Let me explain it step by step.

What you need:

a) a buggy program
b) openocd
c) an assembler listing of your code

Prepare the last one:

arm-none-eabi-objdump -d buggy_program.elf > buggy_program.asm_dump

You will need it to find out the exact place of your exception

Next connect with openocd to your board and let your program run.

If your board crashed, call 

> halt
target state: halted
target halted due to debug-request, current mode: Handler BusFault
xPSR: 0x21000005 pc: 0x00000f60 msp: 0x10000928

The interesting part is the current stack pointer (msp) as the program
counter value of your exception was pushed on the stack before entering
the exception handler (a while(1) loop).

Read out the stack:

> mdw 0x10000928 8
0x10000928: 00000000 10001040 00000001 ffffffff 00000fbc 00002ec1
000005ee 21000000 

the "mdw 0x10000928 8" command reads out 16 words starting from address
0x10000928, where you should replace the 0x10000928 with the value of
your msp.

Find the 7.th value: 0x000005ee in this example. This is the address
where your exception occured.

Next look into our assembler listing (buggy_program.asm_dump)

     5de:       f04f 34ff       mov.w   r4, #4294967295
     5e2:       f44f 707a       mov.w   r0, #1000       ; 0x3e8
     5e6:       9410            str     r4, [sp, #64]   ; 0x40
     5e8:       f002 fdae       bl      3148 <NutSleep>
     5ec:       9b10            ldr     r3, [sp, #64]   ; 0x40
     5ee:       6818            ldr     r0, [r3, #0]
     5f0:       f002 fdaa       bl      3148 <NutSleep>
     5f4:       e7f5            b.n     5e2 <main+0x296>
     5f6:       bf00            nop

The above example shows you that the parameter to a NutSleep call caused
the error and that this is inside the main() function.

And here is the faulty code (sample):

        i = 0xFFFFFFFF;
        NutSleep(*(uint32_t *)i);

Perhaps you want to know what the other values on the stack stay for?

address:       value:

msp            stacked r0 value 
msp + 0x04     stacked r1 value
msp + 0x08     stacked r2 value
msp + 0x0C     stacked r3 value
msp + 0x10     stacked r12 value
msp + 0x14     stacked lr value
msp + 0x18     stacked pc value
msp + 0x1C     stacked psr value

If you can not find the problem, please drop me a line. I also have an
LM2S9B96 development kit, so I could do some debugging here...




Thermotemp GmbH, Embedded-IT

Embedded Hard-/ Software and Open Source Development, 
Integration and Consulting


Geschäftsstelle Siegen - Steinstraße 67 - D-57072 Siegen - 
tel +49 (0)271 5513597, +49 (0)271-73681 - fax +49 (0)271 736 97

Hauptsitz - Hademarscher Weg 7 - 13503 Berlin
Tel +49 (0)30 4315205 - Fax +49 (0)30 43665002
Geschäftsführer: Jörg Friedrichs, Ole Reinhardt
Handelsregister Berlin Charlottenburg HRB 45978 UstID DE 156329280 

More information about the En-Nut-Discussion mailing list