組み込みLinuxの学習
突然ですが、長年勤めた現職を今年いっぱいで退職し、転職することになりました!
転職先はIoT関連のメーカーで、今までと同様、組み込みエンジニアとしてお仕事をさせていただくことになりました。
お話を伺っていると、新しい職場では、RTOSを使用したベアメタルな機器に加え、組み込みLinuxのお仕事も多いとのこと。
私自身、今まで、このブログで取り上げているようなRTOSを使用した機器の開発がメインでしたが、実は組み込みLinuxを使用した機器の開発経験もあります。
ただし、数年のブランクが空いています。
人間、使わない知識はどんどん忘れていきますし(歳のせいとも言う)、時間の流れが速いLinuxなどのオープンソースの世界においては、この数年のブランクが命取り!
転職後に即戦力となれるように、今一度(現在の)組み込みLinuxを学習してみたいと思いました。
「pcDuino3」とは?
米国LinkSprite社の「pcDuino3」というARMのシングルボード・コンピュータです。
組み込みLinuxを学ぶ(…というより思い出す)ためには、ターゲットを弄りながら進めていくのが一番。
というわけで、かつて組み込みLinuxでの開発を行っていた時に買ったまま放置していたコイツを引っ張り出してきました。
秋月電子商会さんでは、まだ取り扱っています。
ディスコン(製造中止)ですが、在庫は潤沢のようです。
発売は2014年とのことで、もう10年近く昔の製品です。
しかし、1GHzで動作する「ARM Cortex-A7」のデュアルコアというスペックは、組み込み機器として考えた場合は、まだまだ十分使える性能です。
ちなみに、CPUは中国製の激安SoC「Allwinner A20」です。
一時期は、民生の格安タブレットなどで相当数使われていたとか…。
この手のLinuxが動作するようなシングルボード・コンピュータでは、なんといっても「Raspberry Pi」シリーズが有名ですよね。
一方で、この「pcDuino」シリーズの最大の特徴は、有名な学習用マイコンボードである「Arduino」と同じピン配のピンソケットを実装していることでしょう。
ハードウェアも作るような人は、この「Arduino」用のユニバーサルボードや、ピンソケットの入手性が良いので、オリジナルのシールドが作りやすく、電子工作好きの方々からは好評だったようです。
私も仕事で試作品を作るときには「Arduino」をよく使いますし、オリジナルのシールドを作るために、こういったパーツは使い慣れています。
ただし、既存の「Arduino」用のシールドがそのまま使えるか?というと、そこまでの互換性はないようです。
第一、電源が違います(「pcDuino」は3.3Vのみ)ので、既存のシールドは接続しないように注意してください。
さて、この「pcDuino3」を使用して「Node.js」をインストールして「TypeScript」などを使って、IoTゲートウェイのようなものを作ろうと思いました。
いわゆる今風のナウい組み込みLinuxの使い方ですよね~。
そこで、気になるのはデフォルトでインストールされているLinuxのバージョンです。
前述のように、10年近く昔の製品。
あまり古いバージョンのLinuxディストリビューションだと、最新のアプリケーションが動きません。
確認のために、数年ぶりに「pcDuino3」に電源を投入しました。
HDMIコネクタをLCDに繋いで、操作のためのキーボードやマウスをUSBのAコネクタに接続します。
(USBのAコネクタは一つしかありませんから、キーボードとマウスを同時に使用する場合は、USBハブを使いましょう。)
最後に、USBのMicro-Bコネクタから電源を供給してあげれば準備完了です。
しばらくすると、デスクトップが立ち上がります。
「pcDuino3」には、マイクロSDカードのスロットを搭載しています。
しかし、今はこのスロットにはマイクロSDカードが入っていませんので、OSは内蔵のNANDフラッシュから起動しています。
アプリケーションは、最小限ですが「Chromium」を搭載しているのはスゴい。
そうそう、こんな感じだったなぁ…。
ターミナルを開いて各種バーションを確認します。
以下のように入力します。
$ uname -a
カーネルは「3.4.79」!
やはり相当古い…。
今や「6.x.x」とかの時代ですから。
ディストリビューションは「Ubuntu」ですか。
念のため、ディストリビューションの詳細を確認します。
以下のように入力してみます。
$ lsb_release -a
Linaroによる「12.07」ですか。
Ubuntuなので「apt install」コマンドでアプリケーションの追加は可能ですが、カーネルもディストリビューションも古いですね。
これでは、最新の開発環境を使った開発は難しいかもしれません。
さて、どうしたものか…。
そこで「Yocto Project」です!!
「Yocto Project」とは?
詳しくは、こちらを参照してください。
要するに、カスタムのLinuxディストリビューションを作れてしまうフレームワークです。
Linuxディストリビューションを作るには、Linuxの3種の神器「ブートローダ」、「カーネル」、「rootファイルシステム」が必要です。
昔は、これらのそれぞれソースコードを入手して、コンパイラを準備して、ビルドして…という作業が必要でした。
特に「rootファイルシステム」なんかは、ソフトウェアの数が膨大なので、大変な労力を要します。
しかも、それぞれを関連付けるための設定ファイルの作成やら、変更やらで、やっと終わったと思ったらカーネルパニックを起こして起動しなかったりで、もう…やってられるかっ!!…の繰り返しです。
二度とやりたくないです。
そのような煩雑な作業すべてを簡単にやってくれるツールとして「Yocto Project」が登場しました。
他にも、同様の思想のフレームワークには「Buildroot」というものが存在します。
この手のフレームワークでは「Yocto Project」と「Buildroot」が、二大勢力ですが…
●細かいカスタマイズが可能だが、使うのが難しい「Yocto Project」
●使うのが簡単だけど、細かいカスタマイズが難しい「Buildroot」
という、アベコベの関係にあります。
しかしながら、紆余曲折あって現在は「Yocto Project」がスタンダードです。
組み込みエンジニアにとって、今や「Yocto Project」を扱うことは必須であるといっても過言ではありません。
この「Yocto Project」を使って「pcDuino3」用の最新のカーネルを含むディストリビューションを作ろう!と思います。
IoTゲートウェイを作ろうとしているので、最悪GUIは要りませんが、最低限のセキュリティの担保と、最新の開発環境が使えるだけのディストリビューションを目指したいと思います。
次回から、早速「Yocto Project」による開発環境を揃えていきます。
<続く>…といいですけどね、ボードも古いし、色々忘れちゃってるから…。