Go: TinyGo

встраиваемые модели

Модераторы: Olej, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: TinyGo

Непрочитанное сообщение Olej » 15 фев 2024, 19:27

Olej писал(а):
15 фев 2024, 19:19
Всё путём
Достаточно долгое разбирательство (время потерял :-( ) показало:
1. У меня на этом компе:

Код: Выделить всё

olej@nvidia:~$ update-alternatives --display go
go - автоматический режим
  лучшая версия ссылки — /home/olej/goroot/bin/go
  ссылка сейчас указывает на /home/olej/goroot/bin/go
  ссылка go — /usr/bin/go
/home/olej/goroot/bin/go — приоритет 80
/lib/go-1.18/bin/go — приоритет 70
Девелоперская версия GoLang, собранная мной, как-то раньше, из исходных кодов с GIT...

Код: Выделить всё

olej@nvidia:~/2024/Go$ go version
go version devel go1.21-b37c0602cd Tue Mar 14 10:02:09 2023 +0000 linux/amd64

Код: Выделить всё

olej@nvidia:~/2024$ tinygo version
tinygo version 0.30.0 linux/amd64 (using go version devel go1.21-b37c0602cd Tue Mar 14 10:02:09 2023 +0000 and LLVM version 16.0.1)
2. Меняю:

Код: Выделить всё

olej@nvidia:~$ sudo update-alternatives --config go
[sudo] пароль для olej:
Есть 2 варианта для альтернативы go (предоставляет /usr/bin/go).

  Выбор   Путь                  Приор Состояние
------------------------------------------------------------
* 0            /home/olej/goroot/bin/go   80        автоматический режим
  1            /home/olej/goroot/bin/go   80        ручной режим
  2            /lib/go-1.18/bin/go        70        ручной режим

Нажмите «enter», чтобы не менять текущий выбор[*], или введите нужное число: 2
update-alternatives: используется /lib/go-1.18/bin/go для предоставления /usr/bin/go (go) в ручном режиме

Код: Выделить всё

olej@nvidia:~$ go version
go version go1.18.1 linux/amd64
Ух ты :!: Как всё поменялось :!: :shock:

Код: Выделить всё

olej@nvidia:~/2024/Go$ tinygo version
tinygo version 0.30.0 linux/amd64 (using go version go1.18.1 and LLVM version 16.0.1)

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: TinyGo

Непрочитанное сообщение Olej » 15 фев 2024, 19:34

Olej писал(а):
15 фев 2024, 19:27
Меняю:
Olej писал(а):
15 фев 2024, 19:27
Ух ты :!: Как всё поменялось
Теперь:

Код: Выделить всё

olej@nvidia:~/2024/Go$ tinygo build -target arduino blinky1.go

Код: Выделить всё

olej@nvidia:~/2024/Go$ ls -o blinky1
-rwxrwxr-x 1 olej 86636 фев 15 17:37 blinky1

Код: Выделить всё

olej@nvidia:~/2024/Go$ file blinky1
blinky1: ELF 32-bit LSB executable, Atmel AVR 8-bit, version 1 (SYSV), statically linked, with debug_info, not stripped
Всё собралось :!: ... для Arduino AVR :-o

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: TinyGo

Непрочитанное сообщение Olej » 15 фев 2024, 19:41

Olej писал(а):
15 фев 2024, 19:27
Меняю:
Olej писал(а):
15 фев 2024, 19:34
Всё собралось

Код: Выделить всё

olej@nvidia:~/2024/Go$ tinygo version 
tinygo version 0.30.0 linux/amd64 (using go version go1.18.1 and LLVM version 16.0.1)
Компиляция:

Код: Выделить всё

olej@nvidia:~/2024/Go$ time tinygo build tiny.go 

real	0m21,225s
user	0m51,523s
sys	0m15,824s
Компиляция немного длительная... в сравнении с привычным GoLang ...
Файл исполнимый намного короче чем GoLang:

Код: Выделить всё

olej@nvidia:~/2024/Go$ ls -o tiny
-rwxrwxr-x 1 olej 600064 фев 15 18:35 tiny
Исполнение - отменное:

Код: Выделить всё

olej@nvidia:~/2024/Go$ ./tiny 
минимальное приложение
Подтверждаюшее что TinyGo так же замечательно поддерживает UTF-8 :lol:
Вложения
tiny.go
(109 байт) 7 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: TinyGo

Непрочитанное сообщение Olej » 15 фев 2024, 19:53

Olej писал(а):
15 фев 2024, 19:41

Код: Выделить всё

olej@nvidia:~/2024/Go$ time tinygo build tiny.go 

real	0m21,225s
user	0m51,523s
sys	0m15,824s
Компиляция немного длительная... в сравнении с привычным GoLang ...
Вот GoLang ... для сравнения:

Код: Выделить всё

olej@nvidia:~/2024/Go$ time go build -o tiny.gl tiny.go 

real	0m0,485s
user	0m0,268s
sys	0m0,147s

Код: Выделить всё

olej@nvidia:~/2024/Go$ ls -o tiny* | grep rwx
-rwxrwxr-x 1 olej  600064 фев 15 18:35 tiny
-rwxrwxr-x 1 olej 1758409 фев 15 18:45 tiny.gl
TinyGo компилировался в 43,76 раз дольше (на больших кодах это может стать серьёзным препятствием ... но TinyGo и не направлен на большие коды).
Но зато размер исполнимого ELF TinyGo (один и тот же формат) - в 2,93 раз короче :!: (а это 1). время загрузки + 2). может быть очень критично для RAM микрокомпьютеров).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: TinyGo

Непрочитанное сообщение Olej » 16 фев 2024, 02:53

Olej писал(а):
15 фев 2024, 19:05
Продолжаю разгребаться с TinyGo...
А продолжил я разгребаться с TinyGo только из таких соображений:
- если Go диспетчирует горутины (сопрограммы) собственным механизмом (исполняющей системы)...
- и TinyGo использует код и пакеты/модули базового GoLang...
- то, возможно, он на некоторых малых архитектурах без операционной системы и потоков (которые Go для этого не нужны) сможет организовать параллелизм сопрограмм ... где его отродясь не было...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: TinyGo

Непрочитанное сообщение Olej » 16 фев 2024, 02:55

Olej писал(а):
16 фев 2024, 02:53
организовать параллелизм сопрограмм ... где его отродясь не было...
Начинаем пробовать...
Вот такой код:

Код: Выделить всё

package main

import (
        "fmt"
        "os"
        "runtime"
        "strconv"
        "time"
)

func main() {
        ветви := 5
   if len(os.Args) > 1 {
                threads, err := strconv.Atoi(os.Args[1])
      if err == nil {
                        ветви = threads
                }
        }
        const delay=100
        println("процессоров:", runtime.GOMAXPROCS(-1),
                "| ветвей:", ветви,
                "| длительность:", delay, "ms")
        done := make(chan bool)
        t0 := time.Now()
        for i := 0; i < ветви; i++ {
                i := i
                go func() {
                        defer func() {
                                done <- true
                        }()
                        time.Sleep(delay * time.Millisecond)
                        fmt.Printf("%02d завершился\n", i)

                }()
        }
        for i := 0; i < ветви; i++ {     // ожидание завершения всех
                <-done
        }

        fmt.Printf("все %02d завершились, полное время: %v\n",
                   ветви, time.Now().Sub(t0))
}
Вложения
gorut.go
(897 байт) 7 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: TinyGo

Непрочитанное сообщение Olej » 16 фев 2024, 02:59

Olej писал(а):
16 фев 2024, 02:55
Вот такой код:
Компилирую в нативное исполнение (x86) - 2-мя компиляторами:

Код: Выделить всё

olej@nvidia:~/2024/Go$ time go build -o gorut gorut.go

real    0m0,611s
user    0m0,355s
sys     0m0,140s

Код: Выделить всё

olej@nvidia:~/2024/Go$ time tinygo build -o gorutt gorut.go

real    0m8,213s
user    0m8,446s
sys     0m0,575s

Код: Выделить всё

olej@nvidia:~/2024/Go$ ls -o gorut* | grep rwx
-rwxrwxr-x 1 olej 1338321 фев 15 21:00 gorut
-rwxrwxr-x 1 olej  293864 фев 15 20:59 gorutt
(Чтоб их раздичать: gorut - это из-под GoLang, а gorutt - из-под TinyGo)
Картина то изместная, можно не комметировать...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: TinyGo

Непрочитанное сообщение Olej » 16 фев 2024, 03:07

Выполнение GoLang:

Код: Выделить всё

olej@nvidia:~/2024/Go$ ./gorut 15
процессоров: 4 | ветвей: 15
03 завершился
08 завершился
04 завершился
13 завершился
09 завершился
10 завершился
11 завершился
02 завершился
01 завершился
12 завершился
00 завершился
06 завершился
07 завершился
05 завершился
14 завершился
все 15 завершились, полное время: 100.628833ms
Здесь всё на 5+ - горутины завершаются в случайном порядке, при следующем запуске всё будет по-другому, общее время выполнения 15х100ms = 100.62ms
Выполнение TinyGo:

Код: Выделить всё

olej@nvidia:~/2024/Go$ ./gorutt 15
процессоров: 1 | ветвей: 15
00 завершился
01 завершился
02 завершился
03 завершился
04 завершился
05 завершился
06 завершился
07 завершился
08 завершился
09 завершился
10 завершился
11 завершился
12 завершился
13 завершился
14 завершился
все 15 завершились, полное время: 104.050851ms
Тут настораживает последовательный запуск-завершение горутин :-o ... и так повторяется при каждом запуске, но выполнение, похоже, параллельное, точнее конкурентное...
15х100ms = 104.05ms
Стоп :!: :!: :!: Не заметил сразу... :oops:
Процессор то он задействовал 1 :!: На этом компьютере имея их 4 :!:
Стоп :!:
Завтра буду повторять...

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: TinyGo

Непрочитанное сообщение Olej » 16 фев 2024, 03:13

Olej писал(а):
16 фев 2024, 03:07
Завтра буду повторять...
Но, забегая вперёд... попробовал скомпилировать это под микроархитектуру Arduino AVR:

Код: Выделить всё

olej@nvidia:~/2024/Go$ time tinygo build -o gorutt -target arduino gorut.go
gorut.go:25:3: attempted to start a goroutine without a scheduler

real    0m4,582s
user    0m6,991s
sys     0m0,651s
Но у него ещё есть опция scheduler:

Код: Выделить всё

olej@nvidia:~/2024/Go$ time tinygo build -o gorutt -target arduino -scheduler tasks  gorut.go
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 94 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 124 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 1176 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 1228 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 1290 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 1302 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 1322 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 1456 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 2046 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 8458 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 8470 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 8602 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 8724 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 8774 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 8802 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 9154 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 9676 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 10750 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 11274 bytes
tinygo:ld.lld: error: section '.text' will not fit in region 'FLASH_TEXT': overflowed by 11408 bytes
tinygo:ld.lld: error: too many errors emitted, stopping now (use --error-limit=0 to see all errors)
failed to run tool: ld.lld
error: failed to link /tmp/tinygo3977073725/main: exit status 1

real    0m8,583s
user    0m12,308s
sys     0m0,935s

Код: Выделить всё

olej@nvidia:~/2024/Go$ time tinygo build -o gorutt -target arduino -scheduler asyncify  gorut.go
# runtime
/usr/local/lib/tinygo/src/runtime/gc_stack_raw.go:18:13: undefined: getSystemStackPointer

real    0m0,333s
user    0m0,444s
sys     0m0,077s

Код: Выделить всё

olej@nvidia:~/2024/Go$ ls -l /usr/local/lib/tinygo/src/runtime/ | head
итого 808
-rw-r--r-- 1 root root  1385 сен 21 10:35 algorithm.go
-rw-r--r-- 1 root root   350 сен 21 10:35 arch_386.go
-rw-r--r-- 1 root root   471 сен 21 10:35 arch_amd64.go
-rw-r--r-- 1 root root   350 сен 21 10:35 arch_arm64.go
-rw-r--r-- 1 root root   450 сен 21 10:35 arch_arm.go
-rw-r--r-- 1 root root  1786 сен 21 10:35 arch_avr.go
-rw-r--r-- 1 root root   863 сен 21 10:35 arch_cortexm.go
-rw-r--r-- 1 root root   172 сен 21 10:35 arch-has-returnaddr.go
-rw-r--r-- 1 root root   158 сен 21 10:35 arch-no-returnaddr.go
Смотрю getSystemStackPointer:

Код: Выделить всё

olej@nvidia:~/2024/Go$ grep getSystemStackPointer /usr/local/lib/tinygo/src/runtime/*.go
/usr/local/lib/tinygo/src/runtime/gc_stack_raw.go:              markRoots(getSystemStackPointer(), stackTop)
/usr/local/lib/tinygo/src/runtime/scheduler_none.go:// getSystemStackPointer returns the current stack pointer of the system stack.
/usr/local/lib/tinygo/src/runtime/scheduler_none.go:func getSystemStackPointer() uintptr {
/usr/local/lib/tinygo/src/runtime/scheduler_tasks.go:// getSystemStackPointer returns the current stack pointer of the system stack.
/usr/local/lib/tinygo/src/runtime/scheduler_tasks.go:func getSystemStackPointer() uintptr {
... Пока из этого ничего не выходит ... но пищу для размышлений даёт.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Go: TinyGo

Непрочитанное сообщение Olej » 16 фев 2024, 20:53

Огромное количество пакетов драйверов разных периферийных устройств для разных микроконтроллеров здесь: drivers
TinyGo drivers for sensors, displays, and other devices that use I2C, SPI, GPIO, ADC, and UART interfaces.

Ответить

Вернуться в «Одноплатные компьютеры»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя