Primena nove tehnologije na neočekivanom mestu je ono čime nas je zaintrigirao TinyGo programski jezik, a koji se zbog svoje baziranosti na Go-u nalazi u nekom čudnom međuprostoru IoT primena između Edge računara, embedded sistema i WebAssembly development-a, sa tim da kreira daleko manji izvršni fajl od ostalih kompajliranih jezika budući da se oslanja na LLVM tehnologiju. Logika govori da bi jezik koji bi spojio IoT programiranje, CLI (Docker CLI, Kubernetes CLI (kubectl), GitHub CLI pisani su u njemu) i WebAssembly bio preferirani jezik današnje tehnologije oslonjenje na oblake, za mobilne aplikacije i mašinsko učenje. Go (ili ponekad Golang) jeste takav jezik. Na sve to Go nije objektno orijentisan jezik, mada ima neke koncepte, a proistekao je iz C-a i u njemu se može pokrenuti C kod – takozvani Cgo:

package rand

/*
#include <stdlib.h>
*/
import "C"

func Random() int {
return int(C.random())
}

func Seed(i int) {
C.srandom(C.uint(i))
}.

TinyGo verzija koja je još u početničkim mukama prve dekade života dozvoljava da se Go funkcionalnost prenese u majušne memorijske prostore mikrokontrolera. Takve aplikacije koje se pokreću sa mikrokntrolera, se preko WASM (WebAssembly) sloja obraćaju browseru koji opet koristi HTML i JavaScript. Pri tome treba istaći da preko WASM lejera nesmetano mogu komunicirati programi pisani u Rust-u, C/C++, Python-u i Go-u (TinyGo). Go ima visoke performanse poput C/C++, jednostavno pisanje koda kao Python, nije objektvno orijentisan, ali ima visokoefikasno upravljanje konkurentnog izvršavanja koda kao Java.

Kuriozitet TinyGo-a je to što uspeva da mu kompajlirani kod biva desetak puta manji od ekvivalentnog koda dobijenog standardnim Go kompajlerom. U našem testu je kod kompajliran u Go-u bio oko 500 kB, dok je u TinyGo-u 53.4 kB FLASH, 5 kB RAM, a uz dodatne „-no-debug -panic=trap -scheduler=none -gc=leaking“ opcije smanjili smo ga na 49.9 kB FLASH, 4.8 kB RAM. U specifikacijama TinyGo jezika govori se o još većim uštedama, mi ih nismo postigli, ali smo primetili da ovako „sabijen“ kod ne radi u svim primerima kako treba i dolazi do kočenja u izvršavanju, pa ga ipak ne preporučujemo. Kao primer veličine, stoji i poređenje da svaka Javina nit zauzima 1MB, dok njen pandan u Go-u koji se zove gorutina zauzima svega 2 kB memorije.

Za nas je bilo intrigantno da isprobamo TinyGo na nekim od platformi koje imamo u našoj kolekciji, uz želju da u par naredih projekata isprobamo neke od implementiranih koncepata Go jezika prenesenih u TinyGo. Treba imati na umu da je TinyGo u neprekidnom razvoju u dva pravca. Jedan je želja da se pokrije što veći broj različitih platformi, a drugi je da se što više koncepata „velikog“ Go jezika implementira u njemu.

Podržane platforme

Iako se spisak podržanih platformi može videti na strani: https://tinygo.org/docs/reference/microcontrollers/ pažljivim pregledom ćete videti da nisu sve platforme u potpunosti podržane u svoj svojoj funkcionalnosti. Recimo Raspberry Pi pico, Adafruit M0/M4, Arduino Uno/Mega, Particle Argon/Boron, … su kompletni. STM-u nedostaje uglavnom ADC i PWM, dok je sve popularniji ESP prošao najgore bez SPI, I2C, PWM, ADC za 8266 i bez ikakve nade za S3. Mi smo detaljno istražili rPi pico, STM32L432KC, ESP 8266 i Particle Argon.

Napomena (windows): Za flešovanje programa potrebno je postaviti odgovarajući toolchain. Na netu je lako naći pregršt informacija o načinima u zavisnosti od arhitekture vašeg računara. Ono što obično promakne je da se zaboravi modifikacija PATH-a nakon instalacije. Za STM i Particle treba obavezno instalirati OpenOCD i pri tome nemojte zaboraviti da u PATH postavite openocd.exe. Za ESP treba staviti u PATH lokaciju esptool.exe.

TinyGo on ESP

Napomena (Particle Argon/Boron): Zbog specifičnog načina rada online IDE sistema koji je Particle osmislio za sve svoje ploče, obratite pažnju da će eventualno flešovanje koda na Particle obrisati inicijalnu verziju bootloadera i vi više nećete moći da povežete Particle na Particle cloud, bez njegovog ponovnog upisa. Za to će vam trebati programator, jer nije moguće upisati fabrički bootloader korišćenjem USB porta i računara.

Podržana Go funkcionalnost

Kao što podrška za platforme nije 100%, tako nije ni implementacija Go jezika. Imajte na umu da će raditi gorutine i kanali, isečci i refleksije u većini slučajeva, a net i crypto bibloteke veoma retko. Na TinyGo-u se neprekidno radi i uvek možete videti šta je od novih opcija imogućeno. Mnoge od njih vam neće ni trebati, a opet ako razmišljate da uložite vreme u Go, imajte na umu da moćnije Edge platforme danas nisu retkost, a na njima će veliki Go raditi u svom svom sjaju.

Instalacija

Dobar IDE je potreba, ne luksuz. Dva dominantna rešenja su MS Visual Code sa svojim TinyGo plug-inom, ali nam je on delovao kao generičko rešenje za sve. Obratili smo se stoga kompaniji JetBrains i zamolili za podršku u vidu licence za njihovo okruženje namenjeno upravo Go jeziku. U pitanju je JetBrains GoLand sada u verziji 2023.1 sa njihovim TinyGo pluginom. Zahvaljujemo se na podršci koju su nam pružili besplatnom licencom za GoLang IDE i učinili da putovanje kroz TinyGo zemlju bude prijatno. Mi ćemo stoga ovaj tekst i sve naredno koji će se baviti TinyGo/Go jezikom razvijati i testirati u njihovom GoLand IDE u Windows OS-u.

Pre instalcije IDE, potrebno je na sistem postaviti Go i TinyGo. Najbolje je da koristite zvanično uputstvo na internetu: https://tinygo.org/getting-started/install/

I u Windows okruženju ispratićemo korake sa TinyGo sajta koje preporučuje upotrebu Scoop-a, pa iz njega instalaciju Go i TinyGo-a. Vrlo lako, jednostavno i bez ikakvih problema na našem sistemu je TinyGo/Go proradio odmah.

Sledeći korak bila je instalacija JetBrains GoLand IDE i u njemu TinyGo plug-ina. Lagano i intuitivno. Kreiramo prvi projekat i tu se eventualno, u podešavanjima par varijabili može pojaviti problem ili bar nepotrebno gubljenje vremena.

Prvo, obratite pažnju da ste TinyGo i Go instalirati kroz Scoop Kod nas su se nalazile na C:\Users\YourName\scoop\apps\go\current i C:\Users\YourName\scoop\apps\tinygo\current. Trebale su nam te dve lokacije da ih stavimo u Global GOPATH uz naravno direktorijum u kome se nalaze svi naši projekti: recimo D:\Go\GolandProjects. Sva podešavanja smo uradili u Settings prozoru GoLand-a.

Drugo, trebali su nam SDK-ovi i za Go i za TinyGo. Sam GoLand ima opciju da klikom na + desno od prvog polja u Settings/GOROOT i Settings/TinyGo preuzme sa neta SDK-ove i snimi ih na lokalni disk. Pri prvom pokretanju IDE-a smo to i uradili. Medjutim, prilikom razvoja aplikacija, preuzimaćete module sa neta i po pravilu smeštati ih u Go SDK direktorijum. Pošto će to biti moduli za TinyGo, možete doći u problem ako odlučite da programirate i u pravom Go-u u istom IDE-u. Rešenje naravno postoji i njega ćemo dati nakon sledećeg koraka. Za sada ostavite lokacije gde ste i preuzeli SDK-ove.

Otvaramo novi projekat, odabiramo lokaciju na disku, preuzimamo Go SDK i odmah ga smeštamo u GOROOT. Na kraju u TinyGo podešavanjima podesili smo Target platform (mi smo odabrali pico jer ćemo raditi sa PicoW) i odabrali Create. Novi projekat je kreiran. Sva dodatna podešavanja uradio je sam JetBrains GoLand IDE.

TinyGo on pico

Da bi sve podesili ušli smo u terminal (odabirom ikonice sa leve strane dole) i ukucali tinygo info pico. (pico jer je to platforma sa kojom radimo) Poslednja stavka ispisa nam je dala lokaciju cached GOROOT. Sistem je keširao Go SDK na toj lokaciji.

TinyGo on cacher GOROOT

Vratli smo se u Files/Settings/GOROOT i izmenili lokaciju koja se tu nalazi i koja ukazuje na preuzeti Go SDK sa lokacijom keširanog SDK-a. Razlog je jasan, svi preuzeti TinyGo moduli će biti smešteni u cached GOROOT i neće smetati ukoliko odlučite da programirate u punom Go-u.

TinyGo GOROOT settings

Ovim je okruženje potpuno postavljeno i funkcionalno. Sve što treba je napraviti main.go u root-u projekta. Podešavanje/kreiranje prečice do flash komande u GoLand IDE se radi odabirom menija na vrhu prozora u sredini. Izaberali smo + (gore levo) i opciju TinyGo Flash koja je u donjoj četvrtini liste opcja. Jedino što smo morali da uradimo je da definišemo lokaciju main.go fajla.

TinyGo project

Prvi TinyGo projekat

Za naš prvi demo projekat odlučili smo da povežemo 8×8 WS2812 LED panel sa pico-m, time da smo na GPIO8 postavili DIN, a napajanje je išlo preko 3,3V koje daje sam pico na svojim portovima. Iako je deklarisano 5V za napajanje 8×8 LED matriksa, za ovaj mali projekat nije bilo potrebno da implemetiramo dodatni izvor od 5V jer picoW nema 5V izlaz. O projektu pročitajte u posebnom tekstu.

TinyGo first project on pico with ws2812

Zaključak

Paralelno procesiranje u multijezgarnim sistemima jeste izazov. Kod pico-a se to rešava stejt mašinama u nekim aplikacijama. Moguće je pokrenuti i dva nezavisna procesa i u pythonu. Oba rešenja ne podrazumevaju smislen automatski menadžment konkuretnosti. Uz RTOS to se podiže na jedan viši nivo i tu možemo govoriti i opipljivijoj konkurentnosti. TinyGo zbog kompatibilnosti sa WASM u suštini ne podržava konkuretno višejezgarno izvršavanje (šteta jer pico ima dva jezgra) iz bezbednosnih razloga. Ipak gorutine se mogu konkurentno izvršavati na jedno jezgru i međusobno razmenjivati podatke preko kanala, koji je jedna vrsta steka kome mogu pristupati. Tu je i dobar garbage collector i pristojno rešen menadžment gorutina.

Na netu ćete sigurno naći daleko veću Python ili C/C++ podršku, ali je nas prijatno iznenadilo i mnoštvo Go primera, koji uglavnom i nisu stariji od 2-3 godine. Zajednica nije ogromna, jezick nije „spušten“ na nivo obrazovnog standarda, ali mu je perspektiva po našem mišljenju dobra. I sama odluka kompanije JetBrains da izda IDE specijalizovan samo za Go govori o njegovoj perspektivi. Uz stalno unapređenje TinyGo jezika i dobar IDE kao što je JetBrains-ov GoLand 2023.1, programiranje IoT Edge uređaja na oblaku deluje kao inspirativan poduhvat.

Aleksandar Dakić
Follow me