組み込みLinuxをArmボードで動かしてみよう!

組み込みLinuxとは

実験室室長の浦邉です。今回新たにお届けする初心者講座は、APSにもこれまでリクエストが多かった「組み込みLinux編」です。組み込みLinuxというと、インストールから始まって…というところもありますが、APSの初心者講座では、その部分はベンダーさんのLinuxサイトを見てもらうことにして、もう一歩進んだ「組み込みシステムのアプリケーションを組むために必要な講座」を連載していきます。

しかしながら!ワタクシそんなにLinuxに精通している訳ではないので、今回の連載のために超強力な助っ人をお願いしています。富士通コンピュータテクノロジーズの「てっぺいちゃん」こと浅羽鉄平さんにご協力いただきます。てっぺいちゃんは、組み込みLinuxのカリスマ的存在!Linux入門者が組み込みシステムを作らなければいけないことを想定して、講座の連載をお願いします!と伝えていますので、大丈夫でしょう!

また、LinuxのアプリはPCベースでやっていたけど、組み込みは初めてという方も多いと思います。組み込みシステムの多くは、24時間365日フル稼働しなければいけなかったり、電源ON時にコマンド操作なしにアプリを起動するとか、何もしていない時はパワーセーブをするなど、PCとは異なった環境での動作を要求されます。PCベースでは見えにくい要求に応えていくための組み込みLinuxが理解できれば、より一層の低省電力・省スペースの提案も可能になります。

Raspberry Piの登場をきっかけに、初心者の方にも組み込みLinuxがより一層身近になりました。今回のこの講座を活かして、より多くの方に組み込みLinuxを使う上での基礎技術を学んでもらえればと思っています。

Linuxとは

Linuxの概要

Linuxはスーパー コンピュータ、サーバからスマートフォンや組み込みシステムまで多くのデバイスで使われているOSです。細かく説明すると長くなってしまうので、もっと詳しく知りたい人は、ここを読んでね!

Linuxカーネルを開発しているのは誰?

1991年に初めてリリースされたLinuxカーネルは、Linus Torvaldsが1人で開発しましたが、今では1,500人以上の開発者で開発しています。細かく説明すると長くなってしまうので、もっと詳しく知りたい人は、ここを読んでね!

この一年でLinuxカーネルを書いていたのは?

この一年でLinuxカーネルへソースコードを書いた人を所属別にランク化した表を見ると、Red HatやNovellのようなエンタープライズ向けLinuxディストリビューターの他にチップベンダーが目立っています。LinuxカーネルはCPUに依存する処理やデバイスドライバー等を含むため、チップベンダーが開発に大きく関与しているのです。組織を特定できる20位以内の所属でチップベンダーとそれ以外を比較すると、約80%がチップベンダーであることがわかります。さらに、チップベンダーのうち、IntelとARM系ベンダーを比較すると、ARM系が約60%であることがわかります。ARMは周辺デバイスはベンダー毎に異なるのが理由のひとつです。(今回の表とグラフは個人的に調べたものなので、細かい数値が気になる方は調べてみてね!)

Linuxカーネルへソースコードを書いた人(2015.8.1-2016.7.31の統計)
順位 組織 修正パッチの数 全体に占める割合
1 None 10056 14.3%
2 Intel 8356 11.9%
3 Red Hat 3703 5.3%
4 Linaro 3139 4.5%
5 Samsung 2277 3.2%
6 Novell 1863 2.6%
7 IBM 1681 2.4%
8 AMD 1578 2.2%
9 Texas Instruments 1183 1.7%
10 ARM 1103 1.6%
11 Atmel 1090 1.5%
12 Oracle 1037 1.5%
13 Google 838 1.2%
14 Nvidia 830 1.2%
15 Free Electrons 797 1.1%
16 Huawei Technologies 748 1.1%
17 Vision Engraving & Routing Systems 687 1.0%
18 Broadcom 583 0.8%
19 Freescale 549 0.8%
20 Renesas 544 0.8%
図1

Linuxが動くCPUは?

x86、PowerPC、MIPS、ARM、Nios IIなど、ARMはMMUがあるCortex-Aシリーズ、ARM1176、ARM926などで動作。MMUがないCortex-Mシリーズでも動作する実装はあるが、外付けメモリが必要だったり、動作上の制限も多い。

Linuxはどんなところで使われている?

IAサーバ、Androidスマートフォン/タブレット、デジタルTV、デジタル カメラ、プリンター、スキャナー、カーナビなど

Linuxを採用するメリットは?

  • ●新しいデバイスへの対応、プロトコルスタックの対応が早いので、標準化された機能に対応する場合、コスト・開発期間・品質のアドバンテージがある。
  • ●多くのCPUに対応しているので、マルチベンダー化しやすい。
  • ●オープンソースなので、OSベンダーにロックオンされることもない。
  • ●アプリケーションはC以外にJava, Python等でも書けるので組み込み以外のエンジニアにも馴染みやすい。

組み込みLinuxとARMボードで遊んでみよう!

今回は第一回目ということで、LinuxとARMボードを使って軽く遊んでみたいと思います。ATLASを起動し、コマンドラインを使ってLチカやプッシュボタンを押してみたり、ネットワークやSSH、VNCへ接続したり、といった内容を以下の動画でご覧ください。動画内で使用するコマンドは、以下にサンプルコードを用意していますので、是非試してみてくださいね!

コマンドラインからLチカ

									root@atlas_sockit:~# cd /sys/class/leds/          
									root@atlas_sockit:/sys/class/leds# ls
									fpga_led0  fpga_led2  fpga_led4  fpga_led6  hps_led0
									fpga_led1  fpga_led3  fpga_led5  fpga_led7
									root@atlas_sockit:/sys/class/leds# cd fpga_led0/
									root@atlas_sockit:/sys/class/leds/fpga_led0# ls
									brightness      delay_on        max_brightness  subsystem       uevent
									delay_off       device          power           trigger
									root@atlas_sockit:/sys/class/leds/fpga_led0# echo 255 > brightness 
									root@atlas_sockit:/sys/class/leds/fpga_led0# echo timer > trigger 
									root@atlas_sockit:/sys/class/leds/fpga_led0# 
								

プッシュボタンを押してみよう!

									root@atlas_sockit:~# cd /sys/class/gpio/
									root@atlas_sockit:/sys/class/gpio# ls
									export       gpiochip413  gpiochip415  gpiochip419  gpiochip427  gpiochip454  gpiochip483  unexport
									root@atlas_sockit:/sys/class/gpio# echo 479 > export 
									root@atlas_sockit:/sys/class/gpio# ls     
									export       gpiochip413  gpiochip419  gpiochip454  unexport
									gpio479      gpiochip415  gpiochip427  gpiochip483
									root@atlas_sockit:/sys/class/gpio# cd gpio479/
									root@atlas_sockit:/sys/class/gpio/gpio479# ls
									active_low  device      direction   edge        power       subsystem   uevent      value
									root@atlas_sockit:/sys/class/gpio/gpio479# cat direction 
									in
									root@atlas_sockit:/sys/class/gpio/gpio479# cat value 
									1
									root@atlas_sockit:/sys/class/gpio/gpio479# cat value 
									0
									root@atlas_sockit:/sys/class/gpio/gpio479# cat value 
									1
									root@atlas_sockit:/sys/class/gpio/gpio479# echo 1 > active_low 
									root@atlas_sockit:/sys/class/gpio/gpio479# cat value 
									0
									root@atlas_sockit:/sys/class/gpio/gpio479# cat value 
									1
									root@atlas_sockit:/sys/class/gpio/gpio479# cat value 
									0