[Assembler ARM] sleep realisieren

menace_one

Lt. Commander Pro
Registriert
Okt. 2010
Beiträge
1.028
Hallo,
ich wir versuchen auf einem ARM rechner mit LEDs. eine LED an und wieder auszumachen.
anmachen funktioniert bereits mittels:

ldr R1, =0xfffff600 //Basisadresse
mov R2, #0x8000000 //1 in R2 schreiben
str R2, [R1,#0x0030] //LED ON, Speichern von Inhalt von R2(1) auf Adresse von R1+Offset
mov R3, #0 // zählervariable auf 0 setzen
b sleep_on

nach dem einschalten soll nun kurz gewartet werden bevor die LED wieder ausgeschaltet wird.
also setzen wir eine zählvariable in R3 auf 0 und springen dann zu "sleep_on"

sleep_on:
ADD R3, R3, #4 // R3 um 4 erhöhen
TEQ R3, #1024 // prüfen ob R3 == 1024
BNE sleep_on // wenn nicht weitermachen
B led_off // wenn ja aufhören

aber irgendwie springt er wohl in eine endlosschleife und wir können uns nicht erklären warum?
danke im voraus
 
Hi!

Ohne jetzt ARM zu kennen würde ich tippen: Da stimmt uU was nicht mit hex und dezimalwerten. Alternativ würde ich statt TEQ (test equal ?) mal nen greater versuchen, ka wie das bei ARM heißt und den branch entsprechend anpassen!

Grüße
 
CMP benutzen?

oder warum nicht
Code:
  MOV  R3, #255
  B    sleep_on 
...
sleep_on:
  SUBS R3, R3, #1
  BNE  sleep_on
  B    led_off

Edit: Es muss natürlich R3 sein in der sleep_on-Schleife ..
 
Zuletzt bearbeitet:
@Mr.Flip ja TEQ == test equal, werd vorsichtshalber mal nen greater draus machen,schaden kanns ja nicht.
@lynxx Sub +s also subs subtrahiert 1 und aktualisiert den statusflag laut google.
aber wieso r1 und wo ist denn angegeben womit verglichen wird?
 
zu #3: es muss R3 sein. wo verglichen wird? nirgends. muss es auch nicht! SUBS (mit S am ende) aktualisiert die condition codes. d.h. wenn R3 durch die operation auf 0 sinkt wird das flag Z auf 1 gesetzt. das folgende BNE springt falls Z == 0, d.h. ist R3 == 0 -> Z=1 -> no jump. das ist die effizienteste lösung für nen zählloop. gibts auf anderen hardwareplattformen in gleicher form, z.b. x86.
 
Zuletzt bearbeitet:
huch, ja klar es much R3 sein. :freaky:

Ansonsten wie IceMatrix schon richtig schrieb ist das die effizienteste (kleinste und schnellste) Methode, bzw dadurch das die Ausführung schneller ist, genaueres Timing möglich.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben