.global delay_ms
.section .text
Die Direktive .global delay_ms macht die Funktion delay_ms global zugänglich, sodass sie von anderen Modulen aufgerufen werden kann. Mit .section .text wird angegeben, dass der folgende Code im .text-Abschnitt des Programms gespeichert wird, der den ausführbaren Code enthält.
delay_msdelay_ms: @ r1 = delay in ms
push {lr}
push {r1}
cpsid if
bl read_cntfrq @ r0 = freq
pop {r1}
@ Berechne den Zählwert und setze den Timer entsprechend
ldr r2, =1000
udiv r0, r0, r2 @ r0 = freq /1000
mul r1, r0, r1 @ r0 = r0 * n
bl write_cntv_tval
bl enable_cntv_irq @ enable den Interrupt
bl enable_cntv
wfi @ wait for interrupt
bl disable_cntv
cpsie i
pop {pc}
Zunächst werden die Register gesichert und Interrupts deaktiviert, um eine störungsfreie Verzögerung zu gewährleisten. Danach wird die Systemtaktfrequenz ausgelesen, um den Timer-Wert zu berechnen, der die Verzögerungsdauer bestimmt. Anschließend wird der Timer gesetzt und aktiviert. Der Prozessor wartet im wfi-Zustand, bis der Timer abläuft und ein Interrupt ausgelöst wird. Nach der Verzögerung wird der Timer deaktiviert, die Interrupts wieder aktiviert, und das Programm kehrt zur aufrufenden Funktion zurück.
| zurück | Hauptmenü | weiter |
| 2.2 Timer |
|---|
| 2.2.1 Intro |
| 2.2.2 Der ARMv7 Generic Timer |
| 2.2.3 Steuerung des Virtual Timer |
| 2.2.4 Implementierung einer Delay-Funktion |