STM32F4 -> Default_Reset_Handler()

Gast #3065445
Lesenswert?

Wenn ich versuche zu debuggen kommt der Controller nicht aus dem 
Default_Reset_Handler() heraus. Er hängt in dieser schleife:
1
for(pulDest = &_sdata; pulDest < &_edata; )
2
  {
3
    *(pulDest++) = *(pulSrc++);
4
  }
main() wird also nicht aufgerufen. Sobald ich aber einmal suspend 
genutzt habe und dann das Programm wieder weiter laufen lasse, springt 
er in main()



Es liegt nicht an  der Hardware. Habe es mit mehreren Discovery Boards 
getestet, das Problem ist immer dass gleiche.

Es muss also eigentlich an der Software liegen. Der eigene Code dürfte 
an sich aber keinen Einfluss haben da dieser ja noch gar nicht 
aufgerufen wurde. Der Fehler trat zum ersten mal auf als ich eine eine 
unbedeutende Berechnung minimal umgestellt habe. Habe das ganze dann 
wieder rückgängig gemacht, der Fehler blieb aber bestehen.

Ich bin ziemlich ratlos ...
Gast #3065537
Lesenswert?

habe jetzt noch gesehen dass er bis zu dieser Zeile kommt:   __asm(" 
ldr     r0, =_sbss\n"
1
/**
2
  * @brief  This is the code that gets called when the processor first
3
  *         starts execution following a reset event. Only the absolutely
4
  *         necessary set is performed, after which the application
5
  *         supplied main() routine is called.
6
  * @param  None
7
  * @retval None
8
  */
9
void Default_Reset_Handler(void)
10
{
11
  /* Initialize data and bss */
12
  unsigned long *pulSrc, *pulDest;
13

14
  /* Copy the data segment initializers from flash to SRAM */
15
  pulSrc = &_sidata;
16

17
  for(pulDest = &_sdata; pulDest < &_edata; )
18
  {
19
    *(pulDest++) = *(pulSrc++);
20
  }
21
  
22
  /* Zero fill the bss segment.  This is done with inline assembly since this
23
     will clear the value of pulDest if it is not kept in a register. */
24
  __asm("  ldr     r0, =_sbss\n"
25
        "  ldr     r1, =_ebss\n"
26
        "  mov     r2, #0\n"
27
        "  .thumb_func\n"
28
        "zero_loop:\n"
29
        "    cmp     r0, r1\n"
30
        "    it      lt\n"
31
        "    strlt   r2, [r0], #4\n"
32
        "    blt     zero_loop");
33
#ifdef __FPU_USED
34
  /* Enable FPU.*/ 
35
  __asm("  LDR.W R0, =0xE000ED88\n"
36
        "  LDR R1, [R0]\n"
37
        "  ORR R1, R1, #(0xF << 20)\n"
38
        "  STR R1, [R0]");
39
#endif  
40

41
  /* Call the application's entry point.*/
42
  main();
43
}

link.ld:
1
COUTPUT_FORMAT ("elf32-littlearm", "elf32-bigarm", "elf32-littlearm")
2
SEARCH_DIR(.)
3
INCLUDE "memory.ld"
4

5
/* Section Definitions */ 
6
SECTIONS 
7
{ 
8
    .text : 
9
    { 
10
        KEEP(*(.isr_vector .isr_vector.*)) 
11
        *(.text .text.* .gnu.linkonce.t.*)         
12
        *(.glue_7t) *(.glue_7)                    
13
        *(.rodata .rodata* .gnu.linkonce.r.*)                            
14
    } > rom
15
    
16
    .ARM.extab : 
17
    {
18
        *(.ARM.extab* .gnu.linkonce.armextab.*)
19
    } > rom
20
    
21
    .ARM.exidx :
22
    {
23
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
24
    } > rom
25
    
26
    . = ALIGN(4); 
27
    _etext = .;
28
    _sidata = .; 
29
        
30
    .data : AT (_etext) 
31
    { 
32
        _sdata = .; 
33
        *(.data .data.*) 
34
        . = ALIGN(4); 
35
        _edata = . ;
36
    } > ram
37

38
    /* .bss section which is used for uninitialized data */ 
39
    .bss (NOLOAD) : 
40
    { 
41
        _sbss = . ; 
42
        *(.bss .bss.*) 
43
        *(COMMON) 
44
        . = ALIGN(4); 
45
        _ebss = . ; 
46
    } > ram
47
    
48
    /* stack section */
49
    .co_stack (NOLOAD):
50
    {
51
        . = ALIGN(8);
52
        *(.co_stack .co_stack.*)
53
    } > ram
54
       
55
    . = ALIGN(4); 
56
    _end = . ; 
57
}

Hab das ganze grad auf nem anderen PC getestet, da gehts. Wird also an 
der IDE, dem gdbserver oder dem treiber liegen.
Gast #3065619
Lesenswert?

Ich hatte (bzw. habe es immer noch) das gleiche Problem. Wenn ich via 
Einzelschritt über eine Schleife gehe führt gdb alle Anweisungen der 
Schleife einzeln aus. Er hängt also nicht fest, die Schleife läuft nur 
zu langsam, als dass sie in akzeptabler Zeit durchlaufen wird.
Einfach nicht per Einzelschritt größere Schleifen überspringen, dann 
funktioniert es.
(Firma: EleLa - www.elela.de) #3065657
Lesenswert?

Bei mir sieht der äquivalente Abschnitt der LD Datei so aus, der C-Code 
ist gleich:
1
    .data : {
2
    _data = .;
3
    *(.data)               /* Data memory */
4
    *(.eh_frame)
5
    _edata = .;
6
    } >ram AT > rom        /* initial Data LMA is actual rom adr */

Mache also da noch: ">ram AT > rom"

Am GDBServer/Treiber liegt es sicher nicht. Wenn dann am GCC wie der den 
Code interpretiert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren