63 lines
1.4 KiB
ArmAsm
63 lines
1.4 KiB
ArmAsm
|
/******************************************************************************
|
||
|
* systemTimer.s
|
||
|
* by Alex Chadwick
|
||
|
*
|
||
|
* A sample assembly code implementation of the OK05 operating system.
|
||
|
* See main.s for details.
|
||
|
*
|
||
|
* systemTime.s contains the code that interacts with the system timer.
|
||
|
******************************************************************************/
|
||
|
|
||
|
/*
|
||
|
* The system timer runs at 1MHz, and just counts always. Thus we can deduce
|
||
|
* timings by measuring the difference between two readings.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* GetSystemTimerBase returns the base address of the System Timer region as a
|
||
|
* physical address in register r0.
|
||
|
* C++ Signature: void* GetSystemTimerBase()
|
||
|
*/
|
||
|
.globl GetSystemTimerBase
|
||
|
GetSystemTimerBase:
|
||
|
ldr r0,=0x20003000
|
||
|
mov pc,lr
|
||
|
|
||
|
/*
|
||
|
* GetTimeStamp gets the current timestamp of the system timer, and returns it
|
||
|
* in registers r0 and r1, with r1 being the most significant 32 bits.
|
||
|
* C++ Signature: u64 GetTimeStamp()
|
||
|
*/
|
||
|
.globl GetTimeStamp
|
||
|
GetTimeStamp:
|
||
|
push {lr}
|
||
|
bl GetSystemTimerBase
|
||
|
ldrd r0,r1,[r0,#4]
|
||
|
pop {pc}
|
||
|
|
||
|
/*
|
||
|
* Wait waits at least a specified number of microseconds before returning.
|
||
|
* The duration to wait is given in r0.
|
||
|
* C++ Signature: void Wait(u32 delayInMicroSeconds)
|
||
|
*/
|
||
|
.globl Wait
|
||
|
Wait:
|
||
|
delay .req r2
|
||
|
mov delay,r0
|
||
|
push {lr}
|
||
|
bl GetTimeStamp
|
||
|
start .req r3
|
||
|
mov start,r0
|
||
|
|
||
|
loop$:
|
||
|
bl GetTimeStamp
|
||
|
elapsed .req r1
|
||
|
sub elapsed,r0,start
|
||
|
cmp elapsed,delay
|
||
|
.unreq elapsed
|
||
|
bls loop$
|
||
|
|
||
|
.unreq delay
|
||
|
.unreq start
|
||
|
pop {pc}
|