見出し画像

Pythonと組込み開発

組込系の開発において、主流の言語はCです。 Linuxを使用する場合はC++も使われますが、小規模な組込アプリでは圧倒的にCが多いようです。
私はポリテク浜松ではRaspberryPiでPythonを教えていますが、組込関係の仕事においてターゲットに組込むアプリでPythonを使ったケースはほとんどありません。 (以前の組込みLinuxではルートファイルシステムにPythonをインストールすること自体稀でした)

Pythonが組込み開発で使用されることが少なかった理由としては以下のことが挙げられます。
① そもそもPythonが使えない
  ルートファイルシステムに含まれていない。
  (ルートファイルシステムのビルドまでしないで、組込みLinuxを使用して
  いるケースも多い)
② Pythonの実行速度が遅い
  C言語などのコンパイラ系の言語に比べると1桁以上遅くなる。
③ Pythonのバージョンの問題
  Pythonで使用する予定のライブラリに対応するPythonバージョンが提供され
  ていない。
④ メモリが少ないため、Pythonを使用できない。
  小規模な組込みLinuxでは、メモリによる制約上Pythonを実装することが
  困難である。
⑤ Pythonを知ってるプログラマが居ない。
  簡単なプログラムならいちいちPythonを覚えるより、C言語で書いたほうが
  速い。
⑥ スクリプト系言語について、信用してない開発者が居る。
  過去にガーベージコレクションなどで、苦労した上司などがPythonの採用に
  ついて難色を示すことがあります。
  (私が昔Tandy Radio Shackを使ったとき、ガーベージコレクションで
  十数分以上フリーズしてた)

 以前からBuildrootやyoctoでPythonをビルドすることはできました。 しかし最近のPythonブームで書籍に紹介されているサンプルを動かそうとすると、組込みボードメーカから提供されるbuildroot,yoctoなどではPythonのバージョンが古くてサンプルさえも動かないなんてこともありました。

 以前よりは組込Linuxの環境も変わってきてます。 AI系の機能を実装する場合はハードから、組込みLinuxまでそれを前提として構成を考えるでしょう。ここでは、普通の組込LinuxアプリにおけるPythonにつて説明していきます。

 まず、Pythonを使うとなるとルートファイルシステム、およびRAMはそれなりの余裕が必要となります。RaspberryPiのようにmicroSDやeMMCを使用する場合は、問題ないですが、RAMファイルシステムなどを使用する場合は充分検討が必要となります。 したがって、どちらかと言うとコストを抑えた最小スペックの組込みLinuxではPythonの採用は難しいと思われます。

 次に速度の問題です。 はっきり言って速度はかなり遅いです。
 でも、一日に一回しか実行しないアプリがあるとします。Pythonで実行すると100msecかかったとします。C言語なら数msecで終わるでしょう。でも、このようなケースでC言語の優位性はあるでしょうか?
 逆に、100msec毎に制御処理をするアプリが在るとします。C言語ではその処理に数msecかかるとします。同じ処理をPythonで実装したら100msecかかるとしたら、この処理にPythonを使用することは無いでしょう。
 GUIアプリにおいても、ツールキット層はQtやGTKなどを使用しますので、その部分の速度はどの言語を使おうと変わりないですが、自分がコーディングする部分において複雑な処理をすると、体感的な応答はすごく悪くなるケースもあります。私が関わった仕事ではコンパイラ系の言語を使っても遅いと言われるケースもありましたので、このようなケースでは致命的です。


 組込み(ベアメタル)から、組込みLinuxに入ってきたエンジニアの人はなんでもかんでもC言語で作成する傾向があります。 組込み、UNIXほぼ同時期に始めた私は、簡単な処理はフィルタやawkなどをよく使用します。 Pythonが使えれば、もっと複雑な処理について態々C言語を使用する必要がなくなります。
 メインの処理をするアプリは別として、管理系、保守系のアプリにはPythonは充分使用できます。

 さて、メイン系のアプリについてです。
 メイン系のアプリでPythonを使用するケースが少ない理由は、実行速度が遅い点と、応答速度についての不安が在るからです。 
 実行速度を上げるにはCPUのスペックを上げたりするなどもありますがコストアップ要因となります。 またリアルタイムOSではないにしろ、多くの組込みLinuxシステムではある程度の時間内での応答が要求されますが、Pythonでは安定的にその時間内に応答できるかどうか不安がつきまとうからです。
 GUIアプリについても、自分で処理するコードに重いものがなければPythoでも十分対応できる場合も多いです。

メイン系のアプリにPythonを使用してみたい人は、MicroPythonを検討してみるのはいかがでしょう。

Buildrootでのmicropython選択

スクリーンショット 2020-10-30 15-59-43

 Pythonを使用することについて、難色を示す古いタイプのエンジニアの問題ですが、未だに組込みLinuxの場合は別世界だと思いこんでいる人もいます。
 少しずつPythonの良さを理解してもらうしか無いようです。 組込みLinuxにおいてPythonのほうが向いてる用途も色々あります。

参考までに速度比較を… 

Pythonのスクリプト(hello.py)

#! /usr/bin/env /usr/bin/python3

print( 'Hello, World' )

実行

$ chmod a+x hello.py
$ time ./hello.py
Hello, World!

real	0m0.043s
user	0m0.023s
sys	0m0.004s
$ time ./hello.py
Hello, World!

real	0m0.024s
user	0m0.019s
sys	0m0.005s

Pascalのスクリプト(hello)

#! /usr/bin/env /usr/bin/instantfpc

begin
  writeln('Hello, World')
end.

実行

$ chmod a+x hello
$ time ./hello
Hello, World

real	0m0.067s
user	0m0.050s
sys	0m0.015s
$ time ./hello
Hello, World

real	0m0.002s
user	0m0.002s
sys	0m0.000s

 fpc(instantfpc)では、一回目の実行はコンパイルしますので、Pythonより1.5倍程度遅くなっています。2回目以降の実行ではPythonより12倍程度高速になっています。
 ここでは、シェルあるいはC言語のアプリなどから呼び出されることを前提として実行時間を測定してみました。 起動時にPythonを起動し、常駐しているアプリの特定機能の実行時間の測定にはtimeitなどで評価します。

おまけ画像、ハロウィンだからね。

画像2





この記事が気に入ったらサポートをしてみませんか?