嵌入式Go
Go 更适合运行在 带有操作系统(尤其是 Linux)的嵌入式设备 上,而不是资源极度受限的裸机单片机(如 STM32F103 这类只有几十 KB RAM 的 MCU)。
🔧 开发效率高 语法简洁,标准库丰富,支持现代编程范式。
⚡ 并发能力强 Goroutine + Channel 轻松实现高并发,适合处理传感器、网络、事件等多任务。
🔄 跨平台支持好 支持 ARM、ARM64、MIPS、RISC-V 等多种架构
📦 静态编译,无依赖 GOOS=linux GOARCH=arm go build 可生成独立二进制文件,无需外部运行时
✅ 适用场景包括:
嵌入式 Linux 设备(如 Raspberry Pi、BeagleBone、工业网关)
边缘计算设备
IoT 网关或数据中心
智能家居控制器
工业网关、数据采集终端。
如果是 小资源 MCU,建议使用 TinyGo。
树莓派上用 Go 控制 GPIO 完整示例
Go 语言 控制 GPIO 的完整示例,功能包括:
- 使用 periph.io 库控制 GPIO 引脚(点亮 LED)
- 启动一个简单的 Web 服务器
- 通过 HTTP 接口远程开关 LED
安装 periph.io 库(用于 GPIO 控制)
periph.io 是 Go 中最流行的硬件 I/O 库,支持树莓派 GPIO。
go install periph.io/x/periph/cmd/periph-linux-arm@latest
或直接在代码中 go get
go get -u periph.io/x/periph/v4/...
完整 Go 程序代码
// main.go
package main
import (
"log"
"net/http"
"sync"
"time"
"periph.io/x/periph/v4/host"
"periph.io/x/periph/v4/host/rpi"
"periph.io/x/periph/v4/conn/gpio"
"periph.io/x/periph/v4/conn/gpio/gpioreg"
)
// 全局变量:LED 引脚
var led gpio.PinOut
var mu sync.Mutex
func main() {
// 1. 初始化 periph 系统
if _, err := host.Init(); err != nil {
log.Fatal("无法初始化 periph:", err)
}
// 2. 获取 GPIO18 引脚(树莓派物理引脚 12)
led = gpioreg.ByName("18")
if led == nil {
log.Fatal("无法找到 GPIO18")
}
// 3. 设置为输出模式
if err := led.Out(gpio.Low); err != nil {
log.Fatal("设置 GPIO18 失败:", err)
}
log.Println("✅ GPIO18 初始化成功,LED 准备就绪")
// 4. 启动 Web 服务器
http.HandleFunc("/", indexHandler)
http.HandleFunc("/on", ledOnHandler)
http.HandleFunc("/off", ledOffHandler)
http.HandleFunc("/blink", blinkHandler)
log.Println("🌍 服务器启动:http://<树莓派IP>:8080")
log.Fatal(http.ListenAndServe(":8080", nil))
}
// 首页
func indexHandler(w http.ResponseWriter, r *http.Request) {
html := `
<html>
<body>
<h1>树莓派 GPIO 控制</h1>
<p><a href="/on">🟢 开灯</a></p>
<p><a href="/off">🔴 关灯</a></p>
<p><a href="/blink">✨ 闪烁 5 次</a></p>
</body>
</html>
`
w.Header().Set("Content-Type", "text/html; charset=utf-8")
w.Write([]byte(html))
}
// 开灯
func ledOnHandler(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
if err := led.Out(gpio.High); err != nil {
http.Error(w, "开灯失败: "+err.Error(), 500)
return
}
log.Println("💡 LED 已打开")
http.Redirect(w, r, "/", http.StatusSeeOther)
}
// 关灯
func ledOffHandler(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
if err := led.Out(gpio.Low); err != nil {
http.Error(w, "关灯失败: "+err.Error(), 500)
return
}
log.Println("💡 LED 已关闭")
http.Redirect(w, r, "/", http.StatusSeeOther)
}
// 闪烁 5 次
func blinkHandler(w http.ResponseWriter, r *http.Request) {
mu.Lock()
defer mu.Unlock()
log.Println("✨ 开始闪烁 5 次")
go func() {
for i := 0; i < 5; i++ {
led.Out(gpio.High)
time.Sleep(300 * time.Millisecond)
led.Out(gpio.Low)
time.Sleep(300 * time.Millisecond)
}
}()
http.Redirect(w, r, "/", http.StatusSeeOther)
}
▶️ 编译与运行
- 编译(在树莓派上直接编译)
go build -o led-server main.go
sudo ./led-server
例如:http://192.168.1.100:8080
点击按钮控制 LED:
“开灯” → LED 亮
“关灯” → LED 灭
“闪烁” → LED 闪烁 5 次(不阻塞页面)
交叉编译(从 Mac/Linux 编译后拷贝到树莓派)如果你不想在树莓派上装 Go,可以在本地编译:
GOOS=linux GOARCH=arm GOARM=6 go build -o led-server main.go

被折叠的 条评论
为什么被折叠?



