
Before this commit, goroutine support was spread through the compiler. This commit changes this support, so that the compiler itself only generates simple intrinsics and leaves the real support to a compiler pass that runs as one of the TinyGo-specific optimization passes. The biggest change, that was done together with the rewrite, was support for goroutines in WebAssembly for JavaScript. The challenge in JavaScript is that in general no blocking operations are allowed, which means that programs that call time.Sleep() but do not start goroutines also have to be scheduled by the scheduler.
47 строки
764 Б
Go
47 строки
764 Б
Go
// +build qemu
|
|
|
|
package runtime
|
|
|
|
// This file implements the Stellaris LM3S6965 Cortex-M3 chip as implemented by
|
|
// QEMU.
|
|
|
|
import (
|
|
"device/arm"
|
|
"unsafe"
|
|
)
|
|
|
|
type timeUnit int64
|
|
|
|
const tickMicros = 1
|
|
|
|
var timestamp timeUnit
|
|
|
|
//go:export Reset_Handler
|
|
func main() {
|
|
preinit()
|
|
initAll()
|
|
callMain()
|
|
arm.SemihostingCall(arm.SemihostingReportException, arm.SemihostingApplicationExit)
|
|
abort()
|
|
}
|
|
|
|
const asyncScheduler = false
|
|
|
|
func sleepTicks(d timeUnit) {
|
|
// TODO: actually sleep here for the given time.
|
|
timestamp += d
|
|
}
|
|
|
|
func ticks() timeUnit {
|
|
return timestamp
|
|
}
|
|
|
|
//go:volatile
|
|
type regValue uint32
|
|
|
|
// UART0 output register.
|
|
var stdoutWrite *regValue = (*regValue)(unsafe.Pointer(uintptr(0x4000c000)))
|
|
|
|
func putchar(c byte) {
|
|
*stdoutWrite = regValue(c)
|
|
}
|