共有ライブラリへの依存関係を確認する

BeagleBone と直接関係しませんが、知らなかったのでメモ。

コンパイル時、ダイナミックリンクで実行ファイルを作成した場合に、どの共有ライブラリに依存しているか ldd コマンドを使用して調べることができる。

例えば、以下のような bbb という実行ファイル(中身はただの helloworld プログラム)に対して、

debian@beaglebone:/tmp/tmp.wUMMEnbj8v/cmake-build-debug-bbb$ ll
total 88
drwxr-xr-x 3 debian debian  4096 Feb 23 12:54 .
drwxr-xr-x 5 debian debian  4096 Feb 23 12:53 ..
-rwxr-xr-x 1 debian debian 11100 Feb 23 12:54 bbb ← これ
-rw-r--r-- 1 debian debian  5166 Feb 23 12:53 bbb.cbp
-rw-r--r-- 1 debian debian 41700 Feb 23 12:53 CMakeCache.txt
drwxr-xr-x 5 debian debian  4096 Feb 23 12:54 CMakeFiles
-rw-r--r-- 1 debian debian  1376 Feb 23 12:53 cmake_install.cmake
-rw-r--r-- 1 debian debian  4725 Feb 23 12:53 Makefile

ldd コマンドで依存関係を確認することができる。

debian@beaglebone:/tmp/tmp.wUMMEnbj8v/cmake-build-debug-bbb$ ldd bbb
	linux-vdso.so.1 (0xbed75000)
	libstdc++.so.6 => /usr/lib/arm-linux-gnueabihf/libstdc++.so.6 (0xb6e1e000)
	libm.so.6 => /lib/arm-linux-gnueabihf/libm.so.6 (0xb6da6000)
	libgcc_s.so.1 => /lib/arm-linux-gnueabihf/libgcc_s.so.1 (0xb6d7d000)
	libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6c8f000)
	/lib/ld-linux-armhf.so.3 (0xb6f3c000)

自作プログラムに限らず、実行形式ファイルであれば何でも確認できるので、例えば普段使っているコマンドが突然動かなくなった場合などに、依存している共有ライブラリの存在チェックに使えそう。

(以下は ls コマンドの依存関係を調べた例)

debian@beaglebone:~$ ldd /bin/ls
	linux-vdso.so.1 (0xbed48000)
	libselinux.so.1 => /lib/arm-linux-gnueabihf/libselinux.so.1 (0xb6ee6000)
	libc.so.6 => /lib/arm-linux-gnueabihf/libc.so.6 (0xb6df8000)
	/lib/ld-linux-armhf.so.3 (0xb6f37000)
	libpcre.so.3 => /lib/arm-linux-gnueabihf/libpcre.so.3 (0xb6d99000)
	libdl.so.2 => /lib/arm-linux-gnueabihf/libdl.so.2 (0xb6d86000)
	libpthread.so.0 => /lib/arm-linux-gnueabihf/libpthread.so.0 (0xb6d62000)

指定できるパラメータは以下の通り

debian@beaglebone:~$ ldd --help
Usage: ldd [OPTION]... FILE...
      --help              print this help and exit
      --version           print version information and exit
  -d, --data-relocs       process data relocations
  -r, --function-relocs   process data and function relocations
  -u, --unused            print unused direct dependencies
  -v, --verbose           print all information


PocketBeagle の動作速度をカスタマイズする

まず現在の動作速度および動作モード(ガバナーというらしい)を cpufreq-info コマンドで確認する。

debian@beaglebone:~$ cpufreq-info 
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
  driver: cpufreq-dt
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 300 us.
  hardware limits: 300 MHz - 1000 MHz
  available frequency steps: 300 MHz, 600 MHz, 720 MHz, 800 MHz, 1000 MHz
  available cpufreq governors: conservative, ondemand, userspace, powersave, performance
  current policy: frequency should be within 300 MHz and 1000 MHz.
                  The governor "performance" may decide which speed to use
                  within this range.
  current CPU frequency is 1000 MHz.
  cpufreq stats: 300 MHz:0.00%, 600 MHz:0.00%, 720 MHz:0.00%, 800 MHz:0.00%, 1000 MHz:100.00%

PocketBeagle は 300MHz, 600Mz, 720MHz, 800MHz, 1000MHz で動作可能。 (デフォルトは 1000MHz)

The governor "performance"... とあるので、現在 performance ガバナーで動作している事がわかる。

PocketBeagle でサポートしているガバナーはconservative, ondemand, userspace, powersave, performance の5つ。

debian@beaglebone:~$ cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
conservative ondemand userspace powersave performance

Archlinuxスケーリング governor のページと比較すると、PocketBeagle ではschedutil 以外のガバナーを全てサポートしている。

Exploring BeagleBone: Tools and Techniques for Building with Embedded Linux では、ondemand ガバナーでCPU負荷にしきい値を設定して、しきい値を超えたタイミングでCPUの動作速度を変更する例が記載されていたが、自分の用途では遠隔から手動で動作を切り替える、という手段が望ましい。

試しに動作速度を最低の 300MHz まで落としてみる。

debian@beaglebone:~$ sudo cpufreq-set -f 300MHz
debian@beaglebone:~$ cpufreq-info 
cpufrequtils 008: cpufreq-info (C) Dominik Brodowski 2004-2009
Report errors and bugs to cpufreq@vger.kernel.org, please.
analyzing CPU 0:
  driver: cpufreq-dt
  CPUs which run at the same hardware frequency: 0
  CPUs which need to have their frequency coordinated by software: 0
  maximum transition latency: 300 us.
  hardware limits: 300 MHz - 1000 MHz
  available frequency steps: 300 MHz, 600 MHz, 720 MHz, 800 MHz, 1000 MHz
  available cpufreq governors: conservative, ondemand, userspace, powersave, performance
  current policy: frequency should be within 300 MHz and 1000 MHz.
                  The governor "userspace" may decide which speed to use
                  within this range.
  current CPU frequency is 300 MHz.
  cpufreq stats: 300 MHz:2.43%, 600 MHz:9.19%, 720 MHz:0.00%, 800 MHz:0.00%, 1000 MHz:88.38%  (26)

簡単に動作速度を変更できた。
組み込み用途でスタンバイ中に消費電力を抑えるのに使えそうだ。

なお、起動時にデフォルトで選択されるガバナーはperformance
これを変更したい場合は、起動スクリプトを直接編集するしかないようだ。

debian@beaglebone:~$ sudo grep -B20 -A2 -e "^GOVERNOR=" /etc/init.d/cpufrequtils 

# Which governor to use. Must be one of the governors listed in:
#   cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_governors
#
# and which limits to set. Both MIN_SPEED and MAX_SPEED must be values
# listed in:
#   cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
# a value of 0 for any of the two variables will disabling the use of 
# that limit variable.
#
# WARNING: the correct kernel module must already be loaded or compiled in.
# 
# Set ENABLE to "true" to let the script run at boot time.
# 
# eg:	ENABLE="true"
#	GOVERNOR="performance"
#	MAX_SPEED=1000
#	MIN_SPEED=500

ENABLE="true"
GOVERNOR="performance"
MAX_SPEED="0"
MIN_SPEED="0"

ガバナーの考え方は、Redhat のドキュメントが分かりやすかった。

※ もし cpufreq-info コマンドがインストールされていない場合は apt install で取ってくる。 (自分の環境では既にインストールされていた)

debian@beaglebone:~$ sudo apt install cpufrequtils
[sudo] password for debian: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
cpufrequtils is already the newest version (008-1+b1).
0 upgraded, 0 newly installed, 0 to remove and 15 not upgraded.

BeagleBone Black (BBB) と PocketBeagle の比較

色々先走って書き出してしまいましたが BeagleBone Black (BBB) と PocketBeagle の比較表ぐらいは必要だろうと作成してみました。

表レイアウトが微妙なのは筆者のスキル不足です。

モデルBeagleBone Black (BBB)PocketBeagle
価格
$55$25
プロセッサ1GHz AM335x x 1
32bit RPUs x 2
1GHz AM335x x 1
32bit RPUs x 2
メモリ
512MB DDR3512MB DDR3
ストレージ4GB eMMC

MicroSD スロット
MicroSD スロット
映像出力micro-HDMIなし
デバッグJTAGJTAG
インターフェース
46pin GPIO x 236pin GPIO x 2
ネットワーク10/100 Ethernetなし
無線LANなしなし
電源USB経由 または DCジャック (5.5mm)USB経由またはGPIOヘッダ

ご覧のとおり、インターフェースには明確な差異があるものの、プロセッサとメモリ構成は、実は BBB と PocketBeagle で同じなんですね。

小さい=非力ではないので、アプリケーションの構成によってはPocketBeagleでも BBB と同等の性能を発揮できそうです。これは嬉しい。

ですので、BBB と PocketBeagle どちらを選ぶかは、性能ではなくユーザの利用目的で選べばいいと思います。Raspberry Pi 的な使い方をしたい人は BBB、Arudino や mbed マイコン的な組み込みに近い用途で開発をしたい人は PocketBeagle という感じでしょうか。

でも、ラズパイ的な使い方したい人はラズパイ買っちゃうだろうから、結局 BBB の認知度はちっとも上がらないんですよね。。。

オチがついたところで今日はここまで。

BeagleBoneのGPIO最大電流は4-6mA

タイトルそのまんまなんですが。結構少ないなという印象です。

GPIO 接続で電流を消費するデバイスと言われて思い浮かぶのは LED なんですが、よくある感じの LED でも標準電流 20mA なので、定格オーバーしないように注意が必要です。(BeagleBone に限った話ではないですが)

ちなみに少し調べてみると、マイコン別の最大電流は Arduino Uno で 10-20 mA、mbed リファレンス機である LPC1768 で45-50mA でした。Raspberry Pi でも 17mA なので、他家と比べても控えめですね。

BeagleBone のデータシートはこちらからどうぞ。

Beaglebone de RTOS

BeagleBone デバイスを使ったリアルタイム OS (RTOS) 開発について学習しています。BeagleBone は Linuxリソースを活用したパワフルな処理系と、センサ系コントロールに求められるリアルアイム処理系を並行利用できる画期的なマイコンです。

BeagleBone シリーズの中で、特に PocketBeagle (PB) について調べています。PocketBeagle は大雑把に言えば、標準機である BeagleBone Black (BBB) から内蔵メモリとディスプレイ出力、それにネットワーク機能を省略したものになります。

といっても、microSD カードをストレージとして使用できますし、USB 経由で母艦 PC と接続すれば SSH でログインしたり、インターネットに接続することもできます。それ以外の機能は BBB と「ほぼ」同等ですので、筆者のように組み込み用途で利用する方には PocketBeagle がオススメです。サイズも価格も半分以下ですし。

とはいえ、いきなり PocketBeagle からスタートするのはさすがに躊躇しました。何せ BeagleBone 自体の情報が少ないのと、事例の殆どが BBB を使用したものばかりだったからです。さらに本命の RTOS の仕様についても、バージョンによって大分異なるという情報を見かけ、これは厳しいかな…と思っていました。

転機は2019年1月に発売された Exploring BeagleBone: Tools and Techniques for Building with Embedded Linux という本でした。これは2014年に出版された初版の改訂版で、最新の BeagleBone シリーズへの対応を謳っています。全てのソースコードについて BBB と PocketBeagle でテスト済み、かつ PRU-ICSS (RTOSを実現するためのアーキテクチャ) 部分については完全に書き直したとのこと。

著者の Derek Molloy 氏は Dublin City University の助教授で、平易な文章とアカデミックな章立てが非常にわかり易く、この本読んでも使いこなせないなら BeagleBone を諦めよう、と思わせてくれる構成になっています。とはいえ洋書ですし、ボリュームもあるので万人受けはしないと思いますが、少なくとも筆者にはコレハ!と思わせてくれる一冊でした。

2019年の1月半ばにアマゾンでポチり、途中くじけつつ、仕事に追われつつ、今も現在進行系で読み進めているところです。少しずつになると思いますが、有用な見つかれば随時更新します。

なお「有用な」の基準は、当時の筆者のスキルレベルとなっておりますので、そのあたりも含めて生暖かく見守って頂けたらと思います。m(_ _)m