Hallo Forum,
ich arbeite mit einem STM32F103VBT7 mit Easyeclipse 1.3.1.1 und GCC
4.4.0, als Debugger verwende ich den HiTOP mit einem Hitex Tantino.
ich muss für eine Anwendung einen Registertest durchführen (Galpath)
deshalb sind meine Regsiter R0-R12 danach zerstört. Das sollte meiner
Meinung nach auch kein Problem sein, da diese doch Gerneal Purpose
Register sind.
Ich habe nun aber ein Problem, denn ich komme aus meiner Routine die den
Test ausführt nicht mehr zurück in mein Hauptprogramm. Nun kann ich
natürlich meine Register vorher auf den Stack Pushen (dann funktioniert
der Rücksprung), das möchte ich aber eigentlich nicht.
Das Problem liegt eindeutig am Register R7, wenn ich dieses unangetatste
lasse, dann funktioniert mein Code und das Programm läuft wie geplant
weiter. Sobald ich R7 zerstöre, komme ich wie nicht mehr aus meiner
Routine zurück.
Im Assembler Code ist mir nun aufgefallen dass mein Programm wenn ich
das richtig verstehe R7 als das Register verwendet in dem die
Rücksprungadresse steht?!
mov sp, r7
pop {r7,pc}
Das ist mir nun aber nicht klar, denn eigentlich müsste er doch R13
verwenden oder?
Zum Compilieren verwende ich ein makefile das ich selber geschrieben
habe, die Compilerflags sind
CFLAGS = -c -mcpu=cortex-m3 -mthumb -gdwarf-2 -MD -O0 -trigraphs -Wall
-fsigned-char -mlittle-endian -xc -mno-thumb-interwork -mno-tpcs-frame
Hat jemand eine Idee warum das so ist? Ich gehe mal davon aus dass der
Compiler einen 16 Bit Thumb Befehlt verwendet oder?
Danke für jede Info.
Steffen
Steffen Walter schrieb: > ich muss für eine Anwendung einen Registertest durchführen (Galpath) > deshalb sind meine Regsiter R0-R12 danach zerstört. Das sollte meiner > Meinung nach auch kein Problem sein, da diese doch Gerneal Purpose > Register sind. Es ist nur dann kein Problem, wenn die Register entsprechend dem vom Compiler verwendeten ABI behandelt werden, d.h. wenn die vom Aufgerufenen zu sichernden Register auch gesichert werden. Nur ein Teil der Register darf von einer Funktion ad libitum modifizert werden. Und auch bei denen kann es passieren, dass man dem Compiler gewaltig auf die Füsse tritt, wenn der von dieser Modifikation nichts weiss. Im GCC kann man dessen "asm" Statements mit einer Liste modifizierter Register ausstatten, dann macht der Compiler die Verwaltung selber.
Hallo und danke für die schnelle Antwort. Nur noch einmal
zusammengefasst damit ich das richtig verstanden habe:
Der Compiler entscheidet welches Register er verwendet um den Rücksprung
in die Routine aus der ich komme zu machen?
Ich war bisher davon ausgegangen dass der Compiler die Adresse aus der
ich komme im Stack ablegt und diese dann über den Stackpointer
zurückliest um sich dann seine Rücksprungadresse zu setzten. Ist das
nicht so?
Wenn ich mir meinen Assembler Code anschaue, wir dort ja ein MOV
gemacht. MOV ist ja ein 16 Bit thumb Befehl, kann also nur auf R0-R7
zugreifen. Warum holt er sich die Adresse nicht vom Stack? Kann ich ihn
dazu irgendwie zwingen?
Ich habe das Problem momentan so umgangen dass ich vor meinem
Registertest einen PUSH { R0-R12 } ausführe und danach einen POP {
R0-R12 }, aber ganz klar warum ich das machen muss ist mir das noch
nicht.
Gruß
Steffen
Steffen Walter schrieb: > Der Compiler entscheidet welches Register er verwendet um den Rücksprung > in die Routine aus der ich komme zu machen? Ja. > Ich war bisher davon ausgegangen dass der Compiler die Adresse aus der > ich komme im Stack ablegt und diese dann über den Stackpointer > zurückliest um sich dann seine Rücksprungadresse zu setzten. Ist das > nicht so? Nicht so. Kann er machen, kann er lassen. > Wenn ich mir meinen Assembler Code anschaue, wir dort ja ein MOV > gemacht. MOV ist ja ein 16 Bit thumb Befehl, kann also nur auf R0-R7 > zugreifen. Es gibt m.W. auch Codierungen für alle Register. > Warum holt er sich die Adresse nicht vom Stack? Kann ich ihn > dazu irgendwie zwingen? Ja. Den Sourcecode vom GCC entsprechend umschreiben. > Ich habe das Problem momentan so umgangen dass ich vor meinem > Registertest einen PUSH { R0-R12 } ausführe und danach einen POP { > R0-R12 }, aber ganz klar warum ich das machen muss ist mir das noch > nicht. Weil das ein bisschen so ist, also ob dir jemand den Stuhl unter dem Hintern wegzieht, du unsanft Kontakt mit dem Boden bekommst, und er dich anschliessend fragt, warum er das nicht machen dürfte. Die Entscheidung, welche Register wofür verwendet werden, trifft der Compiler selbst, ggf. in Absprache mit einer allgemeinen Konvention. Wenn du da reinfunkst ohne ihm das zu sagen, dann kann das eben in die Hose gehen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.