PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [Assembler ARM] sleep realisieren



menace_one
03.11.2011, 12:58
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

MrFlip0815
03.11.2011, 13:18
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

lynxx
03.11.2011, 13:34
CMP benutzen?

oder warum nicht


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 ..

menace_one
03.11.2011, 14:03
@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?

IceMatrix
03.11.2011, 14:18
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.

lynxx
03.11.2011, 14:41
huch, ja klar es much R3 sein. :freak2

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.