Hallo,
ich habe hier ein eigenartiges Problem.
Ich möchte den SysTick bei einem STM32F050 (030) benutzen.
Wenn ich das Programm im Anhang unter linux compiliere wird des Systick
Int nicht ausgelöst.
Das gleiche unter Coocox (mit gleicher gcc version 4.8_2014q2 und auc
5.3_2016q1) compiliert, läuft prima.
CMSIS_BOOT und CMSIS_CORE, sowie stm32_lib sind vom Coocox Projekt
übernommen.
Ist ja nicht so, dass der µC mit dem unter linux erzeugten Code
garnichts tut, nur der SysTick kommt einfach nicht.
Idee ?
LG tux
Da wird ein Map File erzeugt. Da könnte man mal reinschauen.
Unter Linux darf man die ".c" Endung nicht groß schreiben, ansonsten
nimmt der Compiler IIRC das C++ Frontend.
Wieso in C++ dann die Interrupt Handler nicht funktionieren überlasse
ich dem Leser als Hausaufgabe zum Googlen. Würde man IMO auch im Map
File sehen,
wenn man weiss wonach man suchen muss.
tux schrieb:> Wenn ich das Programm im Anhang unter linux compiliere wird des Systick> Int nicht ausgelöst.
Versuche doch mal, das Prinzip zu verstehen!
Du brauchst zu allererst einen funktionablen Startupcode, denn dort
stehen deine Vektoren drin.
Diese Vektoren zeigen auf Handler, welche einen Namen haben und mit
[WEAK] gekennzeichnet sind.
Dein Handler muss exakt den gleichen Namen wie der Defaulthandler
haben, damit der Linker das begreift und statt des Defaulthandlers
deinen Handler in die Vektortafel einträgt.
so. Nun kennen wir nicht die vermutlich unterschiedlichen Startupcodes
deiner Coocox-IDE und deines Linux-Zeuges, wir wissen auch nicht, was es
für Unterschiede bei deiner Linkerei geben mag - und du fragst dennoch
nach ner Lösung.
Das ist zuviel gefragt mangels ausreichenden Inputs.
Also inspiziere mal deinen Startupcode, inspiziere deine
Link-Zusammenstellung (als Linkerfile oder als .xcl) und inspiziere
deine Namenswahl für den Handler.
W.S.
Hallo W.S.
wie oben schon geschrieben der Startup-Code ist in beiden Fällen der
gleiche, da sowohl unter linux als auch in der Coocox Umgebung die
gleichen Dateien inkl derer aus den CMSIS_BOOT und CMSIS_CORE
Verzeichnissen verwendet werden. Das Linkerfile ist auch in beiden
Fällen das gleiche.
Ebenso der Compiler nur einmal die gcc version für Windows bzw. Linux.
Und wie man dem oberen Dump ja auch entnehmen kann steht der
Adressvektor für den SysTick Interrupt Handler (SysTick_Handler) ja an
der richtigen Stelle.
Andere Interrupts sind wie man dem Quellcode entnehmen kann, nicht im
Spiel und der Default-Handler ist die Standard Endlosschleife.
Das das Programm sich aber nicht aufhängt, sondern gemäß der
Warteschleife endlos auf PA1 toggelt, wird wohl der Interrupt selbst in
der Linux Variante nicht ausgelöst.
LG tux
tux schrieb:> wie oben schon geschrieben
Also, mal ganz trocken formuliert: Wenn alles wirklich das Gleiche
ist, dann ist Magie im spiel. Glaub ich aber nicht, also ist irgendwas
eben NICHT gleich.
btw: warum linkst du dein Zeugs auf $0800'0000 ? Linke das ganze mal auf
0 und probiere es noch einmal.
W.S.
Hallo W.S.
das Linker-script (ram-gcc.ld) wurde vom Coocox erzeugt.
Bei 0x08000000 ist immer der Flash des STM32F050 unabhängig von der
Bootkonfiguration zu finden.
Klar kann man auch bei boot0=0 gegen 0x0 linken, da der Flash dann
zweimal im Speicherbereich auftaucht (0x0 und 0x08000000). Was soll das
aber ändern ?
Beide Compilierungen (Win und Lnx) greifen auf die Dateien aus dem
gleichen Verzeichnis zu (Server"laufwerk")
Ne Magie ist da sicherlich nicht bei.
Vermute das Problem bei der Compilierung der Initialisierung via
SysTick_Config, da wie gesagt er nicht in einer Endlosschleife
verschwindet (falsche Vektorposition bzw Vektoradress) und die
SysTick_Handler bei direktem Aufruf wie gewünscht funktioniert
LG tux
Hi,
Ursache gefunden.
das st_flash util unter linux muss extra darum gebeten werden(option
--reset), das es nach dem Beschreiben des Flash auch ein Reset für den
µC auslöst.
Dann geht es auch mit dem Linux Compilat.
Das Coocox ST-Link Interface macht das automatisch.
LG tux