From 3bb994da9f42118fe9cfcc8945e8ec9d3b01da27 Mon Sep 17 00:00:00 2001 From: tom-horn <68817716+tom-horn@users.noreply.github.com> Date: Sat, 7 Nov 2020 21:21:38 +1000 Subject: [PATCH] Allow interrupts in stm32f103xx (#1466) machine/stm32f103xx: allow interrupts in stm32f103xx --- src/runtime/runtime_stm32f103xx.go | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/src/runtime/runtime_stm32f103xx.go b/src/runtime/runtime_stm32f103xx.go index 7407fa73..a59c2a01 100644 --- a/src/runtime/runtime_stm32f103xx.go +++ b/src/runtime/runtime_stm32f103xx.go @@ -120,7 +120,9 @@ func sleepTicks(d timeUnit) { for d != 0 { ticks() // update timestamp ticks := uint32(d) // current scaling only supports 100 usec to 6553 msec - timerSleep(ticks) + if !timerSleep(ticks) { + return + } d -= timeUnit(ticks) } } @@ -141,7 +143,8 @@ func ticks() timeUnit { } // ticks are in microseconds -func timerSleep(ticks uint32) { +// returns false if an interrupt occured +func timerSleep(ticks uint32) bool { timerWakeup.Set(0) // STM32 timer update event period is calculated as follows: @@ -188,10 +191,19 @@ func timerSleep(ticks uint32) { // Enable the timer. stm32.TIM3.CR1.SetBits(stm32.TIM_CR1_CEN) - // wait till timer wakes up - for timerWakeup.Get() == 0 { - arm.Asm("wfi") +wait: + arm.Asm("wfi") + if timerWakeup.Get() != 0 { + return true } + + if hasScheduler { + return false + } else { + // keep looping until the routine exits or is interrupted + goto wait + } + } func handleTIM3(interrupt.Interrupt) {