在嵌入式Linux中推荐使用Golang

我在接近一年的时间里尝试用golang来编写嵌入式Linux的用户进程,感觉非常不错!因为我想要增加团队成员,所以在这里分享一下这方面的信息。

#你做了什么?
我基于现有产品,尝试使用Golang编写了新功能的实现。
现有部分使用了C进行编写。而我用Golang编写的新功能部分则成为了一个独立的进程。
与现有部分的交互根据场景选择了以下的方式。

    • cgoによる関数呼び出し

 

    • UNIXドメインソケットの通信

 

    シグナル

我用Golang编写的部分包括以下要素。

    • UARTやi2cで接続されたセンサーからデータを受け取る

 

    • インターネット上のWebサービスのAPIを使用する

 

    2Dグラフィックスの描画 (cairoを使用)

我们更注重迅速实现足够的性能,而不是追求最大性能。

#Golang的好处
(这是我的观点。)

mmapやioctlのシステムコールを扱うことができる。これで低レベルの部分までcgoに頼らずに直接Golangで記述できた。

goroutineを使った非同期処理が非常に簡潔に書ける。

GCによるメモリ管理があること。GCによる遅延は問題にはならなかった。

PC Linuxで部分的に動作確認したコードを実機(ARM Linux)に持って行くのが楽であった。

シミュレータやデータ変換などの周辺ツールもGolangで書くのが楽であった。

意味不明のクラッシュが発生することがなく、デバッガは不要だった。(例えば、sliceの範囲を超えたときにはpanicになってスタックトレースが出力される)

cgoでCの関数を呼ぶのも容易。

有用なライブラリが豊富。

既存ライブラリのGolang bindingも多い。(cairoのgo bindingを使用した)

在使用Golang时遇到一些问题。

我曾遇到不知道該如何做而感到困惑的情況,但從未遇到如此困難的事情。如果必須強調的話,

    実行ファイルのサイズが大きい。

我已经在另一篇文章中详细介绍了如何对此进行对策。
通过将Golang的执行文件打包成多个文件并减小总文件大小,采用了类似busybox的方式来进行改进。

我已经写了一篇关于在使用嵌入式Linux时所需的实际信息的文章。
从Golang中读写物理内存
使用Golang进行ioctl系统调用
接收Golang中的GPIO中断通知
将Golang进程设置为FIFO优先级
在Golang中使用串口(UART)
使用Golang进行BLE(低功耗蓝牙)
将Golang日志的时间戳设为微秒级别的方法
在Golang中定期执行的模式

所以,我希望继续积极地使用Golang。

我喜欢有垃圾回收的语言。在很久以前的手机Java时代,我非常担心垃圾回收导致的停机时间,但在现在的golang中,对于我的使用来说,几乎感觉不到垃圾回收的停机时间有多小。- 嵌入式专家。

Golang无法在没有操作系统的微控制器上运行。(虽然有一些实验性项目。)只要有Linux就可以了,比如树莓派或者Nano Pi。——嵌入式工程师。 (@tetsu_koba) 2018年1月17日

在没有操作系统的裸机环境中实现任何语言的运行时是非常困难的,不是每个人都可以做到的。对于Golang而言,只要有Linux内核(或者BSD),就不需要任何工作来”实现运行时”,这一点非常棒。— 嵌入式工程师。

# 补充说明 2018年1月31日

可能提供参考的网页:
https://github.com/rakyll/go-hardware
http://embd.kidoman.io/

#追蹤 2022.4.12
這篇文章有我在講座時使用的投影片和影片。
我演講了「在嵌入式Linux中推薦使用Golang」。

广告
将在 10 秒后关闭
bannerAds