Forum: Mikrocontroller und Digitale Elektronik ARM Sprungbefehl


von grundschüler (Gast)


Lesenswert?

mittels Timer soll der Programmcode zunächst an den Beginn der 
Hauptschleife, hilsweise in den Reset springen. Beim AVR geht das so:
1
if(zl_sec_wdg==25){asm("jmp Sprung");}
2
if(zl_sec_wdg>50){asm("jmp 0");}

Für jmp 0 gibt es  NVIC_SystemReset()
Wie kann man den Sprung zu einem Label bei ARMs umsetzen?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

grundschüler schrieb:
> Beim AVR geht das so:
Und das ist nur die lange Schreibweise für "Murks".

> Wie kann man den Sprung zu einem Label bei ARMs umsetzen?
Was für ein "Label"?
Warum schreibst du nicht einfach Code, der solche Sprünge nicht braucht? 
Immerhin trittst du mit solchen Konstrukten dem Compiler ganz hübsch 
zwischen die Beine. Und bei einem recht komplexen uC ist auch der 
Compiler recht komplex und hat so sienen eigenen Tricks.

> Wie kann man den Sprung zu einem Label bei ARMs umsetzen?
Man programmiert in C so, dass man kein "goto" oder explizite Sprünge 
auf Assemblerebene braucht...

Und wenn du jetzt unbedingt noch so ein Gebastel anfangen willst, dann 
sieh dir das Kapitel "Exceptions" und "Software Interrupt" an.

von Micca (Gast)


Lesenswert?

Soll das so etwas wie ein Watchdog werden?
Und warum 2 Varianten (die beide undefiniert in ihrem Verhalten sind...)
Erklaere mal was du eigentlich willst.

von kanns nicht fassen (Gast)


Lesenswert?

grundschüler schrieb:
> if(zl_sec_wdg==25){asm("jmp Sprung");}
> if(zl_sec_wdg>50){asm("jmp 0");}
>
> Wie kann man den Sprung zu einem Label bei ARMs umsetzen?

Auch bei avr ist das ungeschickt. Wenn man in C schreibt, kann man auch 
bei C bleiben. Nimm das sch... Foto und fertig. Das geht dann beim arm 
genauso. Der Compiler löst dann schon richtig auf, egal wie kurz oder 
lang gesprungen wird.

Aber wie die anderen schon schrieben, ist das Murks. Besser ist ein 
richtiger Programmfluss mit Interrupts und Events.

von kanns nicht fassen (Gast)


Lesenswert?

Sch... Handy, nicht Foto sondern goto.

von grundschüler (Gast)


Lesenswert?

Micca schrieb:
> Erklaere mal was du eigentlich willst.

jmp 0 ist Reset wenn gar nichts mehr geht, also watchdog.

jmp Sprung springt vor die Hauptschleife um eine Unterfunktion 
abzubrechen, wenn z.B. in einem IR-Untermenue längere Zeit keine Eingabe 
getätigt wurde.

Ich habe es auf den Hinweis von Lothar nochmal mit return probiert. Geht 
auch, man braucht jump Sprung nicht.

kanns nicht fassen schrieb:
> Nimm das sch... goto und fertig.

Ich hätte goto genommen, geht aber nur innerhalb von Funktionen. Return 
springt an die Stelle, von der die Funktion aufgerufen wurde. jump 
Sprung springt an eine nach Belieben festzulegende Stelle. So schlecht 
war das gar nicht. Da ich das Äquivalent für Cortex nicht gefunden habe 
- und es nicht wirklich brauche - habe ich es rausgeschmissen.

Danke für die Unterstützung.

von Bernd K. (prof7bit)


Lesenswert?

grundschüler schrieb:
> jmp Sprung springt vor die Hauptschleife um eine Unterfunktion
> abzubrechen

Du kannst nicht per GOTO aus einem Funktionsaufruf heraus springen! D.H. 
Du kannst es evtl schon, aber nur ein paar mal bevor er dann abstürzen 
wird.

Der Grund ist daß beim Einsprung in eine Funktion verschiedene Dinge auf 
den Stack gepusht werden und die kann man nur mit dem zugehörigen 
return dort wieder runter holen. Wenn Du es liegen lässt wird sehr 
bald der Stack überlaufen und dann kracht es.

Reset geht gerade noch so denn da wird auch der Stack wieder frisch 
initialisiert aber einfach so kreuz und quer über Funktions-Grenzen 
hinweg durch das Programm springen ist vollkommen untragbar. Jeder 
Funktionsaufruf braucht sein return. Es muss genauso oft return 
durchlaufen werden wie vorher die Funktion aufgerufen wurde, andernfalls 
läuft der Stack über.

von Bernd K. (prof7bit)


Lesenswert?

grundschüler schrieb:
> Return
> springt an die Stelle

Return springt nicht nur, es räumt auch vorher den Stack wieder auf, es 
gibt frei was beim Eintritt in die Funktion vorher belegt wurde.

Bitte versuche irgendwo ein Stück Lesestoff aufzutreiben das diesen 
Mechanismus mit Funktionsaufrufen und Stack so erklärt daß Du verstehen 
kannst was da dahinter steckt, dann wirst Du auch sehen was das mit dem 
jmp für eine Schnapsidee war.

: Bearbeitet durch User
von grundschüler (Gast)


Lesenswert?

Bernd K. schrieb:

danke für die gute und nachvollziehbare Erklärung. Das Problem ist, dass 
man bei begrenztem Wissen selektiv lernen muss um zeitnah Ergebnisse zu 
erzielen. Die Funktion jump Sprung hatte ich natürlich getestet. Sie hat 
auch bei wiederholtem Aufruf zuverlässig funktioniert. Ansonsten hätte 
ich sie nicht verwendet. Lag wahrscheilich an der Einsprungstelle vor 
der while-Schleife.

von W.S. (Gast)


Lesenswert?

Bernd K. schrieb:
> Reset geht gerade noch so denn da wird

Wiebitte?
Worüber reden wir hier? ARM7TDMI oder CORTEX? Beim Cortex dürfte ein 
Sprung nach Null alles andere als den erhofften Reset ergeben.

Abgesehen davon halte ich Assembler-Einstreusel in sowas wie C für 
ausgesprochen schlechten Code. Sowas macht man nur in der wirklich 
allergrößten Not - und die sehe ich hier nicht.

grundschüler schrieb:
> mittels Timer soll der Programmcode zunächst an den Beginn der
> Hauptschleife, hilsweise in den Reset springen.

Da frag ich mich, ob - wenn - und was für ein - Lehrer sich solche 
Aufgabenstellungen ausdenkt.

Also: Das Verwenden von 'goto' ist im Prinzip OK, schließlich ist das 
ein Grundbestandteil der Programmiersprache. Aber es ist eben immer ein 
'goto marke', also zu einer Stelle hin, die letztlich Sache des 
Compilers ist. Ein Jump in eingefügtem Assembler hingegen ist etwas, 
dessen Wirkung man nur bei intimer Kenntnis der Architektur beurteilen 
kann. Das Zurückkehren, also ein 'return' geht selbstverständlich immer, 
da in der Sprache so vorgesehen - aber die Wirkung hängt vom Startupcode 
ab. Da ist wieder die intime Kenntnis dessen vonnöten, was vor dem 
Aufruf von main stattfindet - ähem.. und nach dessen Beendigung.

Also frag deinen Lehrer mal, was er such eigentlich dabei gedacht hat, 
solch eine Aufgabenstellung zu verzapfen. Notfalls verweist du auf 
diesen Beitrag - und falls sich dein Lehrer hier zu Wort meldet, gerät 
er an mich.

W.S.

von Bernd K. (prof7bit)


Lesenswert?

W.S. schrieb:
> Wiebitte?
> Worüber reden wir hier? ARM7TDMI oder CORTEX? Beim Cortex dürfte ein
> Sprung nach Null alles andere als den erhofften Reset ergeben.

Ich sagte er darf einen Reset auslösen weil ihn an der Stelle der 
Stackpointer nicht mehr interessiert, aber daß auf nem ARM ein Sprung 
nach 0 korrekt wäre das habe ich nirgends geschrieben.

Und um zu erfahren wie man auf der jeweiligen Plattform am 
elegantesten oder am korrektesten einen Reset auslöst hilft kurzes 
Googlen.

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.