diff --git a/src/runtime/runtime_atsamd21.go b/src/runtime/runtime_atsamd21.go index 2fea1121..50f53031 100644 --- a/src/runtime/runtime_atsamd21.go +++ b/src/runtime/runtime_atsamd21.go @@ -6,6 +6,7 @@ import ( "device/arm" "device/sam" "machine" + "runtime/volatile" "unsafe" ) @@ -230,10 +231,7 @@ var ( timerLastCounter uint64 ) -//go:volatile -type isrFlag bool - -var timerWakeup isrFlag +var timerWakeup volatile.Register8 const asyncScheduler = false @@ -262,7 +260,7 @@ func ticks() timeUnit { // ticks are in microseconds func timerSleep(ticks uint32) { - timerWakeup = false + timerWakeup.Set(0) if ticks < 30 { // have to have at least one clock count ticks = 30 @@ -280,7 +278,7 @@ func timerSleep(ticks uint32) { // enable IRQ for CMP0 compare sam.RTC_MODE0.INTENSET.SetBits(sam.RTC_MODE0_INTENSET_CMP0) - for !timerWakeup { + for timerWakeup.Get() == 0 { arm.Asm("wfi") } } @@ -290,7 +288,7 @@ func handleRTC() { // disable IRQ for CMP0 compare sam.RTC_MODE0.INTFLAG.Set(sam.RTC_MODE0_INTENSET_CMP0) - timerWakeup = true + timerWakeup.Set(1) } func initUSBClock() { diff --git a/src/runtime/runtime_nrf.go b/src/runtime/runtime_nrf.go index 60d6fc8d..c289437d 100644 --- a/src/runtime/runtime_nrf.go +++ b/src/runtime/runtime_nrf.go @@ -6,6 +6,7 @@ import ( "device/arm" "device/nrf" "machine" + "runtime/volatile" ) type timeUnit int64 @@ -79,14 +80,11 @@ func ticks() timeUnit { return timestamp } -//go:volatile -type isrFlag bool - -var rtc_wakeup isrFlag +var rtc_wakeup volatile.Register8 func rtc_sleep(ticks uint32) { nrf.RTC1.INTENSET.Set(nrf.RTC_INTENSET_COMPARE0) - rtc_wakeup = false + rtc_wakeup.Set(0) if ticks == 1 { // Race condition (even in hardware) at ticks == 1. // TODO: fix this in a better way by detecting it, like the manual @@ -94,7 +92,7 @@ func rtc_sleep(ticks uint32) { ticks = 2 } nrf.RTC1.CC[0].Set((nrf.RTC1.COUNTER.Get() + ticks) & 0x00ffffff) - for !rtc_wakeup { + for rtc_wakeup.Get() == 0 { arm.Asm("wfi") } } @@ -103,5 +101,5 @@ func rtc_sleep(ticks uint32) { func handleRTC1() { nrf.RTC1.INTENCLR.Set(nrf.RTC_INTENSET_COMPARE0) nrf.RTC1.EVENTS_COMPARE[0].Set(0) - rtc_wakeup = true + rtc_wakeup.Set(1) } diff --git a/src/runtime/runtime_qemu.go b/src/runtime/runtime_qemu.go index 5e7d3565..37b6d46e 100644 --- a/src/runtime/runtime_qemu.go +++ b/src/runtime/runtime_qemu.go @@ -7,6 +7,7 @@ package runtime import ( "device/arm" + "runtime/volatile" "unsafe" ) @@ -36,12 +37,9 @@ func ticks() timeUnit { return timestamp } -//go:volatile -type regValue uint32 - // UART0 output register. -var stdoutWrite *regValue = (*regValue)(unsafe.Pointer(uintptr(0x4000c000))) +var stdoutWrite = (*volatile.Register8)(unsafe.Pointer(uintptr(0x4000c000))) func putchar(c byte) { - *stdoutWrite = regValue(c) + stdoutWrite.Set(uint8(c)) } diff --git a/src/runtime/runtime_stm32f103xx.go b/src/runtime/runtime_stm32f103xx.go index 66f5e1a8..a7e3577b 100644 --- a/src/runtime/runtime_stm32f103xx.go +++ b/src/runtime/runtime_stm32f103xx.go @@ -6,6 +6,7 @@ import ( "device/arm" "device/stm32" "machine" + "runtime/volatile" ) func init() { @@ -58,10 +59,7 @@ var ( timerLastCounter uint64 ) -//go:volatile -type isrFlag bool - -var timerWakeup isrFlag +var timerWakeup volatile.Register8 func initRTC() { // Enable the PWR and BKP. @@ -136,7 +134,7 @@ func ticks() timeUnit { // ticks are in microseconds func timerSleep(ticks uint32) { - timerWakeup = false + timerWakeup.Set(0) // STM32 timer update event period is calculated as follows: // @@ -177,7 +175,7 @@ func timerSleep(ticks uint32) { stm32.TIM3.CR1.SetBits(stm32.TIM_CR1_CEN) // wait till timer wakes up - for !timerWakeup { + for timerWakeup.Get() == 0 { arm.Asm("wfi") } } @@ -192,6 +190,6 @@ func handleTIM3() { stm32.TIM3.SR.ClearBits(stm32.TIM_SR_UIF) // timer was triggered - timerWakeup = true + timerWakeup.Set(1) } } diff --git a/src/runtime/runtime_stm32f407.go b/src/runtime/runtime_stm32f407.go index 29965fed..270e1b8a 100644 --- a/src/runtime/runtime_stm32f407.go +++ b/src/runtime/runtime_stm32f407.go @@ -6,6 +6,7 @@ import ( "device/arm" "device/stm32" "machine" + "runtime/volatile" ) func init() { @@ -114,10 +115,7 @@ var ( tickCount timeUnit ) -//go:volatile -type isrFlag bool - -var timerWakeup isrFlag +var timerWakeup volatile.Register8 // Enable the TIM3 clock.(sleep count) func initTIM3() { @@ -160,7 +158,7 @@ func ticks() timeUnit { // ticks are in microseconds func timerSleep(ticks uint32) { - timerWakeup = false + timerWakeup.Set(0) // CK_INT = APB1 x2 = 84mhz // prescale counter down from 84mhz to 10khz aka 0.1 ms frequency. @@ -180,7 +178,7 @@ func timerSleep(ticks uint32) { stm32.TIM3.CR1.SetBits(stm32.TIM_CR1_CEN) // wait till timer wakes up - for !timerWakeup { + for timerWakeup.Get() == 0 { arm.Asm("wfi") } } @@ -195,7 +193,7 @@ func handleTIM3() { stm32.TIM3.SR.ClearBits(stm32.TIM_SR_UIF) // timer was triggered - timerWakeup = true + timerWakeup.Set(1) } }