SlideShare a Scribd company logo
1
組み込み Linux での
 Golang のススメ
Tetsuyuki Kobayashi
2018.3.2 CELF
2
 The latest version of this slide will
be available from here
 http://www.slideshare.net/tetsu.koba/presentati
ons
3
Who am I?
 20+ years involved in embedded systems
 10 years in real time OS, such as iTRON
 10 years in embedded Java Virtual Machine
 Now GCC, Linux, QEMU, Android, …
 Blogs
 https://qiita.com/tetsu_koba
 http://d.hatena.ne.jp/embedded/
 http://kobablog.wordpress.com/(English)
 Twitter
 @tetsu_koba
前提
 組み込み Linux を使う。なぜな
ら ..
 ネットワーク
 USB
 CPU は arm926 以上
 Cortex A7 くらいだと評価ボード
が入手しやすい
想定
 NanoPi NEO
 Cortex-A7, RAM 512MB
 USB や i2c でセンサーを接続
 その計測データをネットワークで
サーバに送信
 GUI 無し
そろそろ C 言語を卒業したい ..
 C++ は肌に合わない
 Java?
 Python?
 Rust?

 Golang !!
本日話すること
 Golang はどんな言語か
 Golang の組み込み Linux への
導入のしやすさ
 組み込みソフト技術者として気
になるところ
 実際に使ってみての感想
Golang はどんな言語か
Golang
 Go 言語
 検索しにくいので “ golang”
 https://golang.org/
Golang の特徴
 型あり
 ガベージコレクタあり
 コンパイル言語
 インタープリタではない
 コンパイル速度は速い
Golang の特徴 (2)
 関数値を複数返せる
 goroutine: 並列処理を記述しやすい。メ
ニーコアに対応
 オブジェクト指向ではない
 継承でなくて委譲
 例外無い
 愚直に if 文でエラー処理
 Generices 無い
gofmt
UTF-8
システム記述言語として
 「スクリプト言語並みの書きやす
さと C 言語並みの実行性能」
 OS のシステムコール使える
 mmap, ioctl, select
 C 言語で書けることはだいたいで
きる ( はず )
 C の関数を呼べる (CGO)
Golang はどこに使われているか
 サーバ側ソフト
 CLI ( コマンドラインツール )
 クロスコンパイルして渡すのが簡単
 Golang で書かれた有名なアプリ
 docker
 Python からの移行が多いらしい
Golang の組み込み Linux への
導入のしやすさ
組み込み Linux への導入のしや
すさ
 ビルドホストへのインストール
が容易
 クロスコンパイルが容易
 ランタイムの移植が不要
ビルドホストへのインストール
が容易
 4 ステップで最新版 golang がインストー
ルできる
 sudo apt-get install golang-go
 golang のソースコードを入手して展開
 cd src; ./make.bash
 PATH を設定
 Golangの最新版をソースからビルドする
クロスコンパイルが容易

環境変数 GOARCH, GOARM を
セットして go build するだけ
 GOARCH=arm GOARM=7 go build
 static link された実行ファイルができ
るので、それを実機に持って行くだけ
 カーネルにしか依存しない。 glibc,
uclibc に無関係に動作する
 Linuxでネットワークインタフェースの活動状況を調べる by Golang
ランタイムの移植が不要
Linux kernel
libraries
Application
language runtime
Usual languages
Linux kernel
libraries
Application
language runtime
Golang
static linked binary
Independent
Comes from
Golang
toolchain
後方互換性の高さ
 Version up の不安が無い
 コンパイラを入れ替えるだけ
 Golang 1.2 から 1.10 まで使っ
ていてトラブル無し
 互換性のない変更が入るときは
Golang 2.x になるらしい
フルセットの嬉しさ
 たくさんある 3rd party ライブ
ラリがそのまま利用可能
 組み込み向け XX はサブセット
であることが多かった
 世の中のライブラリがそのま
ま使えない
組み込みソフト技術者として
気になるところ
組み込みソフト技術者として気
になるところ
 スレッドモデル
 ガベージコレクタ
 物理メモリへのアクセス
 割り込みの受け方
 実行ファイルのサイズ削減
スレッドモデル
 goroutine
 M:N model
 ブロックするシステムコールを
呼んでも大丈夫
 Thread Local Storage 無し
 goroutine の優先度設定無し
ガベージコレクタ
 コンカレント GC
 停止時間微小 msec オーダー
 version up ごとに改善されてい
る
 私の経験では GC による停止時
間が問題になったことは無い
物理メモリへのアクセス
 /dev/mem を mmap
 UIO で切り出した領域を mmap
 Golangから物理メモリを読み
書きする
割り込みの受け方
 UIO で read に変換
 GPIO ならば /sys/class/gpio と
poll(2) で可能
 GolangでGPIOの割り込み通
知を受け取る
実行ファイルのサイズ削減
 デバッグシンボルを削除
 Busybox 方式
 複数の実行ファイルを結合し
てそれぞれシンボリックリン
クを張る
 Golangの実行ファイルを複数まとめてトータルのファイルサイズを減らす工夫(busybox方式)
実際に使ってみての感想
実際に使ってみての感想
 コンパイルが速いのは気持ちいい
 ガベージコレクタのある言語はメ
モリ管理が楽
 PC Linux 上で実験したコードがク
ロスコンパイルして実行ファイル
を 1 個コピーするだけで実機で動
かせる
実際に使ってみての感想 (2)
 標準ライブラリが充実している。
うまく利用してコードを短くでき
る
 検索すると有用な情報がすぐ見つ
かる
 Golang ライブラリや、既存ライブ
ラリの Go binding が豊富
実際につかってみての感想 (3)
 クラッシュしたときのバックト
レースがわかりやすい
 デバッガは不要だった
 標準のプロファイルツールが簡
単に使えた
全般的な感想
 コード量が少なくてすむので見通しが
よい
 早い段階から安定して動かすことがで
きた
 原因不明のトラブルに悩まされるこ
とはなかった
 これからも Golang を積極的に使って
いきたい
次は
 Golang + Buildroot
 Buildroot で最小限の rootfs を作成
 コードは shell script と Golang のみで
 既存ソフトウェアとの連携方法
 CGO
 unix ドメインソケット
 シグナル
Reference
 書籍「プログラミング言語 Go 」
 https://golang.org/
 golang-jp.org/ は情報が古い
 組み込みLinuxでGolangのススメ - Qiita
35
Q & A
@tetsu_koba
Thank you for listening!

More Related Content

組み込みLinuxでのGolangのススメ