2014-10-27 7 views
7

मैं एक STM32Cube परियोजना हाथ-नन-EABI-जीसीसी और एक Makefile का उपयोग कर संकलित पाने के लिए कोशिश कर रहा हूँ __libc_init_array। मैं निर्दिष्ट किए हैं:Hardfault STM32F030 स्टार्टअप पर,

CFLAGS = -mthumb\ 
     -march=armv6-m\ 
     -mlittle-endian\ 
     -mcpu=cortex-m0\ 
     -ffunction-sections\ 
     -fdata-sections\ 
     -MMD\ 
     -std=c99\ 
     -Wall\ 
     -g\ 
     -D$(PART)\ 
     -c 

और:

LDFLAGS = -Wl,--gc-sections\ 
      -Wl,-T$(LDFILE)\ 
      -Wl,-v 

परिवार कल्याण problems.but बिना बनाता है जब मैं एमसीयू मैं हार्ड दोष में फंस बूट। स्टैक ट्रेस है:

#0 HardFault_Handler() at ./Src/main.c:156 
#1 <signal handler called> 
#2 0x0800221c in ____libc_init_array_from_thumb() 
#3 0x080021be in LoopFillZerobss() at Src/startup_stm32f030x8.s:103 
#4 0x080021be in LoopFillZerobss() at Src/startup_stm32f030x8.s:103 
Backtrace stopped: previous frame identical to this frame (corrupt stack?) 

और मैं हार्ड दोष सीधे जाकर जब स्टार्टअप फ़ाइल में bl __libc_init_array लिए कदम।

/* Zero fill the bss segment. */ 
FillZerobss: 
    movs r3, #0 
    str r3, [r2] 
    adds r2, r2, #4 


LoopFillZerobss: 
    ldr r3, = _ebss 
    cmp r2, r3 
    bcc FillZerobss 

/* Call the clock system intitialization function.*/ 
    bl SystemInit 
/* Call static constructors */ 
    bl __libc_init_array 
/* Call the application's entry point.*/ 
    bl main 

कोई विचार गलत क्या हो सकता है?

मेरे हाथ-नन-EABI-जीसीसी संस्करण है 4.8.4 20,140,725 (जारी)

[संपादित करें] कॉल से

08002218 <____libc_init_array_from_thumb>: 
8002218: 4778  bx pc 
800221a: 46c0  nop   ; (mov r8, r8) 
800221c: eafff812 b 800026c <__libc_init_array> 

0800026c <__libc_init_array>: 
800026c: e92d4070 push {r4, r5, r6, lr} 
8000270: e59f506c ldr r5, [pc, #108] ; 80002e4 <__libc_init_array+0x78> 
8000274: e59f606c ldr r6, [pc, #108] ; 80002e8 <__libc_init_array+0x7c> 
8000278: e0656006 rsb r6, r5, r6 
800027c: e1b06146 asrs r6, r6, #2 
8000280: 12455004 subne r5, r5, #4 
8000284: 13a04000 movne r4, #0 
8000288: 0a000005 beq 80002a4 <__libc_init_array+0x38> 
800028c: e2844001 add r4, r4, #1 
8000290: e5b53004 ldr r3, [r5, #4]! 
8000294: e1a0e00f mov lr, pc 
8000298: e12fff13 bx r3 
800029c: e1560004 cmp r6, r4 
80002a0: 1afffff9 bne 800028c <__libc_init_array+0x20> 
80002a4: e59f5040 ldr r5, [pc, #64] ; 80002ec <__libc_init_array+0x80> 
80002a8: e59f6040 ldr r6, [pc, #64] ; 80002f0 <__libc_init_array+0x84> 
80002ac: e0656006 rsb r6, r5, r6 
80002b0: eb0007ca bl 80021e0 <_init> 
80002b4: e1b06146 asrs r6, r6, #2 
80002b8: 12455004 subne r5, r5, #4 
80002bc: 13a04000 movne r4, #0 
80002c0: 0a000005 beq 80002dc <__libc_init_array+0x70> 
80002c4: e2844001 add r4, r4, #1 
80002c8: e5b53004 ldr r3, [r5, #4]! 
80002cc: e1a0e00f mov lr, pc 
80002d0: e12fff13 bx r3 
80002d4: e1560004 cmp r6, r4 
80002d8: 1afffff9 bne 80002c4 <__libc_init_array+0x58> 
80002dc: e8bd4070 pop {r4, r5, r6, lr} 
80002e0: e12fff1e bx lr 
80002e4: 08002258 .word 0x08002258 
80002e8: 08002258 .word 0x08002258 
80002ec: 08002258 .word 0x08002258 
80002f0: 08002260 .word 0x08002260 

[संपादित करें 2] रजिस्टर मूल्यों के disassembly gdb: __libc_init_array एआरएम कोड, नहीं अँगूठा है

(gdb) info reg 
r0    0x20000000 536870912 
r1    0x1 1 
r2    0x0 0 
r3    0x40021000 1073876992 
r4    0xffffffff -1 
r5    0xffffffff -1 
r6    0xffffffff -1 
r7    0x20001fd0 536879056 
r8    0xffffffff -1 
r9    0xffffffff -1 
r10   0xffffffff -1 
r11   0xffffffff -1 
r12   0xffffffff -1 
sp    0x20001fd0 0x20001fd0 
lr    0xfffffff9 -7 
pc    0x800067c 0x800067c <HardFault_Handler+4> 
xPSR   0x61000003 1627389955 
+0

फ़ाइल अलग करना, देखने के लिए जहां कूद जाता है, तो उस पते पर कोड की जाँच करें। शायद आपके द्वारा लिंक किए जा रहे libc के साथ कुछ समस्या है, जो टूटी हुई कूद या कुछ उत्पन्न करता है। – unwind

+0

@unwind यह हो सकता है कि यह 'b' अनुदेश का उपयोग कर शाखाओं में है, लेकिन कूद से अधिक +/- 2KB है? – evading

उत्तर

8

यही कारण है, इसलिए एम 0 के साथ यह नहीं समझती कुछ बकवास पर अमल करने की कोशिश कर गिर जाएगी (क ctually, यह bx में एआरएम राज्य में स्विच करने के प्रयास पर गलती नहीं करता है, लेकिन हे, एक ही अंतर ...)

आपको यह सुनिश्चित करना होगा कि आप किसी के शुद्ध-थंब संस्करणों का उपयोग करें पुस्तकालय - एक कॉर्टेक्स-एम-विशिष्ट टूलचेन एक सामान्य एआरएम की तुलना में बेहतर शर्त हो सकता है। यदि आप एक multilib toolchain है, तो मैं arm-none-eabi-gcc --print-multi-lib के उत्पादन की जाँच सुनिश्चित करें कि आप सभी प्रासंगिक विकल्प उचित कॉर्टेक्स-एम पुस्तकालयों पाने के लिए निर्दिष्ट किया है, और आप एक अलग लिंक कदम उपयोग कर रहे हैं, सुनिश्चित करें कि आप आह्वान बनाने बनाने के लिए सुझाव देंगे LD=arm-none-eabi-ld के बजाय LD=arm-none-eabi-gcc (साथ ही प्रासंगिक मल्टीलिब विकल्प) के साथ।

+5

मैं लिंक समय झंडे के रूप में -mcpu = cortex-m0 और -mthumb देने के लिए चूक गया था। – evading

+0

अच्छा जवाब। इस भर में आने वाले लोगों के लिए, वहाँ अन्य कारणों से हो सकता है: यदि आप अपने toolchain खुद का निर्माण किया है, तो आप वास्तव में multilib सक्षम और सुनिश्चित करती है चाहिए अपने टी हाथ-योगिनी सभी कॉर्टेक्स-एम (और शायद ARM7TDMI-) के साथ-का समर्थन करता है । –

संबंधित मुद्दे