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:
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
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 */
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...
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.
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.
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.
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.