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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Nils S. (kruemeltee) Benutzerseite


Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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


Bewertung
1 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.