从 Golang 到 TinyGo:如何为 IOT 设备构建高效应用程序?

文摘   2024-08-03 19:18   美国  

TinyGo 是专为小型设备设计的 Go 编译器。它将 Go 编程语言引入微控制器和 WebAssembly,使 Go 开发人员能够高效地为嵌入式系统和网络环境构建应用程序。TinyGo 的主要目标是缩小二进制文件的大小并提高性能,以适应小型设备的限制。

TinyGo 的主要特性

  • 小二进制文件与标准 Go 编译器 (gc) 相比,TinyGo 生成的二进制文件要小得多,因此适合存储空间有限的环境。
  • 内存占用低:TinyGo 经过优化,使用的内存更少,非常适合内存有限的微控制器。
  • 支持 WebAssembly:TinyGo 可将 Go 代码编译成 WebAssembly,使 Go 应用程序能在网络浏览器中运行。
  • 互操作性:允许通过易于使用的应用程序接口与底层硬件直接交互,因此非常适合嵌入式系统。

安装

可以使用以下命令安装 TinyGo:

# Install TinyGo
brew tap tinygo-org/tools
brew install tinygo

# Verify the installation
tinygo version

对于其他操作系统,可以按照官方安装指南[1]进行安装。

编写第一个 TinyGo 程序

让我们用 TinyGo 写一个简单的 "Hello, World!"程序。

package main

import "machine"
import "time"

func main() {
    led := machine.LED
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})

    for {
        led.High()
        time.Sleep(time.Millisecond * 500)
        led.Low()
        time.Sleep(time.Millisecond * 500)
    }
}

编译和运行 TinyGo 代码

要在微控制器上编译和运行这段代码,请按照以下步骤操作:

  • 将微控制器连接到电脑。
  • 为特定电路板编译代码。例如,如果您使用的是 Arduino Uno:
tinygo flash -target=arduino main.go

Golang 和 TinyGo 的区别

虽然 Golang 和 TinyGo 有着相同的语法和许多功能,但它们也有一些关键的不同之处:

目标平台

  • Golang:主要设计用于服务器端应用程序、网络服务和桌面应用程序。
  • TinyGo:针对微控制器、物联网设备和浏览器应用的 WebAssembly。

二进制大小:

  • Golang:由于其全面的运行时和标准库,产生的二进制文件相对较大。
  • TinyGo:经过优化,可生成适合嵌入式系统的较小二进制文件。

标准库支持

  • Golang:完全支持 Go 标准库
  • TinyGo:由于嵌入式环境的限制,对 Go 标准库的支持有限。不过,它包含了基本的软件包,并为不支持的功能提供了替代方案。

内存使用情况:

  • Golang:优化了性能,但使用更多内存。
  • TinyGo:内存使用量更少,非常适合低内存环境。

并发性:

  • Golang完全支持 goroutines 和并发编程。
  • TinyGo:对 goroutines 的基本支持,但由于目标平台的限制而受到一些限制。

使用 TinyGo 的示例项目

闪烁的 LED:在微控制器上闪烁 LED 的简单程序。

package main

import "machine"
import "time"

func main() {
    led := machine.LED
    led.Configure(machine.PinConfig{Mode: machine.PinOutput})

    for {
        led.High()
        time.Sleep(time.Millisecond * 500)
        led.Low()
        time.Sleep(time.Millisecond * 500)
    }
}

温度传感器从温度传感器读取数据并显示。

package main

import (
    "machine"
    "time"
)

func main() {
    sensor := machine.ADC{Pin: machine.ADC1}
    sensor.Configure(machine.ADCConfig{})

    for {
        value := sensor.Get()
        println("Temperature:", value)
        time.Sleep(time.Second)
    }
}

WebAssembly 示例

package main

import "fmt"

func main() {
    fmt.Println("Hello, WebAssembly!")
}

将其编译为 WebAssembly:

tinygo build -o main.wasm -target wasm main.go

总结

TinyGo 通过 WebAssembly 将 Go 编程语言的强大功能和简易性扩展到微控制器和网络浏览器等受限环境。TinyGo 能够生成小二进制文件并高效使用内存,是物联网和嵌入式系统开发的理想选择。与完整的 Go 编译器相比,WebAssembly 有一些局限性,但它为 Go 开发人员在新领域创建创新应用提供了新的可能性。

参考资料
[1]

tinygo installation: https://tinygo.org/


Go Official Blog
Golang官方博客的资讯翻译及独家解读
 最新文章