mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-08 04:53:42 +00:00
runtime/hifive1: use CLINT peripheral for timekeeping
The CLINT is implemented both on the fe310-g002 chip and in the sifive_e QEMU machine type. Therefore, use that peripheral for consistency. The only difference is the clock speed, which runs at 10MHz in QEMU for some reason instead of 32.768kHz as on the physical HiFive1 boards.
This commit is contained in:
committed by
Ron Evans
parent
3e521f710a
commit
ed9b2dbc03
@@ -14,8 +14,6 @@ import (
|
||||
|
||||
type timeUnit int64
|
||||
|
||||
const tickMicros = 32768 // RTC runs at 32.768kHz
|
||||
|
||||
//go:extern _sbss
|
||||
var _sbss unsafe.Pointer
|
||||
|
||||
@@ -82,3 +80,26 @@ func putchar(c byte) {
|
||||
}
|
||||
|
||||
const asyncScheduler = false
|
||||
|
||||
func ticks() timeUnit {
|
||||
// Combining the low bits and the high bits yields a time span of over 270
|
||||
// years without counter rollover.
|
||||
highBits := sifive.CLINT.MTIMEH.Get()
|
||||
for {
|
||||
lowBits := sifive.CLINT.MTIME.Get()
|
||||
newHighBits := sifive.CLINT.MTIMEH.Get()
|
||||
if newHighBits == highBits {
|
||||
// High bits stayed the same.
|
||||
return timeUnit(lowBits) | (timeUnit(highBits) << 32)
|
||||
}
|
||||
// Retry, because there was a rollover in the low bits (happening every
|
||||
// 1.5 days).
|
||||
highBits = newHighBits
|
||||
}
|
||||
}
|
||||
|
||||
func sleepTicks(d timeUnit) {
|
||||
target := ticks() + d
|
||||
for ticks() < target {
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user