mirror of
https://github.com/tinygo-org/tinygo.git
synced 2026-08-07 12:33:42 +00:00
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:
@@ -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()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user