We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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.