esp32: implement task based scheduler

This has been a *lot* of work, trying to understand the Xtensa windowed
registers ABI. But in the end I managed to come up with a very simple
implementation that so far seems to work very well.

I tested this with both blinky examples (with blinky2 slightly edited)
and ./testdata/coroutines.go to verify that it actually works.
Most development happened on the ESP32 QEMU fork from Espressif
(https://github.com/espressif/qemu/wiki) but I also verified that it
works on a real ESP32.
This commit is contained in:
Ayke van Laethem
2020-11-11 23:06:09 +01:00
committed by Ron Evans
parent abb09e869e
commit caf35cfc41
5 changed files with 174 additions and 4 deletions
+2 -2
View File
@@ -24,7 +24,7 @@ call_start_cpu0:
wsr.ps a2
rsync
// Set WINDOWBASE to 1 << WINDOWSTART.
// Set WINDOWSTART to 1 << WINDOWBASE.
rsr.windowbase a2
ssl a2
movi a2, 1
@@ -43,7 +43,7 @@ call_start_cpu0:
rsync
// Jump to the runtime start function written in Go.
j main
call4 main
.section .text.tinygo_scanCurrentStack
.global tinygo_scanCurrentStack