Forum: Mikrocontroller und Digitale Elektronik STM32 Linker-Problem (overlaps section.) + Clock zu langsam?


von Nils S. (kruemeltee) Benutzerseite


Angehängte Dateien:

Lesenswert?

Hi,

ich habe vor einiger Zeit eine Uhr mit einem Dot-Matrix-Display und 
STM32F103C8T6 gebaut und die Software nur im Quellcode abgelegt.
Jetzt habe ich mittlerweile einen anderen PC und ich kann nicht mehr 
genau sagen, welche Toolchain ich damals verwendet habe.

Wenn ich das Projekt jetzt wieder compilieren will, dann bekomme ich 
einen Fehler:
1
/opt/gcc-arm-none-eabi-6_2-2016q4/bin/../lib/gcc/arm-none-eabi/6.2.1/../../../../arm-none-eabi/bin/ld: section .init LMA [00000000080006e4,00000000080006e7] overlaps section .data LMA [00000000080006e4,00000000080006e7]
Wenn ich jetzt im Linker-File .data um 8 verschiebe, dann läuft make 
komplett durch:
1
.data  : AT ( _sidata + 8 )

Die Uhr geht jetzt an, zeigt sofort die init-Uhrzeit (12:00) an und dann 
läuft der Sekundenzeiger (LED) sehr sehr langsam durch.

Ansonsten wurde an dem Projekt nichts verändert, einfach eine 
andere/neuere Toolchain und zum Testen das "+8" im Linkerfile.

Im Anhang mal die main.c und das Linkerfile, vielleicht kann mir hier ja 
jemand helfen.

Schonmal Danke im Vorraus,
Nils

von Christopher J. (christopher_j23)


Lesenswert?

Läuft der Sekundenzeiger zufällig um den Faktor 9 zu langsam durch? Mein 
Gefühl sagt mir, dass hier der Systemtakt nicht richtig auf 72MHz 
eingestellt wurde und das Teil nur mit 8MHz läuft.

Nils S. schrieb:
> section .init LMA [00000000080006e4,00000000080006e7] overlaps section
> .data LMA

Dein Linkerscript hat gar keine section .init und ist ja ohnehin 
steinalt. Kannst dir ja zum Vergleich unten mal anschauen wie das 
heutzutage normalerweise aussieht. Das würde ich aber nicht eins zu eins 
übernehmen, weil das Linkerscript ja normalerweise sehr eng mit dem 
Startup-Code verbandelt ist und ich nicht weiß, wie der bei dir 
aussieht. Ich würde wenn du das Projekt weiterführen willst jedenfalls 
mal ein halbwegs aktuelles Linkerscript und Startup-Code einbinden.

1
...
2
SECTIONS
3
{
4
    .text :
5
    {
6
        KEEP(*(.isr_vector))
7
        *(.text*)
8
9
        KEEP(*(.init))
10
        KEEP(*(.fini))
11
12
        /* .ctors */
13
        *crtbegin.o(.ctors)
14
        *crtbegin?.o(.ctors)
15
        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .ctors)
16
        *(SORT(.ctors.*))
17
        *(.ctors)
18
19
        /* .dtors */
20
        *crtbegin.o(.dtors)
21
        *crtbegin?.o(.dtors)
22
        *(EXCLUDE_FILE(*crtend?.o *crtend.o) .dtors)
23
        *(SORT(.dtors.*))
24
        *(.dtors)
25
26
        *(.rodata*)
27
28
        KEEP(*(.eh_frame*))
29
    } > FLASH
30
31
    .ARM.extab : 
32
    {
33
        *(.ARM.extab* .gnu.linkonce.armextab.*)
34
    } > FLASH
35
36
    __exidx_start = .;
37
    .ARM.exidx :
38
    {
39
        *(.ARM.exidx* .gnu.linkonce.armexidx.*)
40
    } > FLASH
41
    __exidx_end = .;
42
43
    /* To copy multiple ROM to RAM sections,
44
     * uncomment .copy.table section and,
45
     * define __STARTUP_COPY_MULTIPLE in startup_ARMCMx.S */
46
    /*
47
    .copy.table :
48
    {
49
        . = ALIGN(4);
50
        __copy_table_start__ = .;
51
        LONG (__etext)
52
        LONG (__data_start__)
53
        LONG (__data_end__ - __data_start__)
54
        LONG (__etext2)
55
        LONG (__data2_start__)
56
        LONG (__data2_end__ - __data2_start__)
57
        __copy_table_end__ = .;
58
    } > FLASH
59
    */
60
61
    /* To clear multiple BSS sections,
62
     * uncomment .zero.table section and,
63
     * define __STARTUP_CLEAR_BSS_MULTIPLE in startup_ARMCMx.S */
64
    /*
65
    .zero.table :
66
    {
67
        . = ALIGN(4);
68
        __zero_table_start__ = .;
69
        LONG (__bss_start__)
70
        LONG (__bss_end__ - __bss_start__)
71
        LONG (__bss2_start__)
72
        LONG (__bss2_end__ - __bss2_start__)
73
        __zero_table_end__ = .;
74
    } > FLASH
75
    */
76
77
    __etext = .;
78
        
79
    .data : AT (__etext)
80
    {
81
        __data_start__ = .;
82
...

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Christopher J. schrieb:
> Läuft der Sekundenzeiger zufällig um den Faktor 9 zu langsam durch? Mein
> Gefühl sagt mir, dass hier der Systemtakt nicht richtig auf 72MHz
> eingestellt wurde und das Teil nur mit 8MHz läuft.

Das kommt so ungefähr hin, als ich den Sprung von 12:00 auf 12:01 
gesehen habe, waren geschätzt ca. 10 Minuten vorbei.

Ich habe das jetzt mehr hässlich als brauchbar gefixt und zwar indem ich 
nicht bei
1
.data  : AT ( _sidata )
8 addiere, sondern schon ein paar Zeilen weiter, wo sidata zugewiesen 
wird.

Dieses Script und den dazugehörigen Startup-Code verwende ich so schon 
ganz schön lange, ich sollte das wirklich mal wieder updaten...

//edit:
Ja, ich habe keine Section .init, daher wundert mich auch, woher das 
kommt...

: Bearbeitet durch User
von Mampf F. (mampf) Benutzerseite


Lesenswert?

Nils S. schrieb:
> //edit:
> Ja, ich habe keine Section .init, daher wundert mich auch, woher das
> kommt...

Ohne Init wird vmtl der Clock nicht intitialisiert und er läuft auf dem 
langsamen internen.

Mich wundert daher nicht, woher das kommt.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Mampf F. schrieb:
> Nils S. schrieb:
>> //edit:
>> Ja, ich habe keine Section .init, daher wundert mich auch, woher das
>> kommt...
>
> Ohne Init wird vmtl der Clock nicht intitialisiert und er läuft auf dem
> langsamen internen.
>
> Mich wundert daher nicht, woher das kommt.

Clock wird initialisiert, in der Funktion SystemInit(), wenn alles 
richtig läuft. Dieses und ein paar andere Projekte laufen ja damit seit 
Anfang an richtig.

Ich frage mich woher die section .init kommt, da ich keine Section so 
benannt habe.

von Jim M. (turboj)


Lesenswert?

Nils S. schrieb:
> Ich frage mich woher die section .init kommt, da ich keine Section so
> benannt habe.

Lass Dir doch mal vom Linker ein Map File generieren und schau Dir das 
in Ruhe an.

von Nils S. (kruemeltee) Benutzerseite


Lesenswert?

Ich bin dem ganzen jetzt nochmal nachgegangen.

Durch den ersten Versuch im Linkerscript herumzupfuschen, "verrutschten" 
Codeteile, die nicht mehr angesprungen wurden. So lief er mit den 
internen ~8Mhz.

Die Lösung war ein aktuelles init-script und Linkerfile. Bin mir nur 
noch nicht so ganz sicher, was ich da brauche. Ich habe mir was von 
CubeMX generieren lassen, damit funtionieren erstmal die älteren 
Projekte augenscheinlich alle.

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.