Forum: Mikrocontroller und Digitale Elektronik STM32F4 -> Default_Reset_Handler()


von Felix (Gast)


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

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


Lesenswert?

Zeige mal den ganzen Codeabschnitt sowie die LD Datei.

von Jim M. (turboj)


Lesenswert?

Kannst Du Dir mit dem Debugger die Addressen &_sdata und &_edata 
anzeigen lassen? Eine Möglichkeit wäre &_edata > RAM-Ende. Dann sollte 
der Linker allerdings meckern, wenn sein Skript stimmt.

von Felix (Gast)


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.

von Markus (Gast)


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.

von Felix (Gast)


Lesenswert?

Hab jetzt die IDE neu installiert und es geht wieder.

von Markus M. (Firma: EleLa - www.elela.de) (mmvisual)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.