This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

How to debug through malloc function?

Hi All,

I am using EFM32GG11 cpu and have problem with malloc function. It crashes on the first call.

I have specified stack and heap areas in the scatter file.

I would like to debug through malloc function. I am using the standart C library linked to my keil MDK 5 project,

How could i build c runtime and link it to my project?

Thanks,

Parents
  • Annotated listing

    08006F2C        SUB16   malloc:                         ; Xref 8001E6C 8002B48
    08006F2C B5F0                   push    {r4, r5, r6, r7, lr}
    08006F2E 300B                   adds    r0, #11
    08006F30 4D15                   ldr     r5, [pc, #84]   ; ($8006F88=$20000008) __microlib_freelist_initialised
    08006F32 F020 0107              bic.w   r1, r0, #7      ; $7
    08006F36 2400                   movs    r4, #0          ; NULL
    08006F38        LOC     loc_8006F38:                    ; Xref 8006F86
    08006F38 4A14                   ldr     r2, [pc, #80]   ; ($8006F8C=$20000004) __microlib_freelist
    08006F3A E00F                   b.n     loc_8006F5C
    08006F3C        LOC     loc_8006F3C:                    ; Xref 8006F60
    08006F3C 6803                   ldr     r3, [r0, #0]
    08006F3E 428B                   cmp     r3, r1
    08006F40        LOC     loc_8006F40:                    ; Xref 8006FC6
    08006F40 D30B                   bcc.n   loc_8006F5A
    08006F42 428B                   cmp     r3, r1
    08006F44 D905                   bls.n   loc_8006F52
    08006F46 1A5E                   subs    r6, r3, r1
    08006F48 1843                   adds    r3, r0, r1
    08006F4A 6847                   ldr     r7, [r0, #4]
    08006F4C E9C3 6700              strd    r6, r7, [r3]
    08006F50 E000                   b.n     loc_8006F54
    08006F52        LOC     loc_8006F52:                    ; Xref 8006F44
    08006F52 6843                   ldr     r3, [r0, #4]
    08006F54        LOC     loc_8006F54:                    ; Xref 8006F50
    08006F54 6013                   str     r3, [r2, #0]
    08006F56 C002                   stmia   r0!, {r1}
    08006F58 E004                   b.n     loc_8006F64
    08006F5A        LOC     loc_8006F5A:                    ; Xref 8006F40
    08006F5A 1D02                   adds    r2, r0, #4
    08006F5C        LOC     loc_8006F5C:                    ; Xref 8006F3A
    08006F5C 6810                   ldr     r0, [r2, #0]
    08006F5E 2800                   cmp     r0, #0
    08006F60 D1EC                   bne.n   loc_8006F3C
    08006F62 4620                   mov     r0, r4
    08006F64        LOC     loc_8006F64:                    ; Xref 8006F58
    08006F64 2800                   cmp     r0, #0
    08006F66 D102                   bne.n   loc_8006F6E     ; allocation success, leave
    
    08006F68 6828                   ldr     r0, [r5, #0]    ; [__microlib_freelist_initialised]
    08006F6A B108                   cbz     r0, loc_8006F70 ; init == 0?
    08006F6C 2000                   movs    r0, #0
    08006F6E        LOC     loc_8006F6E:                    ; Xref 8006F66
    08006F6E BDF0                   pop     {r4, r5, r6, r7, pc}
    
    08006F70        LOC     loc_8006F70:                    ; Xref 8006F6A
    08006F70 4A06                   ldr     r2, [pc, #24]   ; ($8006F8C=$20000004) __microlib_freelist
    08006F72 4807                   ldr     r0, [pc, #28]   ; ($8006F90=$20002C54) __heap_base + 4
    08006F74 6010                   str     r0, [r2, #0]
    08006F76 4A07                   ldr     r2, [pc, #28]   ; ($8006F94=$20004C50) __heap_limit
    08006F78 1A12                   subs    r2, r2, r0
    08006F7A F022 0207              bic.w   r2, r2, #7      ; $7
    08006F7E        LOC     loc_8006F7E:                    ; Xref 8006FC0
    08006F7E E9C0 2400              strd    r2, r4, [r0]    ; linked list (size this, prev)
    
    08006F82 2001                   movs    r0, #1
    08006F84 6028                   str     r0, [r5, #0]    ; init = 1
    08006F86        LOC     loc_8006F86:                    ; Xref 8006FC8
    08006F86 E7D7                   b.n     loc_8006F38
    08006F88        LOC     loc_8006F88:                    ; Xref 8006FCA
    08006F88 20000008               dd      $20000008
    08006F8C 20000004               dd      $20000004
    08006F90 20002C54               dd      $20002C54
    08006F94 20004C50               dd      $20004C50
    

Reply
  • Annotated listing

    08006F2C        SUB16   malloc:                         ; Xref 8001E6C 8002B48
    08006F2C B5F0                   push    {r4, r5, r6, r7, lr}
    08006F2E 300B                   adds    r0, #11
    08006F30 4D15                   ldr     r5, [pc, #84]   ; ($8006F88=$20000008) __microlib_freelist_initialised
    08006F32 F020 0107              bic.w   r1, r0, #7      ; $7
    08006F36 2400                   movs    r4, #0          ; NULL
    08006F38        LOC     loc_8006F38:                    ; Xref 8006F86
    08006F38 4A14                   ldr     r2, [pc, #80]   ; ($8006F8C=$20000004) __microlib_freelist
    08006F3A E00F                   b.n     loc_8006F5C
    08006F3C        LOC     loc_8006F3C:                    ; Xref 8006F60
    08006F3C 6803                   ldr     r3, [r0, #0]
    08006F3E 428B                   cmp     r3, r1
    08006F40        LOC     loc_8006F40:                    ; Xref 8006FC6
    08006F40 D30B                   bcc.n   loc_8006F5A
    08006F42 428B                   cmp     r3, r1
    08006F44 D905                   bls.n   loc_8006F52
    08006F46 1A5E                   subs    r6, r3, r1
    08006F48 1843                   adds    r3, r0, r1
    08006F4A 6847                   ldr     r7, [r0, #4]
    08006F4C E9C3 6700              strd    r6, r7, [r3]
    08006F50 E000                   b.n     loc_8006F54
    08006F52        LOC     loc_8006F52:                    ; Xref 8006F44
    08006F52 6843                   ldr     r3, [r0, #4]
    08006F54        LOC     loc_8006F54:                    ; Xref 8006F50
    08006F54 6013                   str     r3, [r2, #0]
    08006F56 C002                   stmia   r0!, {r1}
    08006F58 E004                   b.n     loc_8006F64
    08006F5A        LOC     loc_8006F5A:                    ; Xref 8006F40
    08006F5A 1D02                   adds    r2, r0, #4
    08006F5C        LOC     loc_8006F5C:                    ; Xref 8006F3A
    08006F5C 6810                   ldr     r0, [r2, #0]
    08006F5E 2800                   cmp     r0, #0
    08006F60 D1EC                   bne.n   loc_8006F3C
    08006F62 4620                   mov     r0, r4
    08006F64        LOC     loc_8006F64:                    ; Xref 8006F58
    08006F64 2800                   cmp     r0, #0
    08006F66 D102                   bne.n   loc_8006F6E     ; allocation success, leave
    
    08006F68 6828                   ldr     r0, [r5, #0]    ; [__microlib_freelist_initialised]
    08006F6A B108                   cbz     r0, loc_8006F70 ; init == 0?
    08006F6C 2000                   movs    r0, #0
    08006F6E        LOC     loc_8006F6E:                    ; Xref 8006F66
    08006F6E BDF0                   pop     {r4, r5, r6, r7, pc}
    
    08006F70        LOC     loc_8006F70:                    ; Xref 8006F6A
    08006F70 4A06                   ldr     r2, [pc, #24]   ; ($8006F8C=$20000004) __microlib_freelist
    08006F72 4807                   ldr     r0, [pc, #28]   ; ($8006F90=$20002C54) __heap_base + 4
    08006F74 6010                   str     r0, [r2, #0]
    08006F76 4A07                   ldr     r2, [pc, #28]   ; ($8006F94=$20004C50) __heap_limit
    08006F78 1A12                   subs    r2, r2, r0
    08006F7A F022 0207              bic.w   r2, r2, #7      ; $7
    08006F7E        LOC     loc_8006F7E:                    ; Xref 8006FC0
    08006F7E E9C0 2400              strd    r2, r4, [r0]    ; linked list (size this, prev)
    
    08006F82 2001                   movs    r0, #1
    08006F84 6028                   str     r0, [r5, #0]    ; init = 1
    08006F86        LOC     loc_8006F86:                    ; Xref 8006FC8
    08006F86 E7D7                   b.n     loc_8006F38
    08006F88        LOC     loc_8006F88:                    ; Xref 8006FCA
    08006F88 20000008               dd      $20000008
    08006F8C 20000004               dd      $20000004
    08006F90 20002C54               dd      $20002C54
    08006F94 20004C50               dd      $20004C50
    

Children
  • Unfortunately i am not using MicroLib. I am using default C library. (no check in Keil Project options for Use MicroLib).

    Currently i can't understand one issue. I have specified the scatter file to the linker. I have

    ARM_LIB_HEAP 0x2007F000 EMPTY  HeapSize { }

    line.

    Nut in .map file i see 

    HEAP 0x20019cc8 Section 3072 startup_efm32gg11b.o(HEAP)
    Heap_Mem 0x20019cc8 Data 3072 startup_efm32gg11b.o(HEAP)

    Why address is 0x20019cc8  and not 0x2007F000 ? I can't understand.