[En-Nut-Discussion] newlib itoa() and RAM funny problem

Philipp Burch phip at hb9etc.ch
Fri Nov 16 16:33:06 CET 2012


Hi all,

no need to search for the instructions, here are they (still great, 
thanks Ole!):

On 10/15/2012 Ole Reinhardt wrote:
> 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(1000);
>         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
>

Happy debugging,
Philipp


More information about the En-Nut-Discussion mailing list