avr: convert initialization from asm to Go

This increases code size by 1 instruction (2 bytes) because LLVM isn't
yet smart enough to recognize that it doesn't need to clear a register
to use 0: it can just use r1 which is always 0 according to the
convention. It makes initialization a lot easier to read, however.
This commit is contained in:
Ayke van Laethem
2018-09-16 14:57:42 +02:00
parent 0d8a7e1666
commit 39e3fe28db
5 changed files with 38 additions and 18 deletions
+20
View File
@@ -4,6 +4,7 @@ package runtime
import (
"device/avr"
"unsafe"
)
const BOARD = "arduino"
@@ -28,6 +29,25 @@ const (
WDT_PERIOD_2S
)
var (
_extern__sbss unsafe.Pointer // defined by the linker
_extern__ebss unsafe.Pointer // defined by the linker
)
func preinit() {
// Initialize .bss: zero-initialized global variables.
ptr := uintptr(unsafe.Pointer(&_extern__sbss))
for ptr != uintptr(unsafe.Pointer(&_extern__ebss)) {
*(*uint8)(unsafe.Pointer(ptr)) = 0
ptr += 1
}
}
func postinit() {
// Enable interrupts after initialization.
avr.Asm("sei")
}
func init() {
initUART()
}