SlideShare a Scribd company logo
利用 TinyGo 編譯出運行在
microcontroller 的 Golang 程式
Cherie Hsieh @ PUFsecurity from eMemory
WhoAmI
Cherie Hsieh
Senior Frimware & Software Engineer @ PUFsecurity
1. Golang Community Co-organizer
2. GDG Hsinchu Organizer
3. Google WTM
4. Master student at NYCU
矽智財(IP)廠商力旺(3529)昨(21)日
股價強攻漲停,收盤以 2,340元平歷史
高價的姿態,擠下伺服器管理晶片
(BMC)廠信驊,成為台股第二高價股,
僅次於股王矽力。
Golang for Embedded
Reflections on 10 years of Go (devfast 2019)
If MicroPython is gaining traction as a language for embedded, I think Go is a
far better candidate.
Golang for Embedded
TinyGo - A Go Compiler For Small Places
(Target devices for 8K to 32K of RAM)
Golang for Embedded
package main
import (
"machine"
"time"
)
func main() {
led := machine.LED
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
for {
led.Low()
time.Sleep(time.Millisecond * 500)
led.High()
time.Sleep(time.Millisecond * 500)
}
}
Demo
How TinyGo works
tinygo build -o blink -target="pico" ./blink.go
TinyGo options
Go standard
compiler lib
TinyGo
interpreter
SSA
LLVM
IR
Go does a lot of initialization at runtime, which is really bad for code size.
So TinyGo interprets these functions at compile time as far as it is able to.
static single assignment
How TinyGo works
tinygo build -o blink -target="pico" ./blink.go
TinyGo options
Go standard
compiler lib
TinyGo
interpreter
SSA
LLVM
IR
TinyGo
optimizer
LLVM standard
optimizer
object file
string-to-[]byte optimizations
How TinyGo works
tinygo build -o blink -target="pico" ./blink.go
object file
object file
object file
LLVM Linker
linker script
binary file
Run TinyGo programs on Pico
1. Bring-up Pico
2. CPU initialization
3. Load user programs
4. Jump to entry point
5. Use a correct register table
6. Target-specific runtime
Run TinyGo programs on Pico
Boot Flow of Pico
hardware
controlled boot
CPU
initialization
Load
bootloader
Bootroom
Setup
Flash
Jump to the
entry point
Run the
program
Bootloader
Run TinyGo programs on Pico
Memory Map
Run TinyGo programs on Pico
TinyGo configuration for Pico
tinygo build -o blink -target="pico" ./blink.go
{ // tinygo/targets/pico.json
"inherits": [
"rp2040"
],
"build-tags": ["pico"],
"serial": "uart", // build be usb or uart
"linkerscript": "targets/pico.ld",
"extra-files": [
"targets/pico-boot-stage2.S" // bootloader
]
}
{ // tinygo/targets/rp2040.json
"inherits": ["cortex-m0plus"],
"build-tags": ["rp2040", "rp"],
"flash-method": "msd",
"msd-volume-name": "RPI-RP2",
"msd-firmware-name": "firmware.uf2",
"binary-format": "uf2",
"uf2-family-id": "0xe48bff56",
"rp2040-boot-patch": true,
"extra-files": [
"src/device/rp/rp2040.s"
],
"openocd-transport": "swd",
"openocd-target": "rp2040"
}
Run TinyGo programs on Pico
TinyGo configuration for Pico
tinygo build -o blink -target="pico" ./blink.go
// pico.ld
MEMORY
{
/* Reserve exactly 256 bytes at start of flash for second stage bootloader */
BOOT2_TEXT (rx) : ORIGIN = 0x10000000, LENGTH = 256
FLASH_TEXT (rx) : ORIGIN = 0x10000000 + 256, LENGTH = 2048K - 256
RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 256k
}
INCLUDE "targets/rp2040.ld"
Run TinyGo programs on Pico
TinyGo configuration for Pico
_stack_size = 2K;
SECTIONS
{
/* Second stage bootloader is prepended to the image. It must be 256 bytes
and checksummed. The gap to the checksum is zero-padded.
*/
.boot2 : {
__boot2_start__ = .;
KEEP (*(.boot2));
/* Explicitly allocate space for CRC32 checksum at end of second stage bootloader */
. = __boot2_start__ + 256 - 4;
LONG(0)
} > BOOT2_TEXT = 0x0
}
INCLUDE "targets/arm.ld"
Run TinyGo programs on Pico
TinyGo configuration for Pico
arm
rp2040
processor
microcontroller
Pico
Adafruit Feather
RP2040
board
Inherited configuration
Run TinyGo programs on Pico
Target-Specific Runtime
"build-tags": ["pico", "rp2040", "rp"],
// +build rp2040
package runtime
import (
"device/arm"
"machine"
)
// more code
func main() {
preinit()
run() // call main function
abort()
}
Run TinyGo programs on Pico
Go struct for abstract hardware
src/device/rp
src/machine/machine_rp2040_uart.go
raw register table
abstract hardware struct
Run TinyGo programs on Pico
Go struct for abstract hardware
type UART struct {
Buffer *RingBuffer
Bus *rp.UART0_Type
Interrupt interrupt.Interrupt
}
// Configure the UART.
func (uart *UART) Configure(config UARTConfig) error {
// more code ...
}
The differences between
Go programs and TinyGo programs
1. Goroutine & Scheduler
Go - User Space Scheduling TinyGo - FIFO Scheduling
https://golangbyexample.com/goroutines-golang/
run queue
sleep queue
G1 G2
G3
The differences between
Go programs and TinyGo programs
1. Memory Management
Go TinyGo
https://about.sourcegraph.com/go/gophercon-2018-allocator-wrestling/
Experiment
Touch Sensor
Pico
Pi 3B
SWD
UART
Experiment
type TouchChange uint8
type Touch struct { // Hardware abstraction struct
pin machine.Pin
intr interrupt.Interrupt
action func()
change TouchChange
}
func NewTouch(pin machine.Pin, change TouchChange, action func()) *Touch {
touch := &interTouch
touch.pin = pin
touch.action = action
touch.change = change
touch.intr = interrupt.New(rp.IRQ_IO_IRQ_BANK0, interTouch.handleInterrupt)
return touch
}
Experiment
func main() {
led.Configure(machine.PinConfig{Mode: machine.PinOutput})
touchAtion := func(){
if led.Get() {
led.Low()
} else {
led.High()
}
}
touch := NewTouch(machine.GPIO28, Touched, touchAtion)
touch.Enable();
select{}
}
Debug
openOCD
(debug Translator)
GDB server
GDB client
Debug Access
Port
Debugger
Interface
Break/Watch
Point Unit
Cortex M0+
Core
SWD
Pi 3B (host) Pico
Challenges
1. Reused v.s full-customized board configurations.
2. Insufficient APIs for hardware control.
3. Parts of Go features are still a work in progress.
Why this TinyGo exists
We never expected Go to be an embedded language and so its got serious
problems...
Rob Pike, GopherCon 2014 Opening Keynote
The original reasoning was: if Python can run on microcontrollers, then
certainly Go should be able to run on even lower level micros.
Resources
1. https://tinygo.org/
2. https://www.infoq.com/presentations/tiny-go/
3. https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html
Thank You for Your Time.
Cherie Hsieh @ PUFsecurity from eMemory

More Related Content

What's hot (20)

PPTX
The Difference Between TypeScript V/S JavaScript
InnvonixTechSolution
 
PPT
Role based access control
Peter Edwards
 
PPTX
Spring HATEOAS
Yoann Buch
 
PDF
API Testing and Hacking (1).pdf
Vishwas N
 
PDF
Spring boot introduction
Rasheed Waraich
 
PDF
The current state of generative AI
Benjaminlapid1
 
PDF
Full-Stack Development with Spring Boot and VueJS
VMware Tanzu
 
PDF
VMware Interview questions and answers
vivaankumar
 
PDF
Db2 cheat sheet for development
Andres Gomez Casanova
 
PDF
Spring Boot
Pei-Tang Huang
 
PDF
Struts Basics
Harjinder Singh
 
PDF
Ibm web sphere_job_interview_preparation_guide
Khemnath Chauhan
 
PPTX
Role Discovery and RBAC Design: A Case Study with IBM Role and Policy Modeler
Prolifics
 
PDF
API Integration For Building Software Applications Powerpoint Presentation Sl...
SlideTeam
 
PDF
Getting Started with Spring Authorization Server
VMware Tanzu
 
PDF
An Introduction to Generative AI
Cori Faklaris
 
PPTX
Virtualization 101
Gaurav Marwaha
 
PDF
AWS Pentesting
MichaelRodriguesdosS1
 
PDF
OpenAPI 3.0.2
Pedro J. Molina
 
PPTX
An Introduction to Maven
Vadym Lotar
 
The Difference Between TypeScript V/S JavaScript
InnvonixTechSolution
 
Role based access control
Peter Edwards
 
Spring HATEOAS
Yoann Buch
 
API Testing and Hacking (1).pdf
Vishwas N
 
Spring boot introduction
Rasheed Waraich
 
The current state of generative AI
Benjaminlapid1
 
Full-Stack Development with Spring Boot and VueJS
VMware Tanzu
 
VMware Interview questions and answers
vivaankumar
 
Db2 cheat sheet for development
Andres Gomez Casanova
 
Spring Boot
Pei-Tang Huang
 
Struts Basics
Harjinder Singh
 
Ibm web sphere_job_interview_preparation_guide
Khemnath Chauhan
 
Role Discovery and RBAC Design: A Case Study with IBM Role and Policy Modeler
Prolifics
 
API Integration For Building Software Applications Powerpoint Presentation Sl...
SlideTeam
 
Getting Started with Spring Authorization Server
VMware Tanzu
 
An Introduction to Generative AI
Cori Faklaris
 
Virtualization 101
Gaurav Marwaha
 
AWS Pentesting
MichaelRodriguesdosS1
 
OpenAPI 3.0.2
Pedro J. Molina
 
An Introduction to Maven
Vadym Lotar
 

Similar to Run Go applications on Pico using TinyGo (20)

PPT
Developing Applications for Beagle Bone Black, Raspberry Pi and SoC Single Bo...
ryancox
 
PPTX
Innovation with pcDuino
Jingfeng Liu
 
PPTX
pcDuino tech talk at Carnegie Mellon University 10/14/2014
Jingfeng Liu
 
PDF
Survey_Paper
Abhra Koley
 
KEY
Scottish Ruby Conference 2010 Arduino, Ruby RAD
lostcaggy
 
PPTX
RaspberryPiPico.pptx
SakshiGupta294972
 
PPTX
pcDuino Presentation at SparkFun
Jingfeng Liu
 
PPTX
Pres
johnkashap
 
PPTX
Pres
johnkashap
 
PPTX
ASP.NET 5 on the Raspberry PI 2
Jürgen Gutsch
 
PDF
JS Fest 2018. Володимир Шиманський. Запуск двіжка JS на мікроконтролері
JSFestUA
 
PPTX
Introduction to pcDuino
Jingfeng Liu
 
PDF
Iot Bootcamp - abridged - part 1
Marcus Tarquinio
 
PDF
Let's begin io t with $10
Makoto Takahashi
 
PPTX
Python-in-Embedded-systems.pptx
TuynLCh
 
PDF
Raspberry Pi - best friend for all your GPIO needs
Dobrica Pavlinušić
 
PDF
NodeMCU ESP8266 workshop 1
Andy Gelme
 
PPTX
Blinken' Lights with .NET
NullOps
 
PDF
Share the Experience of Using Embedded Development Board
Jian-Hong Pan
 
PDF
CO352 - Lab Manual - IoT with Cloud Computing Lab.pdf
hnagasai240
 
Developing Applications for Beagle Bone Black, Raspberry Pi and SoC Single Bo...
ryancox
 
Innovation with pcDuino
Jingfeng Liu
 
pcDuino tech talk at Carnegie Mellon University 10/14/2014
Jingfeng Liu
 
Survey_Paper
Abhra Koley
 
Scottish Ruby Conference 2010 Arduino, Ruby RAD
lostcaggy
 
RaspberryPiPico.pptx
SakshiGupta294972
 
pcDuino Presentation at SparkFun
Jingfeng Liu
 
ASP.NET 5 on the Raspberry PI 2
Jürgen Gutsch
 
JS Fest 2018. Володимир Шиманський. Запуск двіжка JS на мікроконтролері
JSFestUA
 
Introduction to pcDuino
Jingfeng Liu
 
Iot Bootcamp - abridged - part 1
Marcus Tarquinio
 
Let's begin io t with $10
Makoto Takahashi
 
Python-in-Embedded-systems.pptx
TuynLCh
 
Raspberry Pi - best friend for all your GPIO needs
Dobrica Pavlinušić
 
NodeMCU ESP8266 workshop 1
Andy Gelme
 
Blinken' Lights with .NET
NullOps
 
Share the Experience of Using Embedded Development Board
Jian-Hong Pan
 
CO352 - Lab Manual - IoT with Cloud Computing Lab.pdf
hnagasai240
 
Ad

Recently uploaded (20)

PDF
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
PPTX
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
PDF
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PPTX
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
PPTX
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
PDF
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
PPTX
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
PDF
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
PPT
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
PDF
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PDF
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
PDF
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
PDF
Automating Feature Enrichment and Station Creation in Natural Gas Utility Net...
Safe Software
 
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
Designing_the_Future_AI_Driven_Product_Experiences_Across_Devices.pptx
presentifyai
 
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
COMPARISON OF RASTER ANALYSIS TOOLS OF QGIS AND ARCGIS
Sharanya Sarkar
 
Agentforce World Tour Toronto '25 - MCP with MuleSoft
Alexandra N. Martinez
 
Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
Future-Proof or Fall Behind? 10 Tech Trends You Can’t Afford to Ignore in 2025
DIGITALCONFEX
 
Q2 FY26 Tableau User Group Leader Quarterly Call
lward7
 
UiPath DevConnect 2025: Agentic Automation Community User Group Meeting
DianaGray10
 
Ericsson LTE presentation SEMINAR 2010.ppt
npat3
 
Mastering Financial Management in Direct Selling
Epixel MLM Software
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
“Squinting Vision Pipelines: Detecting and Correcting Errors in Vision Models...
Edge AI and Vision Alliance
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
The Rise of AI and IoT in Mobile App Tech.pdf
IMG Global Infotech
 
How do you fast track Agentic automation use cases discovery?
DianaGray10
 
Automating Feature Enrichment and Station Creation in Natural Gas Utility Net...
Safe Software
 
Ad

Run Go applications on Pico using TinyGo

  • 1. 利用 TinyGo 編譯出運行在 microcontroller 的 Golang 程式 Cherie Hsieh @ PUFsecurity from eMemory
  • 2. WhoAmI Cherie Hsieh Senior Frimware & Software Engineer @ PUFsecurity 1. Golang Community Co-organizer 2. GDG Hsinchu Organizer 3. Google WTM 4. Master student at NYCU 矽智財(IP)廠商力旺(3529)昨(21)日 股價強攻漲停,收盤以 2,340元平歷史 高價的姿態,擠下伺服器管理晶片 (BMC)廠信驊,成為台股第二高價股, 僅次於股王矽力。
  • 3. Golang for Embedded Reflections on 10 years of Go (devfast 2019) If MicroPython is gaining traction as a language for embedded, I think Go is a far better candidate.
  • 4. Golang for Embedded TinyGo - A Go Compiler For Small Places (Target devices for 8K to 32K of RAM)
  • 5. Golang for Embedded package main import ( "machine" "time" ) func main() { led := machine.LED led.Configure(machine.PinConfig{Mode: machine.PinOutput}) for { led.Low() time.Sleep(time.Millisecond * 500) led.High() time.Sleep(time.Millisecond * 500) } } Demo
  • 6. How TinyGo works tinygo build -o blink -target="pico" ./blink.go TinyGo options Go standard compiler lib TinyGo interpreter SSA LLVM IR Go does a lot of initialization at runtime, which is really bad for code size. So TinyGo interprets these functions at compile time as far as it is able to. static single assignment
  • 7. How TinyGo works tinygo build -o blink -target="pico" ./blink.go TinyGo options Go standard compiler lib TinyGo interpreter SSA LLVM IR TinyGo optimizer LLVM standard optimizer object file string-to-[]byte optimizations
  • 8. How TinyGo works tinygo build -o blink -target="pico" ./blink.go object file object file object file LLVM Linker linker script binary file
  • 9. Run TinyGo programs on Pico 1. Bring-up Pico 2. CPU initialization 3. Load user programs 4. Jump to entry point 5. Use a correct register table 6. Target-specific runtime
  • 10. Run TinyGo programs on Pico Boot Flow of Pico hardware controlled boot CPU initialization Load bootloader Bootroom Setup Flash Jump to the entry point Run the program Bootloader
  • 11. Run TinyGo programs on Pico Memory Map
  • 12. Run TinyGo programs on Pico TinyGo configuration for Pico tinygo build -o blink -target="pico" ./blink.go { // tinygo/targets/pico.json "inherits": [ "rp2040" ], "build-tags": ["pico"], "serial": "uart", // build be usb or uart "linkerscript": "targets/pico.ld", "extra-files": [ "targets/pico-boot-stage2.S" // bootloader ] } { // tinygo/targets/rp2040.json "inherits": ["cortex-m0plus"], "build-tags": ["rp2040", "rp"], "flash-method": "msd", "msd-volume-name": "RPI-RP2", "msd-firmware-name": "firmware.uf2", "binary-format": "uf2", "uf2-family-id": "0xe48bff56", "rp2040-boot-patch": true, "extra-files": [ "src/device/rp/rp2040.s" ], "openocd-transport": "swd", "openocd-target": "rp2040" }
  • 13. Run TinyGo programs on Pico TinyGo configuration for Pico tinygo build -o blink -target="pico" ./blink.go // pico.ld MEMORY { /* Reserve exactly 256 bytes at start of flash for second stage bootloader */ BOOT2_TEXT (rx) : ORIGIN = 0x10000000, LENGTH = 256 FLASH_TEXT (rx) : ORIGIN = 0x10000000 + 256, LENGTH = 2048K - 256 RAM (rwx) : ORIGIN = 0x20000000, LENGTH = 256k } INCLUDE "targets/rp2040.ld"
  • 14. Run TinyGo programs on Pico TinyGo configuration for Pico _stack_size = 2K; SECTIONS { /* Second stage bootloader is prepended to the image. It must be 256 bytes and checksummed. The gap to the checksum is zero-padded. */ .boot2 : { __boot2_start__ = .; KEEP (*(.boot2)); /* Explicitly allocate space for CRC32 checksum at end of second stage bootloader */ . = __boot2_start__ + 256 - 4; LONG(0) } > BOOT2_TEXT = 0x0 } INCLUDE "targets/arm.ld"
  • 15. Run TinyGo programs on Pico TinyGo configuration for Pico arm rp2040 processor microcontroller Pico Adafruit Feather RP2040 board Inherited configuration
  • 16. Run TinyGo programs on Pico Target-Specific Runtime "build-tags": ["pico", "rp2040", "rp"], // +build rp2040 package runtime import ( "device/arm" "machine" ) // more code func main() { preinit() run() // call main function abort() }
  • 17. Run TinyGo programs on Pico Go struct for abstract hardware src/device/rp src/machine/machine_rp2040_uart.go raw register table abstract hardware struct
  • 18. Run TinyGo programs on Pico Go struct for abstract hardware type UART struct { Buffer *RingBuffer Bus *rp.UART0_Type Interrupt interrupt.Interrupt } // Configure the UART. func (uart *UART) Configure(config UARTConfig) error { // more code ... }
  • 19. The differences between Go programs and TinyGo programs 1. Goroutine & Scheduler Go - User Space Scheduling TinyGo - FIFO Scheduling https://golangbyexample.com/goroutines-golang/ run queue sleep queue G1 G2 G3
  • 20. The differences between Go programs and TinyGo programs 1. Memory Management Go TinyGo https://about.sourcegraph.com/go/gophercon-2018-allocator-wrestling/
  • 22. Experiment type TouchChange uint8 type Touch struct { // Hardware abstraction struct pin machine.Pin intr interrupt.Interrupt action func() change TouchChange } func NewTouch(pin machine.Pin, change TouchChange, action func()) *Touch { touch := &interTouch touch.pin = pin touch.action = action touch.change = change touch.intr = interrupt.New(rp.IRQ_IO_IRQ_BANK0, interTouch.handleInterrupt) return touch }
  • 23. Experiment func main() { led.Configure(machine.PinConfig{Mode: machine.PinOutput}) touchAtion := func(){ if led.Get() { led.Low() } else { led.High() } } touch := NewTouch(machine.GPIO28, Touched, touchAtion) touch.Enable(); select{} }
  • 24. Debug openOCD (debug Translator) GDB server GDB client Debug Access Port Debugger Interface Break/Watch Point Unit Cortex M0+ Core SWD Pi 3B (host) Pico
  • 25. Challenges 1. Reused v.s full-customized board configurations. 2. Insufficient APIs for hardware control. 3. Parts of Go features are still a work in progress.
  • 26. Why this TinyGo exists We never expected Go to be an embedded language and so its got serious problems... Rob Pike, GopherCon 2014 Opening Keynote The original reasoning was: if Python can run on microcontrollers, then certainly Go should be able to run on even lower level micros.
  • 27. Resources 1. https://tinygo.org/ 2. https://www.infoq.com/presentations/tiny-go/ 3. https://www.raspberrypi.com/documentation/microcontrollers/raspberry-pi-pico.html
  • 28. Thank You for Your Time. Cherie Hsieh @ PUFsecurity from eMemory