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,
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
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.