ARM Sprungbefehl

Gast #4100922
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?
Moderator (Firma: Titel) Persönliche Seite #4100955
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.
Gast #4108381
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.
Gast #4108596
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.
#4108605
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.
#4108606
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.
Gast #4108676
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.
Gast #4109379
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.
#4109449
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.

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.