
This is the kind that is used in Go (actually CGo) for exporting functions. I think it's best to use //export instead of our custom //go:export pragma, for consistency (they are equivalent in TinyGo). Therefore I've updated all instances to the standard format (except for two that are updated in https://github.com/tinygo-org/tinygo/pull/1024). No smoke tests changed (when comparing the output hash), except for some wasm tests that include DWARF debug info and tend to be flaky anyway.
94 строки
1,4 КиБ
Go
94 строки
1,4 КиБ
Go
// +build avr
|
|
|
|
package runtime
|
|
|
|
import (
|
|
"device/avr"
|
|
"machine"
|
|
"unsafe"
|
|
)
|
|
|
|
const BOARD = "arduino"
|
|
|
|
type timeUnit uint32
|
|
|
|
var currentTime timeUnit
|
|
|
|
const tickMicros = 1024 * 16384
|
|
|
|
// Watchdog timer periods. These can be off by a large margin (hence the jump
|
|
// between 64ms and 125ms which is not an exact double), so don't rely on this
|
|
// for accurate time keeping.
|
|
const (
|
|
WDT_PERIOD_16MS = iota
|
|
WDT_PERIOD_32MS
|
|
WDT_PERIOD_64MS
|
|
WDT_PERIOD_125MS
|
|
WDT_PERIOD_250MS
|
|
WDT_PERIOD_500MS
|
|
WDT_PERIOD_1S
|
|
WDT_PERIOD_2S
|
|
)
|
|
|
|
//go:extern _sbss
|
|
var _sbss [0]byte
|
|
|
|
//go:extern _ebss
|
|
var _ebss [0]byte
|
|
|
|
//export main
|
|
func main() {
|
|
preinit()
|
|
run()
|
|
abort()
|
|
}
|
|
|
|
func preinit() {
|
|
// Initialize .bss: zero-initialized global variables.
|
|
ptr := unsafe.Pointer(&_sbss)
|
|
for ptr != unsafe.Pointer(&_ebss) {
|
|
*(*uint8)(ptr) = 0
|
|
ptr = unsafe.Pointer(uintptr(ptr) + 1)
|
|
}
|
|
}
|
|
|
|
func postinit() {
|
|
// Enable interrupts after initialization.
|
|
avr.Asm("sei")
|
|
}
|
|
|
|
func init() {
|
|
initUART()
|
|
}
|
|
|
|
func initUART() {
|
|
machine.UART0.Configure(machine.UARTConfig{})
|
|
}
|
|
|
|
func putchar(c byte) {
|
|
machine.UART0.WriteByte(c)
|
|
}
|
|
|
|
const asyncScheduler = false
|
|
|
|
// Sleep this number of ticks of 16ms.
|
|
//
|
|
// TODO: not very accurate. Improve accuracy by calibrating on startup and every
|
|
// once in a while.
|
|
func sleepTicks(d timeUnit) {
|
|
currentTime += d
|
|
for d != 0 {
|
|
sleepWDT(WDT_PERIOD_16MS)
|
|
d -= 1
|
|
}
|
|
}
|
|
|
|
func ticks() timeUnit {
|
|
return currentTime
|
|
}
|
|
|
|
func abort() {
|
|
for {
|
|
sleepWDT(WDT_PERIOD_2S)
|
|
}
|
|
}
|