ページ更新: 2016-06-22 (水) (513日前)

関連: 組み込み/NVIDIA Jetson

(2015-02-10 新規作成)

Raspberry Pi 2 Model B についてのメモ。

(既存の PC/RaspberryPi ページは、このページに順次統合する)

目次

[編集]

情報源 #

[編集]

Raspberry Pi #

[編集]

Raspberry Pi 3 #

[編集]

Raspberry Pi 2 #

[編集]

Raspberry Pi #

[編集]

BCM2835/BCM2836, LAN9514, GPIO, SPI, I2C, UART #

BCM2835 SoC:

BCM2836 SoC:

LAN9514:

GPIO:

I2C bug:

etc:

[編集]

Raspbian #

2015-04-16 時点では、日本のミラーサイトには以下のファイルがある。

ISOイメージ:

パッケージ:

2015-04-15 ためしに以下の設定にして、どちらら片方を有効にしてしばらく様子を見てみる。 /etc/apt/sources.list

#deb http://ftp.yz.yamagata-u.ac.jp/pub/linux/raspbian/raspbian/ wheezy main contrib non-free rpi
#deb http://ftp.jaist.ac.jp/raspbian/ wheezy main contrib non-free rpi
[編集]

MINIBIAN (2016-02-01) #

[編集]

Ubuntu (2015-02-27) #

[編集]

Windows 10 IoT Core #

[編集]

RaspBSD #

[編集]

TOPPERS/ssp #

[編集]

μT-Kernel for Raspberry Pi #

μT-Kernel for Raspberry Pi おぼえがき (2012-11-06/13):

[編集]

ARM #

[編集]

Cortex-A53 (Raspberry Pi 3) (未調査) #

[編集]

Cortex-A7 (Raspberry Pi 2) #

[編集]

ARM1176JZFS (Raspberry Pi 1) #

[編集]

拡張ボード #

端子の早見表:

GPIOを引き出す (GPIO Breakout):

いろいろ:

拡張ボード HAT (Hardware Attached on Top) 規格:

[編集]

書籍 #

[編集]

BareMetalで遊ぶRaspberry Pi #

注意点:

  • Raspberry Pi 1 Type B を対象としている。ただし、「付録 D Raspberry Pi Type B+ への対応状況について」がある。
[編集]

Raspberry Piで学ぶ電子工作 #

[編集]

制作記事 #

[編集]

その他 #

[編集]

失敗メモ #

解決済み:

  • 2015-04-13 シリアルUSBコンバータを繋ぐとき、Raspberry Pi 側のGNDに繋ぐべき線を GPIO 4 に繋いでシリアルコンソールを使ったら、中途半端に文字化けした。信号レベルが不安定になったのだろう。
  • 2015-04-13 /etc/rc.local を修正したとき、間違って #! を2つ書いてしまい(#!#!と書いた)、起動時に以下のエラーが出てた。
    /etc/init.d/rc.local: 22: /etc/init.d/rc.local: /etc/rc.local: not found
  • I2C を有効にするとき、rpi-config の設定以外に /etc/modules に i2c-dev の追加が必要なことを知らなかった。raspi-config の設定だけで良いかと思っていた。
  • Raspberry Pi 2 Model B を 2015-02-07 に入手したのだが、Raspbian 2015-02-16 版 (Release Note) がでるまで、いろいろとはまった。

未解決、未着手:

  • SPI。シリアルSRAMモジュール 23K256 を壊しちゃったらしい (GNDを繋いでるのに信号レベルが安定しない) ので、しばらく手を付けてない。SRAM チップは入手済みでmbed Nucleo F411,L152ではちゃんと動いてるのだが、Raspberry Piで試すのがおっくう。あと EEPROM も入手しているが、試していない。
  • I2C の照度センサーを試してない。mbed でも割と面倒だったので。I2C の EEPROM も入手済みだが試していない。こちらも mbed で使う方が役に立つし。
[編集]

メモ #

[編集]

DSI (Display Serial Interface) #

[編集]

Raspberry Pi 7" Touch Screen LCD (2015-09-28) #

7インチLCDタッチパネル。DPI-DSI 変換ボード付き。

ディスプレイ変換ボードに載っているIC

組み立て手順。なお、RSコンポーネントから入手したので、箱は白箱で、マニュアルは付属せず。

(1) ディスプレイ変換ボードのPANEL 2コネクタの黒い部品を引いて、LCDのケーブルを差し込んで、黒い部品を元に戻す:

LCD7-PANEL_2.jpg LOD7-Interface-Board.jpg

(2) ディスプレイ変換ボードのPANEL 1コネクタを茶色の部品を引いて、LCDのケーブルを差し込んで、茶色の部品を元に戻す:

LCD7-PANEL_1.jpg

(3) ディスプレイ変換ボードのRPI-DISPLAYコネクタの黒い部品を引いて、ケーブルを差し込んで、黒い部品を元に戻す:

LCD7-Interface-Board-DSI.jpg

(4) LCDの裏にディスプレイ変換ボードを置き、スペーサー4本でねじ留めする。スペーサーを回すためにナットドライバー(5mm)を用いた。PC用マザーボードと同じ径だった:

LCD7-Interface-Board-With-Spacer.jpg LCD7-nut-driver-5mm.jpg

スペーサーのねじ径は2.5〜2.6mmくらい。長さは12mmだが、7〜8mmくらいでも良さそう。

(5) Raspberry Piをスペーサーの上に置き、ねじ留めする:

LCD7-RPi.jpg

(6) Raspberry PiのDISPLAYコネクタの白い部品を引いて、ケーブルを差し込んで、白い部品を元に戻す:

LCD7-DSI-Open.jpg LCD7-Rpi-DSI-Close.jpg

(7) ディスプレイ変換ボードの 5V出力とGNDを、付属のジャンパーケーブル赤・黒で Raspberry Pi の GPIO の 5VとGNDに接続する (ディスプレイ変換ボードをRaspberry Piの電源として用いる):

LCD7-Power-5V-GND.jpg

代わりに、ディスプレイ変換ボードのPWR OUT (USB-A) と Raspberry PiのPWR IN (microUSB) を繋いでもよい。

LCD7-Power-USB.jpg

(8) 電源を投入した。Raspberry Pi 2 Model B, WiFi, LCD。電圧4.80V、電流 0.76A。ちょっと電圧が低い。

LCD7-Console.jpg LCD7-X.jpg LCD7-WiFi-VA.jpg

[編集]

拡張基板 #

[編集]

UUGear Witty Pi (2015-09-13) #

UUGear Witty Pi は、Raspberry Pi を普通のPCのように、スイッチで起動、スイッチやコマンドで「シャットダウン」出来るようにする拡張ボード。また、タイマーで電源on/offもできるようになる。

UUGear (チェコ共和国、プラハ) から直接注文した。安いしWebサイトのshopの出来がよかったので。2015-09-13 注文(在庫無し)、2015-09-22 出荷、2015-09-27 日本着、2015-09-29 配達担当郵便局に到着。船便扱いのはずなのでシベリア鉄道経由かな?

特徴:

  • Raspberry Pi A+/B+/2 用の拡張ボード。
  • 価格 380.00 CZK + 送料 100.00 CZK (CZK = チェコ コルナ)
  • 電源はこのボードに接続し、Raspberry Piにはヘッダピンで供給される。
  • 電源on/offボタン
  • リアルタイムクロック バッテリバックアップ付き
  • タイマーで電源On, シャットダウン。
  • 制御には I2C を用いる。インストールスクリプト installWittyPi.sh が i2c-tools, WiringPi (GPIO,I2Cライブラリ) をインストールする。
  • シャットダウン(HALT)に用いるGPIOのポートは変更できるようだ。ジャンパ + ソフトウェアで設定変更らしい。
  • 電源が供給されたときに、起動するかどうかジャンパで選べるかも。これがあればUPSに繋いで、停電から復帰したときに自動的に起動するはず。

情報源:

メモ

Witty Pi, 付属品:

WittyPi.jpg

付属のスペーサーを付けてWitty Piを接続した。電源は Witty Piから ピンヘッダを介してRaspberry Piに供給される:

WittyPi-Rpi.jpg

RSコンポーネントのケースの底だけを用いた。スペーサーを立てるとケースと干渉するので、ケースを削った:

WittyPiSpacerCase1.jpg WittyPiSpacerCase2.jpg

Witty Pi は2つ入手したので、もう一台は7inchタッチスクリーンLCDと繋ぐ。LCDの電源もWitty Piのピンヘッダから供給できた:

WittyPiLCD71.jpg

2段重ねだとスペーサー付属のネジを使えないので、スペーサーなしで使用中:

WittyPiLCD72.jpg WittyPiLCD73.jpg

マニュアルによると、ソフトウェアなしでもボタンでの起動とshutdown -hでの電源Offは動作するとのこと。

2015-10-04

不具合(1) 2台の Witty Pi のうち、1台が不調。問題:起動後数分で勝手にシャットダウンされることがある。1回発生すると、5回程度繰り返しても同じ。しかし一度発生しなくなると、5回繰り返しても発生しない。

  • Witty Pi のソフトウェア (GPIO 4 を見て、fall edge でシャットダウン処理を開始する) をインストールした後、意図しないタイミングでシャットダウンされることがある。 Witty Pi がシャットダウンに使う GP4 ジャンパ (GPIO 4) を無効 (CUSTOMに切替) にすると発生しないので、GP4 の信号レベルが不安定なようだ。
  • Raspberry Pi と Witty Piを繋いだ後、オシロスコープでヘッダピンの7番(GPIO 4) と9番(GND)の間の電圧波形を観測した。
    • GP4 jumper を抜いたとき、3.3V
    • GP4 jumper を指したとき、2.280V
    • Witty Pi の電源ボタンを押すと、2.280V だが、しばらく(数十秒くらい) は、たまに 1.240V くらいまでパルス状に下がる。
    • トリガーを fall edge, 1.320V にしたところ、10〜50usの幅で1.200Vまで電圧が低下する。また、これが130ms程度の時間、繰り替えされる。 このどこかでLowレベル(不明だが0.8Vくらい?) に達してGPIO 4がLOWになり、シャットダウンが開始される。もしかすると、電源On直後のパルスと同じ?
[編集]

LCD, SW, LED 基板 (作成中) (2015-05-31) #

(作成中)

LCD(16桁2行), USBシリアル, タクトスイッチ (シャットダウン用), 電源LED, GPIO制御LED を載せた基板を、Raspberry Pi 2 の上に載せられる大きさで作る。

LCDには通常はIPアドレスを表示したい。起動、シャットダウン、再起動のときはその旨を表示したい。

USBシリアルは必要なときだけ取り付けるのでピンソケットを付ける。LCDもピンソケットを介して載せるかも。

40ピンケーブルも接続できるようにする。また、基板は複数枚、積み重ねられるようにしたい。

できれば、ケースに入れても使えるものも作りたい。

パーツ:

配線図:

  • 部品は表に配置し、配線はJ1側のスルーホールにはんだブリッジや電線で裏側へ回す。

    raspi-hat-lcd_board.png

仮組み: 連結ピンソケット 2×20(40P) と 両面スルホール・ガラス・ユニバーサル基板 Cタイプ:

raspi-hat-lcd-001.jpg raspi-hat-lcd-005.jpg

仮組み: 連結ピンソケット 2×20(40P), 基板, LCD, タクトスイッチ, USBシリアル, リボンケーブル:

raspi-hat-lcd-002.jpg raspi-hat-lcd-003.jpg

仮組み: ケースの上に載せてみた。基板が若干大きい:

raspi-hat-lcd-004.jpg

仮組み: ケースに入るように基板をカットした。ランドの個数は20×17個。連結ピンソケットがケース上面からはみ出るので蓋を閉めるのはあきらめた:

raspi-hat-lcd-006.jpg raspi-hat-lcd-007.jpg

[編集]

GPIO エクステンションボード (2015-04-30) #

ブレッドボードをとっかえひっかえするときに便利かもと思って購入した。

情報源:

1. ラズベリーパイB+/A+用ブレッドボード接続キット - 秋月電子通商

  • Raspberry Pi Model B+, A+, Raspberry Pi 2 Model B 用。
  • シルク印刷は「AE-RBPI-BOB40」
  • ブレッドボード側の幅は 12.2 mm (実測) で、わずかにブレッドボードの穴に被さっている。
  • 基板だけだと¥300-なのだけど、さらに 2x20(40P)両端コネクタ付IDCリボンケーブル(フラット・ケーブル) を買うよりもこのキットの方が安い。
  • 実は、DNCピン(Don't Connect?) 部分で折って26pinで使おうとしたのだけど、配線を見るといったん先頭に行ってから折り返してるようで、折ると2列のうち片側が使えなくなりそうなので断念した。

AE-RBPI-BOB40KIT-001.jpg

2. Raspberry Pi GPIOエクステンション - aitendo (V2.2。2015-05-04 時点では在庫切れ), Raspberry Pi GPIOエクステンション(V3.0) - aitendo

  • Raspberry Pi Model A, B 用。
  • 同じ物は "Extension Board V2.2" - Google 検索"Raspberry Pi GPIO Extension Board" - Google 検索 で見つかる。他に V1.0 や V2.0, V2.1, V3.0 も見つかるが差は不明。
  • シルク印刷は「Raspberry-Pi-GPIO Extension Board V2.2」「Designed by ArduinoKing」「Support By: WiringPi & ArduPi」
  • ブレッドボード側の幅は 10.6 mm (実測)
  • GPIO 側は P0〜P7 の8本。テスターで調べたところ、P0 〜 P6 は Raspberry Pi 1 Model B の回路図 Raspberry-Pi-R2.0-Schematics-Issue2.2_027.pdf の 2B4 (2ページ目B4) や 2E4 の GPIO_GEN0 〜 GPIO_GEN6 と同じ順だった。P7 は異なるが。(GPIO 4 = GPIO_GCLK)
  • ブレッドボードの中央に挿す個所に9pin ×2列と最小限だが Raspberry Pi Model Bの26ピン分の信号はすべて用意されている。B+/A+/2Bの40ピンすべてを使わない用途も多いし、ブレッドボードに挿す本数も少ないので抜き差ししやすいので便利だ。
    • とはいえ、あと4pin×2列だけ増やせば、残りのGPIO 9つ(5,6,12,13,16,19,20,21,26)を納められるのだが。
  • Raspberry Pi Model B (26pin) 用なので、手持ちの Raspberry Pi 2 Model B 用に加工した。ピンソケットを外して 13×2 ピンヘッダを付け直し、下向きの3V3/5V/GNDを外して上側にピンフレーム 2x2 を付け直した。ケーブルは手持ちの40pinフラットケーブル(リボンケーブル)を用いた。

結線:

SPI CE1 (GPIO 7)P0 (GPIO 17)
SPI CE0 (GPIO 8)P1 (GPIO 18)
SPI SCLK (GPIO 11)P2 (GPIO 27)
SPI MISO (GPIO 9)P3 (GPIO 22)
SPI MOSI (GPIO 10)P4 (GPIO 23)
Serial RXD (GPIO 15)P5 (GPIO 24)
Serial TXD (GPIO 14)P6 (GPIO 25)
I2C SCL (GPIO 3)P7 (GPIO 4)
I2C SDA (GPIO 2)GND

Extension Board V2.2。電源/GND がわずかにずれているので、ブレッドボードに挿しにくい:

GPIO-Extenstion-Board-V2_2-002.jpg GPIO-Extenstion-Board-V2_2-001.jpg

AE-RBPI-BOB40 との比較。 Extension Board V2.2 にちょっと手を加えてみた。 電源/GNDを取り去って、ピンソケット周辺を折り取った。 Extension Board V2.2 の方がわずかに幅が狭いので、基板の側のブレッドボードの穴にケーブルを挿しやすい。 ただし、AE-RBPI-BOB40 は周囲にGNDがあるし、基板の端も綺麗なのだが:

GPIO-Extenstion-Board-V2_2-003.jpg GPIO-Extenstion-Board-V2_2-013.jpg

基板が小さいので、かさばらない回路ならミニブレッドボードでも組めそう:

GPIO-Extenstion-Board-V2_2-004.jpg GPIO-Extenstion-Board-V2_2-005.jpg

ピンソケットと電源/GNDを取り去り、13×2ピンヘッダと2×2ピンソケットをつけた:

GPIO-Extenstion-Board-V2_2-006.jpg GPIO-Extenstion-Board-V2_2-007.jpg GPIO-Extenstion-Board-V2_2-008.jpg

フラットケーブルにコネクタを圧着する。工具を持っていないので万力を使った:

GPIO-Extenstion-Board-V2_2-010.jpg GPIO-Extenstion-Board-V2_2-011.jpg

40ピンフラットケーブルをこのように付けて使う。あるいは、ジャンパーケーブル(メス-メス)でRaspberry Piと繋ぐ:

GPIO-Extenstion-Board-V2_2-009.jpg GPIO-Extenstion-Board-V2_2-012.jpg

[編集]

GPIO #

[編集]

LED 点滅 (2015-05-12) #

GPIOで2SC1815L-Yをスイッチして、2色LED(赤・黄)を点滅させてみた。

  • このLEDの諸元が不明だが、高輝度LEDだったと思うので通常15mA、最大30mAと仮定している。
  • GPIO で流せる電流は GPIO Electrical Specifications, Raspberry Pi Input and Output Pin Voltage and Current Capability によると、ピン1つにつき 2mA 〜 16mA で、プログラムで設定可能とのこと。デフォルトは8mAとのこと (GPIO Pads Control2)。
  • Raspberry Pi 2の5Vは数百mA, 3.3Vは百mAくらい取れるらしい。まだ回路図を調べていないが、以下だと予想している。
    • 3.3Vはレギュレータで上限が決まって、供給先(SoC)の使用量を引く
    • 5Vは供給元(USB)と、ポリスイッチ(乗ってたような)で上限が決まり、3.3VやRaspberry Pi 2に乗っているUSBハブとその先のデバイスの使用量を引く。
  • よって、3.3Vは余裕がなさそうなので、LEDの電源はRaspberry Pi 2の5Vから供給して、GPIOでトランジスタ・スイッチを駆動した。

回路図 (Fritzing で作成):

BJT-LED-circuit.png

  • 負荷電流=30mA、増幅率=120とすると、ベース電流は 30mA/120=0.25mA。よってベース抵抗は (3.3V - 0.6V)/0.25mA = 10.8kΩ。 負荷電流=20mA、増幅率=120とすると、ベース電流は 20mA/120=0.167mA。よってベース抵抗は (3.3V - 0.6V)/0.167mA = 16.2kΩ。 今回は手持ちの12kΩを使ったので、ベース電流は (3.3-0.6)/12kΩ=0.225mAくらい。
  • LEDの方の抵抗は220Ωとするが、他に 100Ω と 定電流ダイオード(15mA) を使ってみる。

シミュレーション(EveryCircuit, トランジスタの増幅率を120に設定, 抵抗を変えて3種類を試した):

BJT-LED-everycircuit.png

点滅させるプログラムは2つ作ってみた。

シェルスクリプト版:

[blink_led.sh]
#!/bin/bash

handler()
{
  echo 22 > /sys/class/gpio/unexport
  echo 23 > /sys/class/gpio/unexport
  exit 0
}

trap handler SIGINT

echo 22 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio22/direction

echo 23 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio23/direction

while true
do
  echo 1 > /sys/class/gpio/gpio22/value
  echo 0 > /sys/class/gpio/gpio23/value
  sleep 1
  echo 0 > /sys/class/gpio/gpio22/value
  echo 1 > /sys/class/gpio/gpio23/value
  sleep 1
done

Python 版:

[blink_led.py]
#!/usr/bin/python

import RPi.GPIO as GPIO
from time import sleep

GPIO_LED_RED=22
GPIO_LED_YELLOW=23

GPIO.setmode(GPIO.BCM)
GPIO.setup(GPIO_LED_RED, GPIO.OUT)
GPIO.setup(GPIO_LED_YELLOW, GPIO.OUT)

try:
    while True:
        GPIO.output(GPIO_LED_RED, GPIO.HIGH)
        GPIO.output(GPIO_LED_YELLOW, GPIO.LOW)
        sleep(1.0)
        GPIO.output(GPIO_LED_RED, GPIO.LOW)
        GPIO.output(GPIO_LED_YELLOW, GPIO.HIGH)
        sleep(1.0)

except KeyboardInterrupt:
    pass

GPIO.cleanup(GPIO_LED_RED)
GPIO.cleanup(GPIO_LED_YELLOW)

以下のようにして実行すると、LEDが1秒ごとに点滅する。ctrl-Cを押すとGPIOを閉じてから終了する(LEDが消灯する):

(Shellスクリプト版)

$ chmod +x blink_led.sh
$ sudo ./blink_led.sh

(Python版)

$ chmod +x blink_led.py
$ sudo ./blink_led.py

BJT-LED-red.jpg BJT-LED-yellow.jpg

LED側の抵抗が100Ωのとき、ベース電流は 0.21mA、コレクタ電流は 28.40mA(赤), 25.03mA(黄)。

BLT-LED-100ohm-red-Ic.jpg BLT-LED-100ohm-red-Ib.jpg BLT-LED-100ohm-yellow-Ic.jpg BLT-LED-100ohm-yellow-Ib.jpg

LED側の抵抗が約220Ωのとき:

  • LED(赤): R1=214.0Ω, R2=11.72kΩ、コレクタ電流(Ifも同じ)は 14.67mA (赤), Vf は 1.705V, ベース電流は 0.21mA。
  • LED(黄): R3=214.8Ω, R4=11.64kΩ、コレクタ電流(Ifも同じ)は 12.89mA (黄), Vf は 2.092V, ベース電流は 0.21mA。

    BLT-LED-red-If.jpg BLT-LED-red-Vf.jpg BLT-LED-red-Ib.jpg

    BLT-LED-yellow-If.jpg BLT-LED-yellow-Vf.jpg BLT-LED-yellow-Ib.jpg

定電流ダイオード(15mA) では、9.94mA(赤), 10.84mA(黄) だった。LEDの順方向電圧が1.9〜2.1Vとすると、5.0-(1.9〜2.1) = 3.1〜2.9Vしかか掛かっていないので、定電流ダイオードを使うには電圧が低すぎるようだ。

[編集]

タクトスイッチでシャットダウンする (2015-04-19) #

タクトスイッチを一定時間押すとシャットダウンするようにした。

情報源:

  1. Raspberry Piブログ : [コラム] 『ボタン長押しでシャットダウンする電源ボタンを作ろう 2』
  2. How2RaspberryPi - PukiWiki
  3. Debian JP Project - Debian ポリシーマニュアル - オペレーティングシステム, 9.3 システムランレベルと init.d スクリプト
  4. init.d スクリプトを書こう

1.では 3.3V と GPIO22 を使い、プルダウンしている。 3.3V 端子は他のデバイスへの電源供給に使いたいので、プルアップに変更し、GPIO18 とそのとなりのGNDを使った。

shutdown-sw-001.jpg

動作確認。タクトスイッチを繋いで、スイッチOffのときGPIO18が1になり、スイッチOnのとき0になることを確認する:

$ echo "18" > /sys/class/gpio/export
$ echo "in" > /sys/class/gpio/gpio18/direction
$ echo "high" > /sys/class/gpio/gpio18/direction
$ while true; do cat /sys/class/gpio/gpio18/value; sleep 1; done
1
1
0  ★スイッチOn
0  ★スイッチOn
1
1
^C

1. のシェルスクリプトを次のように変更した。

$ diff -u shutdown-daemon2.sh.org shutdown-daemon2.sh
--- shutdown-daemon2.sh.org 2015-04-19 23:12:30.442544952 +0900
+++ shutdown-daemon2.sh 2015-04-19 23:14:47.442001359 +0900
@@ -1,11 +1,11 @@
 #!/bin/sh
-GPIO=22     #使用するGPIOポート
+GPIO=18     #使用するGPIOポート
 PUSHTIME=5  #シャットダウンを実行する秒数

 ## 初期設定
 echo "$GPIO" > /sys/class/gpio/export
 echo "in" > /sys/class/gpio/gpio$GPIO/direction
-echo "low" > /sys/class/gpio/gpio$GPIO/direction
+echo "high" > /sys/class/gpio/gpio$GPIO/direction

 ## ACT LEDの制御
 set_led_mode () {
@@ -18,7 +18,7 @@
 ## 5秒間押されるまで待つ
 cnt=0
 while [ $cnt -lt $PUSHTIME ] ; do
-  if [ `cat /sys/class/gpio/gpio$GPIO/value` -eq "1" ] ; then
+  if [ `cat /sys/class/gpio/gpio$GPIO/value` -eq "0" ] ; then
     cnt=`expr $cnt + 1`
     [ $cnt -eq 1 ] && set_led_mode heartbeat
   else

さらに「shutdown -h now」行をコメントアウトし、「sh -x」で起動して、動作を確認する:

$ sh -x shutdown-daemon2.sh
+ GPIO=18
+ PUSHTIME=5
+ echo 18
+ echo in
+ echo high
+ cnt=0
+ [ 0 -lt 5 ]
+ cat /sys/class/gpio/gpio18/value
+ [ 1 -eq 0 ]
+ [ 0 -gt 0 ]
+ cnt=0
+ sleep 1
+ [ 0 -lt 5 ]
+ cat /sys/class/gpio/gpio18/value
+ [ 0 -eq 0 ]  ★スイッチOn
+ expr 0 + 1
+ cnt=1
+ [ 1 -eq 1 ]
+ set_led_mode heartbeat
shutdown-daemon2.sh: 12: shutdown-daemon2.sh: cannot create /sys/class/leds/led0/trigger: Permission denied
+ echo heartbeat
+ sleep 1
+ [ 0 -lt 5 ]
+ cat /sys/class/gpio/gpio18/value
+ [ 1 -eq 0 ]  ★スイッチOff
+ [ 0 -gt 0 ]
+ cnt=0
+ sleep 1
^C

動作を確認できたので、/usr/local/sbin にコピーして、chmod +x で実行属性を付けておく。

$ sudo cp shutdown-daemon2.sh /usr/local/sbin/
$ sudo chmod +x /usr/local/sbin/shutdown-daemon2.sh

今回はとりあえず /etc/rc.local から呼び出すようにした。

$ sudo hg diff /etc/rc.local  (★etckeeper + mercurial でバージョン管理しているので、直前の変更との差分を出せる)
diff -r 9a974539e0f4 rc.local
--- a/rc.local  Sun Apr 19 01:21:57 2015 +0900
+++ b/rc.local  Sun Apr 19 23:42:16 2015 +0900
@@ -17,4 +17,6 @@
   printf "My IP address is %s\n" "$_IP"
 fi

+/usr/local/sbin/shutdown-daemon2.sh &
+
 exit 0

(以下、作業中)

Raspbian は Debian 系なので、本来なら /etc/init.d に所定の形式でシェルスクリプトを書いて、update-rc.d コマンドで /etc/rcN.d にリンクを作りりたい。

メリット:

  • 開始、終了、設定ファイルを書き換えて再起動が簡単にできるようになる。
  • /etc/rc.local に間違ったことを書くと、他の処理に影響を与えるが、この形式だと影響が少ない
  • /etc/rc.local に複雑な処理を多数書くと煩雑になるが、それを回避できる。
  • 設定を /etc 以下に移せるため、設定をバックアップするには/etcを保存するだけですむ。

デメリット: 作るのが面倒。プロセスIDを保持するようにしたり。

ファイル一覧

  • /usr/local/sbin/shutdown-button.sh デーモン本体
  • /etc/init.d/shutdown-button デーモン管理用スクリプト
  • /etc/rd?.d/S??-shutdown-button 管理用スクリプトへのリンク
  • /etc/default/shutdown-button デフォルト設定
  • /var/run/shutdown-button.pid デーモン停止/再起動のためのプロセスID

手順

$ cd /etc/init.d
$ sudo cp skeleton shutdown-button
$ sudo emacs shutdown-button
$ sudo chmod +x shutdown-button
$ sudo update-rc.d shutdown-button default
$ sudo emacs /etc/defaults/shutdown-button
$ sudo service shutdown-button start  ★起動
$ sudo service shutdown-button restart ★再起動。設定値を変更したときに用いる。
$ sudo service shutdown-button stop ★停止。GPIOを解放してから、デーモンを停止する。

[/etc/default/shutdown-button]

GPIO=26     #使用するGPIOポート
PUSHTIME=5  #シャットダウンを実行する秒数

[/etc/init.d/shutdown-button]

(作成中)
[編集]

シリアルポート #

[編集]

シリアルポート経由でログイン (2015-03-28) #

1. 機材

以下のUSBシリアル変換モジュールを使った。

PCに Virtual COM Port Drivers をインストールする。

AE-FT234X を PCに一度接続して、ドライバーがインストール完了させる。

ピンを半田付けする。ブレッドボードにピンを刺し、基板を載せてから作業する。

はんだごてなど:

soldering.jpg

AE-FT234X (ブレッドボードに挿したときに端子名が見えるようにUSBコネクタと同じ側にピンをつけた。電源LEDが見えなくなるけど):

AE-FT234X.jpg

AE-FT231X (はんだ付けする前):

AE-FT231X.jpg

ブレッドボードに挿して、ジャンパケーブル3本で接続する:

Raspberry Pi 2AE-FT234XAE-FT231X
Pin 8 / GPIO 14 / TXDRxDRxD
Pin 10 / GPIO 15 / RXDTxDTxD
Pin 14 / GNDGNDGND

AE-FT234X-TxdRxdGnd.jpg

AE-FT231X-TxdRxdGnd.jpg

2. シリアルポートからログインできるようにする

$ sudo raspi-config

「8 Advanced Options」→「A8 Serial」 「Would you like a login shell to be accesible over serial?」で「<はい>」を選択 「Serial is now enabled」と表示されれば完了。 「<Finished>」を選択して raspi-config を終了する。

Raspbian を再起動する。

$ sudo reboot

3. ログインしてみる

TeraTerm を ボーレート 115200 などの設定を行い、接続し、以下のようなログインメッセージが表示されれば完了。

Raspbian GNU/Linux 7 raspi2-2 ttyAMA0

raspi2-2 login:

なお、シリアルポートを接続した後に Raspberry Pi の電源を投入すると、カーネルの起動メッセージも出力される。

[編集]

USB #

[編集]

無線LAN (2015-04-19) #

無線LAN USBアダプタ GW-USNANO2A を繋いでみた。 スペックは 11n/g/b 150Mbps。

設定は X Window System を起動して (startx) そちらで行った。

カタログでの最大消費電力が 1.3W なので、電圧5V時の最大電流は 1.3W / 5V = 0.26A

目視では 0.02 〜 0.21 A の範囲だった。

GW-USNANO2A-VA.jpg

2015-04-23

しばらく放置すると無線LANが切断されるようだ。このときの無線LANアダプタの消費電力は 0.00 〜 0.06Aくらい。

そこで、パワーマネージメントをOffにした。

情報源:

iwconfig ではパワーマネージメントは操作できなかった:

$ iwconfig wlan0 power off
Error for wireless request "Set Power Management" (8B2C) :
    SET failed on device wlan0 ; Operation not permitted.

$ sudo iwconfig wlan0 power off
Error for wireless request "Set Power Management" (8B2C) :
    SET failed on device wlan0 ; Operation not permitted.

ドライバを調べる:

$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 004: ID 2019:ab2a PLANEX GW-USNano2 802.11n Wireless Adapter [Realtek RTL8188CUS]  ★これ
$ lsmod
Module                  Size  Used by
snd_bcm2835            18649  0
snd_pcm                73475  1 snd_bcm2835
snd_seq                53078  0
snd_seq_device          5628  1 snd_seq
snd_timer              17784  2 snd_pcm,snd_seq
snd                    51038  5 snd_bcm2835,snd_timer,snd_pcm,snd_seq,snd_seq_device
8192cu                528365  0  ★これ
uio_pdrv_genirq         2958  0
uio                     8119  1 uio_pdrv_genirq

パワーマネージメントは1 (On)だった:

$ cat /sys/module/8192cu/parameters/rtw_power_mgnt
1

設定ファイルを新規作成して、そこでパワーマネージメントをOffにする。

[/etc/modprobe.d/8192cu.conf]

options 8192cu rtw_power_mgnt=0

再起動して、確認すると、パワーマネージメントは 0 (Off) になった。

$ cat /sys/module/8192cu/parameters/rtw_power_mgnt
0

情報源の中には、パワーマネージメントの他にdisables USB autosuspend を 0に設定しているものもあったが、既に0なので8192cu.confには入れなかった。

$ cat /sys/module/8192cu/parameters/rtw_enusbss
0

電流は通信がないときに 0.06〜0.07A になった。

なお、ドライバのパラメータは他にもあるようだ:

$ ls /sys/module/8192cu/parameters/
if2name           rtw_cbw40_enable  rtw_hw_wps_pbc     rtw_lowrate_two_xmit   rtw_power_mgnt          rtw_wifi_spec
ifname            rtw_channel       rtw_hwpdn_mode     rtw_mac_phy_mode       rtw_rf_config           rtw_wmm_enable
rtw_80211d        rtw_channel_plan  rtw_hwpwrp_detect  rtw_max_roaming_times  rtw_rfintfs
rtw_ampdu_amsdu   rtw_chip_version  rtw_initmac        rtw_mc2u_disable       rtw_rx_stbc
rtw_ampdu_enable  rtw_enusbss       rtw_ips_mode       rtw_mp_mode            rtw_special_rf_path
rtw_antdiv_cfg    rtw_force_iol     rtw_lbkmode        rtw_network_mode       rtw_vcs_type
rtw_busy_thresh   rtw_ht_enable     rtw_low_power      rtw_notch_filter       rtw_vrtl_carrier_sense
[編集]

USB-ギガビットLANアダプター ETC-US2 (2015-03-26) #

最近のカーネルだと、 ASIX 系のデバイスドライバが入っていると聞いたので、 USB 2.0/1.1対応 ギガビットLANアダプター:ETG-US2|アイ・オーデータ機器 を繋いでみた。

これは昔 (2009年頃?) に Debian でLANのネットワークエミュレータ用に使っていたのだが (ソフト/ネットワークエミュレータ)、当時はデバイスドライバを自分でビルドする必要があった。

[/var/log/syslog]

Mar 26 00:17:12 raspi2-2 kernel: [757181.840178] usb 1-1.2: new high-speed USB device number 9 using dwc_otg
Mar 26 00:17:12 raspi2-2 kernel: [757181.952816] usb 1-1.2: New USB device found, idVendor=04bb, idProduct=0930
Mar 26 00:17:12 raspi2-2 kernel: [757181.952846] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Mar 26 00:17:12 raspi2-2 kernel: [757181.952864] usb 1-1.2: Product: ETG-US2
Mar 26 00:17:12 raspi2-2 kernel: [757181.952882] usb 1-1.2: Manufacturer: I-O DATA DEVICE,INC.
Mar 26 00:17:13 raspi2-2 kernel: [757182.312422] asix 1-1.2:1.0 eth1: register 'asix' at usb-bcm2708_usb-1.2, 
ASIX AX88178 USB 2.0 Ethernet, 00:a0:b0:xx:xx:xx
Mar 26 00:17:13 raspi2-2 kernel: [757182.313112] usbcore: registered new interface driver asix
Mar 26 00:17:13 raspi2-2 ifplugd(eth1)[8667]: ifplugd 0.28 initializing.
Mar 26 00:17:13 raspi2-2 ifplugd(eth1)[8667]: Using interface eth1/00:A0:B0:xx:xx:xx with driver <asix> (version: 22-Dec-2011)
Mar 26 00:17:13 raspi2-2 ifplugd(eth1)[8667]: Using detection mode: SIOCETHTOOL
Mar 26 00:17:13 raspi2-2 ifplugd(eth1)[8667]: Initialization complete, link beat not detected.
...
Mar 26 00:22:14 raspi2-2 dhclient: DHCPREQUEST on eth0 to 192.168.1.1 port 67
Mar 26 00:22:15 raspi2-2 dhclient: DHCPACK from 192.168.1.1
Mar 26 00:22:15 raspi2-2 dhclient: bound to 192.168.1.47 -- renewal in 42516 seconds.
Mar 26 00:28:22 raspi2-2 kernel: [757851.780233] asix 1-1.2:1.0 eth1: link up, 1000Mbps, full-duplex, lpa 0xC5E1
Mar 26 00:28:23 raspi2-2 ifplugd(eth1)[8667]: Link beat detected.
Mar 26 00:28:23 raspi2-2 ifplugd(eth1)[8667]: Executing '/etc/ifplugd/ifplugd.action eth1 up'.
Mar 26 00:28:23 raspi2-2 ifplugd(eth1)[8667]: client: Ignoring unknown interface eth1=eth1.
Mar 26 00:28:23 raspi2-2 ifplugd(eth1)[8667]: Program executed successfully.

USBデバイスの情報:

$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 009: ID 04bb:0930 I-O Data Device, Inc. ETG-US2
Bus 001 Device 006: ID 045e:07b2 Microsoft Corp.
Bus 001 Device 008: ID 0853:0200 Topre Corporation

$ lsusb -s 001:009 -v

Bus 001 Device 009: ID 04bb:0930 I-O Data Device, Inc. ETG-US2
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass       255 Vendor Specific Subclass
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x04bb I-O Data Device, Inc.
  idProduct          0x0930 ETG-US2
  bcdDevice            0.01
  iManufacturer           1 I-O DATA DEVICE,INC.
  iProduct                2 ETG-US2
  iSerial                 0
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength           39
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          4 0
    bmAttributes         0xa0
      (Bus Powered)
      Remote Wakeup
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass    255 Vendor Specific Subclass
      bInterfaceProtocol      0
      iInterface              7 0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0008  1x 8 bytes
        bInterval              11
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x03  EP 3 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass          255 Vendor Specific Class
  bDeviceSubClass       255 Vendor Specific Subclass
  bDeviceProtocol         0
  bMaxPacketSize0         8
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)

eth1 の設定が無いので、IPアドレスは割り当てられていない:

$ ifconfig eth1
eth1      Link encap:イーサネット  ハードウェアアドレス 00:a0:b0:xx:xx:xx
          UP BROADCAST RUNNING MULTICAST  MTU:1500  メトリック:1
          RXパケット:164 エラー:0 損失:0 オーバラン:0 フレーム:0
          TXパケット:0 エラー:0 損失:0 オーバラン:0 キャリア:0
      衝突(Collisions):0 TXキュー長:1000
          RXバイト:14055 (13.7 KiB)  TXバイト:46 (46.0 B)

以下の設定を用意して IPアドレスを割り当てた: [/etc/network/interfaces]

auto lo

iface lo inet loopback
#iface eth0 inet dhcp       ★コメントアウト

allow-hotplug eth1       ★追加
iface eth0 inet eth1     ★追加

allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
$ sudo service networking restart

iperf で速度を測った。別途、ギガイーサを持つ他のPCで iperf -s を実行しておくこと:

$ iperf -c 192.168.1.xx
(略) 137 Mbits/sec

内蔵NICは 94.2 Mbits/sec なので、1.45倍の性能が出ている。 最近の製品を使えば、もう少し速いかも。

ただ、使用電力が多いようで、GND - 5V 間の電圧が 4.483 V に低下した。 (eth0 にもケーブルを挿した場合。eth0 を抜くと 4.526 V。eth1 を抜いて eth0 を挿すと 4.786 V) もし、このアダプタを常用するなら、セルフパワーのUSBハブを介した方が良さそうだ。

元に戻すには、/etc/network/inteface を修正してから次のようにした。

$ sudo service networking restart   ★不要かも?
$ sudo ifdown eth0
$ sudo ifup eth0  ★この時点でdhcpからIPアドレスを取得
[編集]

Bluetooth キーボード RT-MWK02 (2015-02-23) #

(作業中 ……単にBluetoothキーボードが余ってたので繋いでみただけなので、あきらめるかも。内蔵電池の容量が減ってきたし)

参考:

Raspbian 2015-01-31 を apt-get update && apt-get upgrade したものを使用した。

RT-MWK02 - Google 検索 を繋いでみた。

USBドングル は RT-MWK02 付属品 ではなく、手持ちの ダイヤテック FKBT02 - Google 検索 を使った。

USBドングルを挿して、lsusb で確認する:

$ lsusb
Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp.
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp.
Bus 001 Device 005: ID 0a12:0001 Cambridge Silicon Radio, Ltd Bluetooth Dongle (HCI mode)

Bluetoothのドライバと設定ツール(コマンドライン版)をインストールする:

$ sudo apt-get install bluetooth bluez-utils

cups (Common Unix Printing System) とプリンタドライバが沢山インストールされる。不要なのだが。

Bluetoothキーボードをペアリングモードにしてから (Bluetoothマークのキーを数秒間押して、白いLEDが点滅するようにする) 、hcitool で MACアドレスを調べる:

$ hcitool scan
Scanning ...
        20:42:A1:xx:xx:xx       Bluetooth Wireless Keyboard

ペアリングする (失敗:タイムアウトした):

$ sudo bluez-simple-agent hci0 20:42:A1:xx:xx:xx
RequestPinCode (/org/bluez/6738/hci0/dev_20_42_A1_xx_xx_xx)
Enter PIN Code: 1234
Creating device failed: org.freedesktop.DBus.Error.NoReply: Did not receive a reply. 
Possible cau ses include: the remote application did not send a reply, the message 
bus security policy blocked the reply, the reply timeout expired, or the network 
connection was broken.

やり直すために、設定を消す:

$ sudo bluez-simple-agent hci0 20:42:A1:xx:xx:xx repair
RequestPinCode (/org/bluez/2065/hci0/dev_20_42_A1_xx_xx_xx)
Enter PIN Code: ★Enterを入力

やりなおし:

$ sudo bluez-simple-agent hci0 20:42:A1:xx:xx:xx
RequestPinCode (/org/bluez/2080/hci0/dev_20_42_A1_xx_xx_xx)
Enter PIN Code: 8888
Release    ★Bluetoothキーボードの方も8888<ENTER>を入力すると表示される
New device (/org/bluez/2080/hci0/dev_20_42_A1_xx_xx_xx)

自動接続するよう設定する:

$ sudo bluez-test-device trusted 20:42:A1:xx:xx:xx yes
$ sudo bluez-test-input connect 20:42:A1:xx:xx:xx

これでキーボードが使えるようになった。

しかし、しばらくすると、使えなくなる。ペアリングは完了してるようだが。

再度、接続操作を行うと、次のエラーが発生した:

$ sudo bluez-test-device trusted 20:42:A1:xx:xx:xx yes
$ sudo bluez-test-input connect 20:42:A1:xx:xx:xx
Traceback (most recent call last):
  File "/usr/bin/bluez-test-input", line 40, in <module>
    input.Connect()
  File "/usr/lib/python2.7/dist-packages/dbus/proxies.py", line 70, in __call__
    return self._proxy_method(*args, **keywords)
  File "/usr/lib/python2.7/dist-packages/dbus/proxies.py", line 145, in __call__
    **keywords)
  File "/usr/lib/python2.7/dist-packages/dbus/connection.py", line 651, in call_blocking
    message, timeout)
dbus.exceptions.DBusException: org.bluez.Error.Failed: Host is down (112)

ペアリングを消して、やり直すと成功する。ただし、Linuxを再起動すると、接続されてない。他に設定が必要なのかも。

$ sudo bluez-simple-agent hci0 20:42:A1:xx:xx:xx remove
$ sudo bluez-simple-agent hci0 20:42:A1:xx:xx:xx
$ sudo bluez-test-device trusted 20:42:A1:xx:xx:xx yes
$ sudo bluez-test-input connect 20:42:A1:xx:xx:xx

TODO: GUI版で試してみる (blueman)

[編集]

有線LAN #

[編集]

Iperf (2015-02-27) #

The TCP/UDP Bandwidth Measurement Tool で、有線LAN の TCP の速度を計測した。

計測相手と同じスイッチングハブ (1000Base-T) に接続して計測した。

結果: 94.2 Mbit/sec 。 数回計測したが、ずっと同じだった。 100Base-TX なので、ここらへんが上限のはず。

メモ

計測相手 (Windows 7 64bit) には Iperf - The TCP/UDP Bandwidth Measurement Tool の iperf-2.0.5-3-win32.zip を使った:

C:> iperf -s
------------------------------------------------------------
Server listening on TCP port 5001
TCP window size: 63.0 KByte (default)
------------------------------------------------------------
[  4] local 192.168.1.36 port 5001 connected with 192.168.1.46 port 44071

Raspberry Pi 2 の方は、Rasbian パッケージの iperf を用いた。

$ apt-cache search iperf
iperf - Internet Protocol bandwidth measuring tool

$ apt-cache show iperf | grep ^Version
Version: 2.0.5-3

$ iperf -c 192.168.1.36
------------------------------------------------------------
Client connecting to 192.168.1.36, TCP port 5001
TCP window size: 70.0 KByte (default)
------------------------------------------------------------
[  3] local 192.168.1.46 port 44071 connected with 192.168.1.36 port 5001
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec   112 MBytes  94.2 Mbits/sec

(略)
[編集]

I2C #

[編集]

I2C設定 (2015-02-17) #

raspi-config の 「8.Advanced Opitons」 の 「A7 I2C」で有効に出来る。

この設定を行うと、/boot/config.txt に以下の行が追加される。

dtparam=i2c_arm=on

さらに、手動で /etc/modules に以下の行を追加する。

i2c-dev

(この件はぐぐって見つけたが、正規の文書での解説をまだ見つけていない。Linux一般かDebianで探した方が良かった?)

再起動して、モジュールとデバイスファイルを調べる。

カーネルモジュールは i2c_bcm2708 , i2c_dev のようだ。

$ sudo lsmod | grep -i i2c
i2c_dev                 6027  0 
i2c_bcm2708             4990  0 

デバイスファイルも出来てた。

$ ls -al /dev/i2c-1
crw-rw---T 1 root i2c 89, 1  2月 17 01:18 /dev/i2c-1

動作確認のために i2c-tools をインストールする。

$ sudo apt-get install i2c-tools

sudo がおっくうなので、SPIみたいにユーザ権限で実行するために、以下の操作を行ったが、ダメだった。SPIや(たぶん)GPIOは同様の設定がされているのに。

$ grep i2c /etc/group
i2c:x:110:

$ sudo adduser pi i2c
ユーザ `pi' をグループ `i2c' に追加しています...
ユーザ pi をグループ i2c に追加
完了。

$ grep i2c /etc/group
i2c:x:110:pi

$ i2cdetect 1
Error: Could not open file `/dev/i2c-1': Permission denied
Run as root?
$ ls -al /dev/spidev0.*
crw-rw---T 1 root spi 153, 0  1月  1  1970 /dev/spidev0.0
crw-rw---T 1 root spi 153, 1  1月  1  1970 /dev/spidev0.1

$ grep spi /etc/group
spi:x:1002:pi

i2c-tools で推奨されたパッケージをインストールした。まだ使ってない。

$ sudo apt-get install libi2c-dev python-smbus
[編集]

I2C light sensor (2015-02-18) #

(未完)

ISL29125 RGBライトセンサ (ISL29125) と TSL2561使用 照度センサーモジュール (TSL2561) を繋いで、i2cdetect すると、以下のようになった。

$ sudo i2cdetect 1
WARNING! This program can confuse your I2C bus, cause data loss and worse!
I will probe file /dev/i2c-1.
I will probe address range 0x03-0x77.
Continue? [Y/n] y
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:          -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- 39 -- -- -- -- -- --
40: -- -- -- -- 44 -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

アドレス 0x39 が TSL2561, 0x44 が ISL29125:

i2c-light-sensor.jpg i2c-osc.jpg

(続きは未完)

[編集]

キャラクタ液晶 (LCDドライバ ST7032i) (2015-04-06) #

以下のキャラクタ液晶モジュールを繋いでみた。

ピンヘッダのはんだ付けが必要。 ピンヘッダは以下を切り離して用いた。付属品よりも少し長かったので、ブレッドボードやジャンパーワイヤ(メス)が抜けにくいと思ったので。

RST ピンは手持ちの 12kΩ で 3.3Vと接続した。 On/Off するならGPIOをプルアップ設定にして繋ぐのだろう。

LCDドライバは Sitronix ST7032i なのだけど、Products - Display Driver IC - Industrial Display Driver IC - Sitronix Technology Corporation にはデータシートが見当たらない。 代わりに Strawberry Linux と 秋月電子通商 のデータシートを見た。

動作確認のために、以下のシェルスクリプトを「-y 0」→「-y 1」に置き換えて用いたところ、ちゃんと表示された。

$ emacs st7032.sh
(↑のシェルスクリプトをコピー&ペーストして、「-y 0」→「-y 1」に置換)
$ chmod +x st7032.sh
$ sudo adduser pi i2c

$ ./st7032.sh -i "i2c ST7032i"
$ ./st7032.sh -p 40 "Raspberry Pi 2 Model B"

ST7032i-01.jpg ST7032i-02.jpg

2015-04-06

wiringPi をインストールする:

$ mkdir ~/src
$ cd ~/src
$ git clone git://git.drogon.net/wiringPi
$ cd wiringPi
$ less INSTALL
$ ./build

Raspberry Pi にLCD液晶を付けて時計を作ってみた-IT社会の崖下で の時計のサンプルをビルドする。

$ gcc -Wall -Wextra lcd7031i.c -o lcd7031i -lwiringPi
lcd7031i.c: In function ‘main’:
lcd7031i.c:63:5: warning: implicit declaration of function ‘sleep’ [-Wimplicit-function-declaration]
lcd7031i.c: In function ‘lcd_init’:
lcd7031i.c:78:3: warning: implicit declaration of function ‘delay’ [-Wimplicit-function-declaration]
lcd7031i.c:82:3: warning: implicit declaration of function ‘delayMicroseconds’ [-Wimplicit-function-declaration]

警告を解消するために、以下の2行をファイル先頭付近に挿入した:

#include <unistd.h>
#include <wiringPi.h>

以下のようにして実行すると、LCDに年月日、曜日、時分秒が表示された:

$ ./lcd7031i &

2015-04-13

オシロスコープで観測:

  • クロックは 100KHz だった。

ST7032i-i2c-osc-001.png

ST7032i-i2c-osc-002.png

ST7032i-i2c-osc-003.png

ロジックアナライザで観測 (初期化, 1行目に"192.168.1.47"を表示)

  • 送信データ1: Address=3E(Write), 00 38 39 14 78 5E 6C
  • 送信データ2: Address=3E(Write), 00 0C 01 06
  • 送信データ3: Address=3E(Write), 40 "192.168.1.47"

ST7032i-i2c-log-01-001.png

ST7032i-i2c-log-01-002.png

ST7032i-i2c-log-01-003.png

ST7032i-i2c-log-01-004.png

ST7032i-i2c-log-01-005.png

ロジックアナライザで観測 (2行目に"Raspberry Pi 2 B"を表示)

  • 送信データ1: Address=3E(Write), 00 A8 (128 + 40)
  • 送信データ2: Address=3E(Write), 40 "Raspberry Pi 2 B"

ST7032i-i2c-log-02-001.png

ST7032i-i2c-log-02-002.png

ST7032i-i2c-log-02-003.png

2015-04-13

python smbus モジュールを用いたスクリプトを実行してみた。

2行目が出力されなかった。clearの末尾ににsleep()を入れると出力された。

   def clear(self):
       self.bus.write_i2c_block_data(self.addr, 0, [0x01])
       time.sleep(0.00002)

この件は後で調査する。(仕様と比較、ロジアナで通信内容とタイミング調査する)

また、室温20℃では、コントラストが0x20では文字が薄かったので、0x30にした。

2015-04-13

RPi.GPIO は PyPI にも存在する。こちらは、とりあえずそのままで:

$ pip search rpi.gpio
RPi.GPIO                  - A module to control Raspberry Pi GPIO channels
  INSTALLED: 0.5.11 (latest)
RPIO                      - Advanced GPIO for the Raspberry Pi. Extends RPi.GPIO with PWM,
                            GPIO interrups, TCP socket interrupts, command line tools and more
gpiocrust                 - A pythonic wrapper around RPi.GPIO
[編集]

SPI #

[編集]

SPI設定 (2015-02-15) #

(中断中)

情報源:

raspi-config の 「8.Advanced Opitons」 の 「A6 SPI」 で有効に出来る。

この設定を行うと、boot/config.txt に以下の行が追加される。

dtparam=spi=on

カーネルモジュールは spi_bcm2708 のようだ。

$ sudo lsmod | grep -i spi
spi_bcm2708             5153  0

デバイスファイルは /dev/spidev* のようだ。

$ ls -l /dev/spi*
crw-rw---T 1 root spi 153, 0  1月  1  1970 /dev/spidev0.0
crw-rw---T 1 root spi 153, 1  1月  1  1970 /dev/spidev0.1

spidev_test.c を試してみた。

$ wget https://raw.githubusercontent.com/raspberrypi/linux/rpi-3.10.y/Documentation/spi/spidev_test.c
$ gcc -Wall -Wextra spidev_test.c -o spidev_test
spidev_test.c: In function ‘transfer’:
spidev_test.c:64:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]

なお、新しい物だと、SPI_TX_QUAD などのシンボルが無いので、コンパイルエラーになる。

$ wget https://raw.github.com/torvalds/linux/master/Documentation/spi/spidev_test.c
$ gcc -Wall -Wextra spidev_test.c -o spidev_test
spidev_test.c: In function ‘transfer’:
spidev_test.c:60:13: error: ‘SPI_TX_QUAD’ undeclared (first use in this function)
spidev_test.c:60:13: note: each undeclared identifier is reported only once for each function it appears in
spidev_test.c:61:5: error: ‘struct spi_ioc_transfer’ has no member named ‘tx_nbits’
spidev_test.c:62:18: error: ‘SPI_TX_DUAL’ undeclared (first use in this function)
spidev_test.c:63:5: error: ‘struct spi_ioc_transfer’ has no member named ‘tx_nbits’
spidev_test.c:64:13: error: ‘SPI_RX_QUAD’ undeclared (first use in this function)
spidev_test.c:65:5: error: ‘struct spi_ioc_transfer’ has no member named ‘rx_nbits’
spidev_test.c:66:18: error: ‘SPI_RX_DUAL’ undeclared (first use in this function)
spidev_test.c:67:5: error: ‘struct spi_ioc_transfer’ has no member named ‘rx_nbits’
spidev_test.c:79:20: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
spidev_test.c: In function ‘parse_opts’:
spidev_test.c:172:12: error: ‘SPI_TX_DUAL’ undeclared (first use in this function)
spidev_test.c:175:12: error: ‘SPI_TX_QUAD’ undeclared (first use in this function)
spidev_test.c:184:12: error: ‘SPI_RX_DUAL’ undeclared (first use in this function)
spidev_test.c:186:12: error: ‘SPI_RX_QUAD’ undeclared (first use in this function)
spidev_test.c: In function ‘main’:
spidev_test.c:204:18: error: ‘SPI_IOC_WR_MODE32’ undeclared (first use in this function)
spidev_test.c:208:18: error: ‘SPI_IOC_RD_MODE32’ undeclared (first use in this function)

これって、Flashでで見かける dual-SPI, quad-SPI (半2重で2本、あるいは4本のデータ線があるらしい) だと思うので、Raspberry Piとは関係ないはず。

2015-04-13

現時点のドライバ (kernel 3.18.11-v7+)

$ lsmod
Module                  Size  Used by
bnep                   10206  2
rfcomm                 34707  4
bluetooth             287204  10 bnep,rfcomm
rfkill                 16651  3 bluetooth
i2c_dev                 6027  0
snd_bcm2835            18665  0
snd_pcm                73475  1 snd_bcm2835
snd_seq                53078  0
snd_seq_device          5628  1 snd_seq
snd_timer              17784  2 snd_pcm,snd_seq
snd                    51038  5 snd_bcm2835,snd_timer,snd_pcm,snd_seq,snd_seq_device
i2c_bcm2708             4990  0
spi_bcm2708             5137  0
uio_pdrv_genirq         2958  0
uio                     8119  1 uio_pdrv_genirq
$ find /lib/modules/`uname -r` -name 'spi*' -type f -print
/lib/modules/3.18.11-v7+/kernel/drivers/spi/spi-bcm2835.ko
/lib/modules/3.18.11-v7+/kernel/drivers/spi/spi-bcm2708.ko
[編集]

SPI ループバック (2015-02-19) #

MOSI と MISO を直結して、SPI ループバックテスト してみた。

ちゃんと動いてるっぽい。

1byte送信前後の処理が STBee(STM32F103VE) や STM32F3/F4/L1 Discovery に比べると短い(=速い)なあ。Cortex-M1 と Cortex-A7 の性能差? それとも、SPI回路が高機能なのかなあ。

spidev_test.c より、送信データ

static void transfer(int fd)
{
	int ret;
	uint8_t tx[] = {
		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
		0x40, 0x00, 0x00, 0x00, 0x00, 0x95,
		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
		0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF,
		0xDE, 0xAD, 0xBE, 0xEF, 0xBA, 0xAD,
		0xF0, 0x0D,
	};
...(略)
$ ./spidev_test -D /dev/spidev0.0 -s 20000000
spi mode: 0
bits per word: 8
max speed: 20000000 Hz (20000 KHz)

FF FF FF FF FF FF
40 00 00 00 00 95
FF FF FF FF FF FF
FF FF FF FF FF FF
FF FF FF FF FF FF
DE AD BE EF BA AD
F0 0D

ループバック接続の前に、ロジックアナライザで確認した。こちらもOKっぽい。

spidev_test-speed-20MHz-logic-001.png

spidev_test-speed-20MHz-logic-002.png

spidev_test-speed-20MHz-logic-003.png

[編集]

SPI SRAM (2015-02-19, 2015-02-16, 2015-02-15) #

(作業中)

TODO:

  • ちゃんと SRAMを読み書きできるようにする。
    • spidev_test.c の uint8_t tx[] に SRAM 書き込みコマンドを設定してみるか、spidev_test.c を参考に自作するか、SPI Library | Gordons Projects 使う。

シリアルSRAMモジュール 23K256 - スイッチサイエンス を繋いでみた。(注意: SCK と MOSI の配線間違い。このあとに直した):

spi.jpg spi-sram-mistake.jpg

$ ./spidev_test -D /dev/spidev0.0
spi mode: 0
bits per word: 8
max speed: 500000 Hz (500 KHz)

00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00 00 00 00 00
00 00

クロック 10MHz にして、SCK (ch1, 赤) と MOSI (ch2, 黄) の信号を観測した。

$ ./spidev_test -s 10000 -D /dev/spidev0.0

spidev_test-speed-10MHz-sck-mosi-1us.png

spidev_test-speed-10MHz-sck-mosi-500ns.png

どうやら、この設定では SCK=7.0 MHz になるらしい。 (RPi SPI - eLinux.org を見ると、Pi 1 と同じなら 7.8MHz になりそうだが)

同様に、CS (ch1, 赤) と MISO (ch2, 黄) の信号を観測した。

spidev_test-speed-10MHz-cs-miso-10us.png

spidev_test-speed-10MHz-cs-miso-1us.png

いまは正しいSRAMのコマンドを送っていないので、MOSI は0x00が返ってきているが、わずかに電圧変動がある。 SCKに応答しているのだと思う。

2015-02-19

spidev_test.c をいじって、byte write と byte read コマンドを送ってみたが、応答しない。

  • write (0x02), address=0x1213, data=0x55
  • reed (0x03), address=0x1213

ロジックアナライザで確認すると、信号は正しいようだ。

ループバックが成功しているので、配線ミスか、HOLD 解除ミスっのかも。

spisram-logic-001.jpg spisram-logic-002.jpg

(1) 全体: CSの期間がデータ送信期間にくらべると、ちょっと長い (write時 18.86us, read時 11.97us)

spisram-20MHz-logic-sram-001.png

(2) write 部分:

spisram-20MHz-logic-sram-002.png

(3) write 部分 拡大:

spisram-20MHz-logic-sram-004.png

(4) read 部分:

spisram-20MHz-logic-sram-003.png

(5) read 部分 拡大:

spisram-20MHz-logic-sram-005.png

2015-02-22

以前作ったコード (mbed STM32 Nucleo 用) で試してみた。

GND - HOLD 間 2.

書いたデータと読んだデータが一致しない。

CPU SystemCoreClock is 84.00 MHz

push user button to start: try_single_byte_access
USER button is pressed
write: 55 -> read: 00

push user button to start: try_byte_access
USER button is pressed
byte access test: result
  0000 : 00 OK
  0001 : 00 BAD
  0002 : 00 BAD
  0003 : 02 BAD
  0004 : 00 BAD
  0005 : 00 BAD
  0006 : 04 BAD
  0007 : 06 BAD
  0008 : 00 BAD
  0009 : 00 BAD
  000a : 00 BAD
  000b : 04 BAD
  000c : 08 BAD
  000d : 08 BAD
  000e : 0c BAD
  000f : 0e BAD

push user button to start: try_page_access
... (略)

電源 (Vcc, Vss) だけを繋いで、Vss と CS, SO, HOLD, SCK, SI 間の電圧を測ったところ、

0.7V 〜 1.1V で、しかも値が安定しない。

2015-02-28 mbed で 23LC1024 を 組み込み/mbed#SPISRAM を試した。問題なし。

[編集]

pi-spidev (2015-04-13) #

「Raspberry Piで学ぶ電子工作」補足情報 で使われている pi-spidev をインストールした。

パッケージやPyPiを探してみるが、見つからない:

$ apt-cache search pi-spidev

$ sudo apt-get install python-pip
$ pip search pi-spidev

そこで、pipでgithubのリポジトリを指定してインストールした。これでpipの管理下になるので更新やアンインストールが楽になるはず:

$ sudo pip install git+https://github.com/Gadgetoid/py-spidev
Downloading/unpacking git+https://github.com/Gadgetoid/py-spidev
  Cloning https://github.com/Gadgetoid/py-spidev to /tmp/pip-R3FWRt-build
  Running setup.py egg_info for package from git+https://github.com/Gadgetoid/py-spidev

Installing collected packages: spidev
  Running setup.py install for spidev
    building 'spidev' extension
    gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC 
     -I/usr/src/linux/include -I/usr/include/python2.7 -c spidev_module.c -o build/temp.linux-armv7l-2.7/spidev_module.o
    spidev_module.c:35:0: warning: "PyLong_Check" redefined [enabled by default]
    /usr/include/python2.7/longobject.h:14:0: note: this is the location of the previous definition
    spidev_module.c:888:1: warning: return type defaults to ‘int’ [-Wreturn-type]
    spidev_module.c: In function ‘initspidev’:
    spidev_module.c:897:3: warning: ‘return’ with no value, in function returning non-void [-Wreturn-type]
    gcc -pthread -shared -Wl,-O1 -Wl,-Bsymbolic-functions -Wl,-z,relro build/temp.linux-armv7l-2.7/spidev_module.o 
     -o build/lib.linux-armv7l-2.7/spidev.so

Successfully installed spidev
Cleaning up...

念のため、spidev の場所を確認しておく:

$ python -c 'import spidev; print spidev.__file__'
/usr/local/lib/python2.7/dist-packages/spidev.so

$ ls -l `python -c 'import spidev; print spidev.__file__'`
-rwxr-xr-x 1 root staff 39964  4月 13 23:29 /usr/local/lib/python2.7/dist-packages/spidev.so
[編集]

CPU #

[編集]

CPU サイクルカウンタ (調査中) #

計測用に us 程度の精度があるカウンタが欲しいので、調査中。

OpenMP の omp_get_wtime() だと、Raspberry Pi 2 では精度 1ms 前後だったので。

情報源:

試しに DWT の CYCCNT 使ったら、設定レジスタにアクセスした時点で、Segmentation Fault が発生した。 (というか、Cortex-A に同じレジスタの存在を調べてないし)

[DwtCycCnt.cpp]

// g++ -Wall -Wextra -g -std=c++0x DwtCycCnt.cpp -o DwtCycCnt

#include <cstdio>
#include <cstdint>
#include <unistd.h>

#define DWT_CONTROL ((volatile uint32_t *)0xE0001000)
#define DWT_CYCCNT  ((volatile uint32_t *)0xE0001004)
#define SCB_DEMCR   ((volatile uint32_t *)0xE000EDFC)

static inline uint32_t getDwtCyccnt(void)
{
  return *DWT_CYCCNT;
}

static inline void resetDwtCyccnt()
{
  *DWT_CYCCNT = 0; // reset the counter
}

static inline void enableDwtCyccnt()
{
  *SCB_DEMCR = *SCB_DEMCR | (1u << 24); // TRCENA = 1
  *DWT_CONTROL = *DWT_CONTROL | 1 ; // enable the counter (CYCCNTENA = 1)
  *DWT_CYCCNT = 0; // reset the counter
}

static void check_overhead() {
  uint32_t count[11];
  enableDwtCyccnt();
  resetDwtCyccnt();
  count[0] = getDwtCyccnt();
  count[1] = getDwtCyccnt();
  count[2] = getDwtCyccnt();
  count[3] = getDwtCyccnt();
  count[4] = getDwtCyccnt();
  count[5] = getDwtCyccnt();
  count[6] = getDwtCyccnt();
  count[7] = getDwtCyccnt();
  count[8] = getDwtCyccnt();
  count[9] = getDwtCyccnt();
  count[10] = getDwtCyccnt();

  for (size_t i = 0; i <= 10; i++) {
    const uint32_t diff = (i >= 1)?(count[i] - count[i - 1]):0;
    printf("%d (%d)\n", count[i], diff);
  }
}

static void check_wait_us_accuracy() {
  uint32_t count[11];
  enableDwtCyccnt();
  resetDwtCyccnt();
  count[0] = getDwtCyccnt();
  usleep(1000);
  count[1] = getDwtCyccnt();
  usleep(1000);
  count[2] = getDwtCyccnt();
  usleep(1000);
  count[3] = getDwtCyccnt();
  usleep(1000);
  count[4] = getDwtCyccnt();
  usleep(1000);
  count[5] = getDwtCyccnt();
  usleep(1000);
  count[6] = getDwtCyccnt();
  usleep(1000);
  count[7] = getDwtCyccnt();
  usleep(1000);
  count[8] = getDwtCyccnt();
  usleep(1000);
  count[9] = getDwtCyccnt();
  usleep(1000);
  count[10] = getDwtCyccnt();

  for (size_t i = 0; i <= 10; i++) {
    const uint32_t diff = (i >= 1)?(count[i] - count[i - 1]):0;
    printf("%d (%d)\n", count[i], diff);
  }
}

int main() {
  check_overhead();
  check_wait_us_accuracy();
  return 0;
}
$ g++ -Wall -Wextra -g -std=c++0x DwtCycCnt.cpp -o DwtCycCnt
$ ./DwtCycCnt
Segmentation fault
$ gdb ./DwtCycCnt
...(略)
Reading symbols from /home/pi/src/DwtCycCnt...done.
(gdb) r
Starting program: /home/pi/src/DwtCycCnt

Program received signal SIGSEGV, Segmentation fault.
0x000084fc in enableDwtCyccnt () at DwtCycCnt.cpp:23
23        *SCB_DEMCR = *SCB_DEMCR | (1u << 24); // TRCENA = 1
(gdb) bt
#0  0x000084fc in enableDwtCyccnt () at DwtCycCnt.cpp:23
#1  0x00008550 in check_overhead () at DwtCycCnt.cpp:30
#2  0x00008854 in main () at DwtCycCnt.cpp:83
(gdb) q
[編集]

Valgrind (2015-04-15) #

Valgrind: Supported Platforms によると、ARMv7 で Valgrind が使えるようになっていた。 (Valgrind Distribution Documents - 2. NEWS も参照のこと)

Raspberry Pi 2 Model B のCPU は Cortex-A7 なので、使えるはず。 インストールして動作を確認した。

$ apt-cache search valgrind
alleyoop - Front-end to the Valgrind memory checker
codeblocks-contrib - contrib plugins for Code::Blocks IDE
codeblocks-contrib-dbg - Debugging libraries for the Code::Blocks contrib plugins
eclipse-cdt-valgrind - Valgrind integration for Eclipse CDT
eclipse-cdt-valgrind-remote - Valgrind integration for Eclipse CDT (remote launch)
jovie-dbg - debugging symbols for jovie
kaccessible-dbg - debugging symbols for kaccessible
kcachegrind - visualisation tool for the Valgrind profiler
kmag-dbg - debugging symbols for kmag
kmousetool-dbg - debugging symbols for kmousetool
kmouth-dbg - debugging symbols for kmouth
kwalletmanager-dbg - debugging symbols for kwalletmanager
libtest-valgrind-perl - module to test Perl code through valgrind
mutextrace - Lock debugging tool
nemiver - Standalone graphical debugger for GNOME
valgrind - instrumentation framework for building dynamic analysis tools
valgrind-dbg - instrumentation framework for building dynamic analysis tools (debug)
valgrind-mpi - instrumentation framework for building dynamic analysis tools (MPI module)
valkyrie - open-source graphical user interface for the Valgrind

eclipse-cdt-valgrind とか eclipse-cdt-valgrind-remote とかは知らなかったので、あとで試してみるかも。

パッケージ情報

$ apt-cache show valgrind
Package: valgrind
Version: 1:3.7.0-6+rpi1
Architecture: armhf
Maintainer: Alessandro Ghedini <ghedo@debian.org>
Installed-Size: 35723
Depends: libc6 (>= 2.13-28), libgcc1 (>= 1:4.4.0), libc6-dbg
Recommends: valgrind-dbg, gdb
Suggests: valgrind-mpi, kcachegrind, alleyoop, valkyrie (>> 1.3.0)
Homepage: http://www.valgrind.org/
Priority: optional
Section: devel
Filename: pool/main/v/valgrind/valgrind_3.7.0-6+rpi1_armhf.deb
Size: 15820534
SHA256: 28ae807bdb0903e876ba897ecc33aaaf50c56ea63cdfc71316edb137caaf2772
SHA1: be8fe2bdb53b85cc759d5e8eb014c2448d999c82
MD5sum: b8567ecffd417237ba967a3286a7eb5e
Description: instrumentation framework for building dynamic analysis tools
 Valgrind is a system for debugging and profiling Linux programs. With its tool
 suite you can automatically detect many memory management and threading bugs,
 avoiding hours of frustrating bug-hunting and making your programs more stable.
 You can also perform detailed profiling to help speed up your programs and use
 Valgrind to build new tools.
 .
 The Valgrind distribution currently includes six production-quality tools:
  * a memory error detector (Memcheck)
  * two thread error detectors (Helgrind and DRD)
  * a cache and branch-prediction profiler (Cachegrind)
  * a call-graph generating cache and branch-prediction profiler (Callgrind)
  * a heap profiler (Massif)
 It also includes three experimental tools:
  * a stack/global array overrun detector (SGCheck)
  * a second heap profiler that examines how heap blocks are used (DHAT)
  * a SimPoint basic block vector generator (BBV)

apt-get install valgrind で提案されたパッケージのうち valkyrie は他のパッケージをほとんど要求しないので、ためしに入れてみた。

$ sudo apt-get install valgrind valkyrie

2015-04-15 memcheck を試す

以下のソースで試してみた。

[invalid_access.c]

    1  #include <stdio.h>
    2  #include <stdlib.h>
    3  #include <stdint.h>
    4
    5  int main(void) {
    6    uint8_t * heapArray = malloc(sizeof(uint8_t) * 10);
    7
    8    heapArray[0] = 1;
    9    heapArray[100] = 100;  /* Access violation */
   10
   11    printf("heapArray[0]=%d\n", heapArray[0]);
   12    printf("heapArray[100]=%d\n", heapArray[100]);  /* Access violation */
   13
   14    /* forget free(heapArray); */
   15
   16    return 0;
   17  }

デバッグ情報無し:

$ gcc -Wall -Wextra invalid_access.c -o invalid_access
$ valgrind ./invalid_access
==4766== Memcheck, a memory error detector
==4766== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==4766== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==4766== Command: ./invalid_access
==4766==
==4766== Invalid write of size 1
==4766==    at 0x8434: main (in /home/pi/src/scratch/invalid_access)
==4766==  Address 0x498d08c is not stack'd, malloc'd or (recently) free'd
==4766==
heapArray[0]=1
==4766== Invalid read of size 1
==4766==    at 0x845C: main (in /home/pi/src/scratch/invalid_access)
==4766==  Address 0x498d08c is not stack'd, malloc'd or (recently) free'd
==4766==
heapArray[100]=100
==4766==
==4766== HEAP SUMMARY:
==4766==     in use at exit: 10 bytes in 1 blocks
==4766==   total heap usage: 1 allocs, 0 frees, 10 bytes allocated
==4766==
==4766== LEAK SUMMARY:
==4766==    definitely lost: 10 bytes in 1 blocks
==4766==    indirectly lost: 0 bytes in 0 blocks
==4766==      possibly lost: 0 bytes in 0 blocks
==4766==    still reachable: 0 bytes in 0 blocks
==4766==         suppressed: 0 bytes in 0 blocks
==4766== Rerun with --leak-check=full to see details of leaked memory
==4766==
==4766== For counts of detected and suppressed errors, rerun with: -v
==4766== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 13 from 6)

デバッグ情報つき (-g):

$ gcc -g -Wall -Wextra invalid_access.c -o invalid_access
$ valgrind ./invalid_access
==4758== Memcheck, a memory error detector
==4758== Copyright (C) 2002-2011, and GNU GPL'd, by Julian Seward et al.
==4758== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==4758== Command: ./invalid_access
==4758==
==4758== Invalid write of size 1
==4758==    at 0x8434: main (invalid_access.c:9)
==4758==  Address 0x498d08c is not stack'd, malloc'd or (recently) free'd
==4758==
heapArray[0]=1
==4758== Invalid read of size 1
==4758==    at 0x845C: main (invalid_access.c:12)
==4758==  Address 0x498d08c is not stack'd, malloc'd or (recently) free'd
==4758==
heapArray[100]=100
==4758==
==4758== HEAP SUMMARY:
==4758==     in use at exit: 10 bytes in 1 blocks
==4758==   total heap usage: 1 allocs, 0 frees, 10 bytes allocated
==4758==
==4758== LEAK SUMMARY:
==4758==    definitely lost: 10 bytes in 1 blocks
==4758==    indirectly lost: 0 bytes in 0 blocks
==4758==      possibly lost: 0 bytes in 0 blocks
==4758==    still reachable: 0 bytes in 0 blocks
==4758==         suppressed: 0 bytes in 0 blocks
==4758== Rerun with --leak-check=full to see details of leaked memory
==4758==
==4758== For counts of detected and suppressed errors, rerun with: -v
==4758== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 13 from 6)

9行目がinvalid wrie, 12行目がinvalid read になるはず。 行番号は合っているのだが、エラー表示された行がずれてるみたいだ。

2015-04-17 cachegrind で行毎のキャッシュヒット率を調べてみた。

次元配列に2次元のデータ(画像とか)を格納したと見なし、それをラスター順にアクセスして合計を算出するコード

[cache_check.c]

    1  /*
    2
    3  Compile (ANSI C99)
    4  $ gcc -g -std=C99 -Wall -Wextra cache_check.c -o cache_check
    5   */
    6
    7  #include <stdio.h>
    8  #include <stdlib.h>
    9  #include <stdint.h>
   10
   11  int main(void) {
   12    uint8_t * i8array = malloc(sizeof(uint8_t) * 128 * 128);
   13
   14    /* initialize array */
   15    for (int y = 0; y < 128; y++) {
   16      for (int x = 0; x < 128; x++) {
   17        i8array[128 * y + x] = 128 * y + x;
   18      }
   19    }
   20
   21    /* reduction (sum) */
   22    uint32_t sum = 0;
   23    for (int y = 0; y < 128; y++) {
   24      for (int x = 0; x < 128; x++) {
   25        sum += i8array[128 * y + x];
   26      }
   27    }
   28    printf("sum = %d\n", sum);
   29
   30    free(i8array);
   31
   32    return 0;
   33  }
★ANSI C99としてビルド (変数の宣言位置が寄り自由になるので)
$ gcc -g -std=c99 -Wall -Wextra cache_check.c -o cache_check

★実行してみる
$ ./cache_check
sum = 2088960

★cachegrind で計測する
$ valgrind --tool=cachegrind --verbose ./cache_check
==2848== Cachegrind, a cache and branch-prediction profiler
==2848== Copyright (C) 2002-2011, and GNU GPL'd, by Nicholas Nethercote et al.
==2848== Using Valgrind-3.7.0 and LibVEX; rerun with -h for copyright info
==2848== Command: ./cache_check
==2848==
--2848-- Valgrind options:
--2848--    --suppressions=/usr/lib/valgrind/debian-libc6-dbg.supp
--2848--    --tool=cachegrind
--2848--    --verbose
--2848-- Contents of /proc/version:
--2848--   Linux version 3.18.11-v7+ (dc4@dc4-XPS13-9333) (gcc version 4.8.3 20140303 (prerelease) 
(crosstool-NG linaro-1.13.1+bzr2650 - Linaro GCC 2014.03) ) #777 SMP PREEMPT Sat Apr 11 17:30:37 BST 2015
--2848-- Arch and hwcaps: ARM, ARMv7-vfp-neon
--2848-- Page sizes: currently 4096, max supported 4096
--2848-- Valgrind library directory: /usr/lib/valgrind
--2848-- Warning: Cannot auto-detect cache config on ARM, using one or more defaults
==2848== Cache configuration used: ★エミュレートしたキャッシュの設定。デフォルトはホスト(Cortex-A7)と同じ?
==2848==   I1: 16,384 B, 4-way, 64 B lines
==2848==   D1: 16,384 B, 4-way, 64 B lines
==2848==   LL: 262,144 B, 8-way, 64 B lines
--2848-- Reading syms from /home/pi/src/scratch/cache_check (0x8000)
--2848-- Reading syms from /lib/arm-linux-gnueabihf/ld-2.13.so (0x4000000)
--2848--   Considering /lib/arm-linux-gnueabihf/ld-2.13.so ..
--2848--   .. CRC mismatch (computed 9142f4fb wanted 894d9514)
--2848--   Considering /usr/lib/debug/lib/arm-linux-gnueabihf/ld-2.13.so ..
--2848--   .. CRC is valid
--2848-- Reading syms from /usr/lib/valgrind/cachegrind-arm-linux (0x38000000)
--2848--   Considering /usr/lib/valgrind/cachegrind-arm-linux ..
--2848--   .. CRC mismatch (computed 1a52e8e8 wanted 9d3c6d52)
--2848--   Considering /usr/lib/debug/usr/lib/valgrind/cachegrind-arm-linux ..
--2848--   .. CRC is valid
--2848--    object doesn't have a dynamic symbol table
==2848== embedded gdbserver: reading from /tmp/vgdb-pipe-from-vgdb-to-2848-by-pi-on-???
==2848== embedded gdbserver: writing to   /tmp/vgdb-pipe-to-vgdb-from-2848-by-pi-on-???
==2848== embedded gdbserver: shared mem   /tmp/vgdb-pipe-shared-mem-vgdb-2848-by-pi-on-???
==2848==
==2848== TO CONTROL THIS PROCESS USING vgdb (which you probably
==2848== don't want to do, unless you know exactly what you're doing,
==2848== or are doing some strange experiment):
==2848==   /usr/lib/valgrind/../../bin/vgdb --pid=2848 ...command...
==2848==
==2848== TO DEBUG THIS PROCESS USING GDB: start GDB like this
==2848==   /path/to/gdb ./cache_check
==2848== and then give GDB the following command
==2848==   target remote | /usr/lib/valgrind/../../bin/vgdb --pid=2848
==2848== --pid is optional if only one valgrind process is running
==2848==
--2848-- Reading syms from /usr/lib/valgrind/vgpreload_core-arm-linux.so (0x4827000)
--2848--   Considering /usr/lib/valgrind/vgpreload_core-arm-linux.so ..
--2848--   .. CRC mismatch (computed af6eafeb wanted c297409c)
--2848--   Considering /usr/lib/debug/usr/lib/valgrind/vgpreload_core-arm-linux.so ..
--2848--   .. CRC is valid
--2848-- Reading syms from /usr/lib/arm-linux-gnueabihf/libcofi_rpi.so (0x4831000)
--2848-- Reading syms from /lib/arm-linux-gnueabihf/libc-2.13.so (0x484b000)
--2848--   Considering /lib/arm-linux-gnueabihf/libc-2.13.so ..
--2848--   .. CRC mismatch (computed c5b5bcf6 wanted 47e3b85a)
--2848--   Considering /usr/lib/debug/lib/arm-linux-gnueabihf/libc-2.13.so ..
--2848--   .. CRC is valid
sum = 2088960
==2848==
==2848== I   refs:      779,390
==2848== I1  misses:      1,050
==2848== LLi misses:        863
==2848== I1  miss rate:    0.13%
==2848== LLi miss rate:    0.11%
==2848==
==2848== D   refs:      358,507  (276,166 rd   + 82,341 wr)
==2848== D1  misses:      2,641  (  2,146 rd   +    495 wr)
==2848== LLd misses:      1,906  (  1,464 rd   +    442 wr)
==2848== D1  miss rate:     0.7% (    0.7%     +    0.6%  )
==2848== LLd miss rate:     0.5% (    0.5%     +    0.5%  )
==2848==
==2848== LL refs:         3,691  (  3,196 rd   +    495 wr)
==2848== LL misses:       2,769  (  2,327 rd   +    442 wr)
==2848== LL miss rate:      0.2% (    0.2%     +    0.5%  )

★cachegrindの結果を見やすくして、ソースコードと関連づけて表示する
$ cg_annotate --auto=yes cachegrind.out.2848
--------------------------------------------------------------------------------
I1 cache:         16384 B, 64 B, 4-way associative
D1 cache:         16384 B, 64 B, 4-way associative
LL cache:         262144 B, 64 B, 8-way associative
Command:          ./cache_check
Data file:        cachegrind.out.2848
Events recorded:  Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
Events shown:     Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
Event sort order: Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
Thresholds:       0.1 100 100 100 100 100 100 100 100
Include dirs:
User annotated:
Auto-annotation:  on

--------------------------------------------------------------------------------
     Ir  I1mr ILmr      Dr  D1mr  DLmr     Dw D1mw DLmw
--------------------------------------------------------------------------------
779,390 1,050  863 276,166 2,146 1,464 82,341  495  442  PROGRAM TOTALS

--------------------------------------------------------------------------------
     Ir I1mr ILmr      Dr D1mr DLmr     Dw D1mw DLmw  file:function
--------------------------------------------------------------------------------
609,311    7    4 230,151   10    0 66,054  256  255  /home/pi/src/scratch/cache_check.c:main
 48,285   10   10  13,328  735  574     18    1    0  /eglibc-2.13/elf/dl-addr.c:_dl_addr
 28,305   12   12   9,609  255  131  4,113    6    0  /eglibc-2.13/elf/dl-lookup.c:do_lookup_x
 13,946   14    9   4,220   96   81  2,335   12    0  /eglibc-2.13/elf/dl-lookup.c:_dl_lookup_symbol_x
  9,586   14    9       0    0    0      0    0    0  ???:__udivsi3
  9,476   20   20   2,324  227  194  2,055    6    1  /eglibc-2.13/elf/../ports/sysdeps/arm/dl-machine.h:_dl_relocate_object
  8,390    1    1   2,706   45   16      0    0    0  /eglibc-2.13/string/strcmp.c:strcmp
  5,592   12   12   2,024  236  199    136    2    0  /eglibc-2.13/elf/do-rel.h:_dl_relocate_object
  4,542    7    6   1,966   39    9    558    0    0  /eglibc-2.13/elf/dl-lookup.c:check_match.8400
  2,427    6    5      19    2    1    604   10   10  /eglibc-2.13/elf/rtld.c:_dl_start
  2,295    7    4     745    3    2    745    4    4  /eglibc-2.13/string/mempcpy.c:mempcpy
  2,098   20   12     255   25   25     42    0    0  /eglibc-2.13/elf/dl-load.c:check_arm_attributes_hfabi
  2,026    3    3     431    1    1     27    0    0  /eglibc-2.13/elf/dl-minimal.c:strsep
  1,826   44   32     528    8    3    200    2    2  /eglibc-2.13/elf/dl-load.c:_dl_map_object_from_fd
  1,534   25   25     191    2    1    113    3    3  /eglibc-2.13/elf/../elf/dl-sysdep.c:_dl_important_hwcaps
  1,495   33   30     297    3    1    129    2    2  /eglibc-2.13/elf/dl-deps.c:_dl_map_object_deps
  1,356    6    2     511   12    0    252    1    1  /eglibc-2.13/elf/dl-misc.c:_dl_name_match_p
  1,249   11   11     384    2    1    102    0    0  /eglibc-2.13/elf/dl-load.c:open_path
  1,217    2    2     128    3    3      0    0    0  /eglibc-2.13/string/../ports/sysdeps/arm/strlen.S:strlen
  1,154   18   10     226    7    4     55    2    1  /eglibc-2.13/string/strchr.c:index
  1,087    4    2       0    0    0    774   50   49  /eglibc-2.13/string/../ports/sysdeps/arm/memset.S:memset
  1,018   14   14     342   12    9    156    6    6  /eglibc-2.13/elf/dl-version.c:_dl_check_map_versions
  1,013   63   59     260   27   16    102    5    5  /eglibc-2.13/elf/rtld.c:dl_main
    939   13    8     154   13   13     91    9    9  /eglibc-2.13/elf/dynamic-link.h:_dl_map_object_from_fd
    918   22   12     327    6    4    206    1    1  /eglibc-2.13/elf/dl-load.c:open_verify
    888    3    3     333    0    0    333    2    0  ???:__aeabi_uidivmod
    882    5    5     141    9    9     33    0    0  /eglibc-2.13/elf/dl-cache.c:_dl_cache_libcmp
    826    5    4     251    5    1    192    0    0  /eglibc-2.13/elf/dl-minimal.c:__libc_memalign
    814   18   13     314    9    8    126    2    2  /eglibc-2.13/string/memcmp.c:bcmp
    788   15   15     259   13    1    168    0    0  /eglibc-2.13/elf/dl-reloc.c:_dl_relocate_object
    786   29   24     197    5    2     92    2    2  /eglibc-2.13/elf/dl-load.c:_dl_map_object
    786   18   10     142    9    5    118   17   17  /eglibc-2.13/elf/dl-object.c:_dl_new_object
    785    3    3      13    1    1    266   16   16  /eglibc-2.13/malloc/malloc.c:malloc_consolidate

--------------------------------------------------------------------------------
-- Auto-annotated source: /home/pi/src/scratch/cache_check.c
--------------------------------------------------------------------------------
     Ir I1mr ILmr     Dr D1mr DLmr     Dw D1mw DLmw

-- line 3 ----------------------------------------
      .    .    .      .    .    .      .    .    .  Compile (ANSI C99)
      .    .    .      .    .    .      .    .    .  $ gcc -g -std=C99 -Wall -Wextra cache_check.c -o cache_check
      .    .    .      .    .    .      .    .    .   */
      .    .    .      .    .    .      .    .    .
      .    .    .      .    .    .      .    .    .  #include <stdio.h>
      .    .    .      .    .    .      .    .    .  #include <stdlib.h>
      .    .    .      .    .    .      .    .    .  #include <stdint.h>
      .    .    .      .    .    .      .    .    .
      3    0    0      0    0    0      2    0    0  int main(void) {
      4    1    1      0    0    0      1    0    0    uint8_t * i8array = malloc(sizeof(uint8_t) * 128 * 128);
      .    .    .      .    .    .      .    .    .
      .    .    .      .    .    .      .    .    .    /* initialize array */
    774    1    1    257    0    0    129    0    0    for (int y = 0; y < 128; y++) {
 99,072    1    1 32,896    0    0 16,512    0    0      for (int x = 0; x < 128; x++) {
245,760    0    0 81,920    0    0 16,384  256  255        i8array[128 * y + x] = 128 * y + x;
      .    .    .      .    .    .      .    .    .      }
      .    .    .      .    .    .      .    .    .    }
      .    .    .      .    .    .      .    .    .
      .    .    .      .    .    .      .    .    .    /* reduction (sum) */
      2    0    0      0    0    0      1    0    0    uint32_t sum = 0;
    774    1    0    257    0    0    129    0    0    for (int y = 0; y < 128; y++) {
 99,072    1    1 32,896    0    0 16,512    0    0      for (int x = 0; x < 128; x++) {
163,840    0    0 81,920    9    0 16,384    0    0        sum += i8array[128 * y + x];
      .    .    .      .    .    .      .    .    .      }
      .    .    .      .    .    .      .    .    .    }
      4    0    0      2    1    0      0    0    0    printf("sum = %d\n", sum);
      .    .    .      .    .    .      .    .    .
      2    1    0      1    0    0      0    0    0    free(i8array);
      .    .    .      .    .    .      .    .    .
      1    1    0      0    0    0      0    0    0    return 0;
      3    0    0      2    0    0      0    0    0  }

--------------------------------------------------------------------------------
The following files chosen for auto-annotation could not be found:
--------------------------------------------------------------------------------
  /eglibc-2.13/string/strcmp.c
  /eglibc-2.13/elf/do-rel.h
  /eglibc-2.13/elf/dl-load.c
  /eglibc-2.13/elf/dl-object.c
  /eglibc-2.13/elf/dl-lookup.c
  /eglibc-2.13/elf/dl-reloc.c
  /eglibc-2.13/string/strchr.c
  /eglibc-2.13/malloc/malloc.c
  /eglibc-2.13/elf/../ports/sysdeps/arm/dl-machine.h
  /eglibc-2.13/elf/dl-cache.c
  /eglibc-2.13/elf/dl-addr.c
  /eglibc-2.13/string/memcmp.c
  /eglibc-2.13/elf/dl-minimal.c
  /eglibc-2.13/string/../ports/sysdeps/arm/strlen.S
  /eglibc-2.13/elf/rtld.c
  /eglibc-2.13/elf/../elf/dl-sysdep.c
  /eglibc-2.13/string/mempcpy.c
  /eglibc-2.13/elf/dl-version.c
  /eglibc-2.13/elf/dynamic-link.h
  /eglibc-2.13/elf/dl-misc.c
  /eglibc-2.13/string/../ports/sysdeps/arm/memset.S
  /eglibc-2.13/elf/dl-deps.c

--------------------------------------------------------------------------------
Ir I1mr ILmr Dr D1mr DLmr Dw D1mw DLmw
--------------------------------------------------------------------------------
78    1    0 83    0    0 80   52   58  percentage of events annotated
[編集]

OpenMP (2015-02-11) #

g++ 4.6.3 で C++11 を使うには -std=c++0x を、OpenMP を使うには -fopenmp を指定する。

g++ -Wall -Wextra -std=c++0x -fopenmp sample.cpp

以前作ったサンプルコード(非公開)を実行してみた:

$ ./OpenMP-sample
-------------------------------- src/main.cpp
__GNUC__        4
__GNUC_MINOR__  6
__GNUC_PATCHLEVEL__     3
================================ src/omp_environment.cpp
-------- show_version
OpenMPのバージョン (規格の発行年月が表示される)
_OPENMP 200805     ★OpenMP 3.0 (May, 2008)

-------- omp_get_wtick, omp_get_wtime
時計の分解能(単位=秒)
omp_get_wtick() 0.010000000  ★↓を見ると、もっと分解能がありそう。

実行所要時間(単位=秒)の取得と、時計のオーバーヘッド    ★オーバーヘッドは 0.15〜0.3ms くらい。
omp_get_wtime() lapse
1672.677471118
1672.677658669  0.000187551   
1672.677814606  0.000343488
1672.678319552  0.000848434
1672.678418874  0.000947756
1672.678555176  0.001084058
1672.678870800  0.001399682
1672.679116893  0.001645775
1672.679249236  0.001778118
1672.679488714  0.002017596
1672.679579703  0.002108585

-------- omp_set_num_threads
プロセッサの個数、スレッド個数の上限(デフォルトはプロセッサの個数と同じ)、並列実行時のスレッドの個数を表示
omp_get_num_procs()     4
omp_get_max_threads()   4
omp_get_num_threads()   1
omp_get_num_threads()   4

スレッド個数の上限を変更して、スレッドの個数を表示
omp_set_num_threads(32)
omp_get_max_threads()   32
omp_get_num_threads()   32

スレッド個数の上限をプロセッサ(CPU)の個数にする(デフォルト値)
omp_set_num_threads(omp_get_num_procs());
omp_get_max_threads()   4
omp_get_num_threads()   4

-------- work_sharing
#pragma omp parallel
  omp_get_thread_num()  1
  omp_get_thread_num()  2
  omp_get_thread_num()  3
  omp_get_num_threads() 4
  omp_get_thread_num()  0

#pragma omp parallel sections
13213132122321333333333333333333333333333331311313133333333333333332332332322323233232323232323232323232323232323232323333333333333333333333
#pragma omp parallel for
2212221211211212121212121212121212121212121212121100000000000000000000000003333333333333333333333333

-------- schedule
処理をどのスレッドで受け持つか(schedule)を変更
forループの schedule = static, dyanmic, guided のスレッド番号を調べる
#pragma omp parallel for schedule(static) デフォルト2102010202113333
#pragma omp parallel for schedule(dynamic)1212121221212121
#pragma omp parallel for schedule(dynamic, 10)1110101001001111
#pragma omp parallel for schedule(guided)1021212111111100
#pragma omp parallel for schedule(guided, 10)1212121212121111

処理の番号(i)とスレッド番号の対応
i       static  dynamic,1       dynamic,10      guided,1        guided,10
0       0       1       1       1       1
1       0       2       1       1       1
2       0       1       1       1       1
3       0       2       1       1       1
4       1       1       1       2       1
5       1       2       1       2       1
6       1       1       1       2       1
7       1       2       1       0       1
8       2       2       1       0       1
9       2       1       1       0       1
10      2       2       0       1       2
11      2       1       0       1       2
12      3       2       0       1       2
13      3       1       0       1       2
14      3       2       0       1       2
15      3       1       0       1       2

================================ src/omp_individual.cpp
omp_get_max_threads()   4
omp_individual_work_size        uint8_t * 4096 * 4096

-------- gaussian_3x3_single_thread
ms      check   n_diff_pixels
2564.882362     OK      0
2550.656086     OK      0
2548.113304     OK      0
2547.112076     OK      0
2545.456788     OK      0
2546.855083     OK      0
2545.650416     OK      0
2545.925222     OK      0
2544.560816     OK      0
2545.884577     OK      0

-------- gaussian_3x3_openmp_for_outer_loop
ms      check   n_diff_pixels
641.776434      OK      0
626.879151      OK      0
674.770125      OK      0
626.764525      OK      0
674.721595      OK      0
626.209382      OK      0
674.698221      OK      0
627.517407      OK      0
674.440835      OK      0
627.202262      OK      0

-------- gaussian_3x3_openmp_for_inner_loop
ms      check   n_diff_pixels
748.730422      OK      0
669.946650      OK      0
699.864569      OK      0
750.428612      OK      0
671.053537      OK      0
749.915500      OK      0
671.267453      OK      0
729.486782      OK      0
699.267937      OK      0
709.807593      OK      0

-------- gaussian_3x3_openmp_for_both_loop
ms      check   n_diff_pixels
655.128886      OK      0
654.878320      OK      0
694.150062      OK      0
655.224995      OK      0
699.691666      OK      0
655.453909      OK      0
699.351364      OK      0
654.958243      OK      0
700.086687      OK      0
656.681634      OK      0

================================ src/omp_reduction_256bin.cpp
omp_get_max_threads()   4
omp_reduction_256bin_work_size  uint8_t * 4096 * 4096

-------- histogram_256bin_single_thread
ms      check   num_diff
163.604907      OK      0
165.135423      OK      0
164.131885      OK      0
164.508447      OK      0
163.600533      OK      0
164.103032      OK      0
163.540689      OK      0
164.057251      OK      0
163.572514      OK      0
164.401470      OK      0

-------- histogram_256bin_openmp_bad
ms      check   num_diff
268.962466      BAD     256
279.571805      BAD     256
278.824309      BAD     256
278.656550      BAD     256
278.546290      BAD     256
278.587175      BAD     256
267.763620      BAD     256
278.628584      BAD     256
279.117905      BAD     256
278.600408      BAD     256

-------- histogram_256bin_openmp_private_array
ms      check   num_diff
47.936192       OK      0
47.874941       OK      0
47.934525       OK      0
47.992390       OK      0
48.008691       OK      0
48.335409       OK      0
47.938015       OK      0
47.879212       OK      0
47.920514       OK      0
47.949837       OK      0

-------- histogram_256bin_openmp_atomic
ms      check   num_diff
429.840990      OK      0
397.410739      OK      0
396.484961      OK      0
396.533973      OK      0
429.769487      OK      0
396.760745      OK      0
396.848976      OK      0
396.552988      OK      0
429.939024      OK      0
396.982781      OK      0

-------- histogram_256bin_openmp_critical
ms      check   num_diff
4154.972577     OK      0
4205.215623     OK      0
4199.205732     OK      0
4161.488698     OK      0
4149.992617     OK      0
4205.745539     OK      0
4185.637243     OK      0
4197.598324     OK      0
4181.936414     OK      0
4179.929044     OK      0

================================ src/omp_reduction_1bin.cpp
omp_get_max_threads()   4
omp_reduction_1bin_work_size    uint8_t * 4096 * 4096

-------- sum_single_thread
ms      check   sum_diff
63.674338       OK      0
63.710328       OK      0
63.673036       OK      0
63.636266       OK      0
63.659755       OK      0
63.668766       OK      0
63.639964       OK      0
63.773661       OK      0
63.647152       OK      0
63.720953       OK      0

-------- sum_openmp_bad
ms      check   sum_diff
23.244513       BAD     -1603788654
22.975763       BAD     -1604076233
23.236337       BAD     -1604067525
22.970400       BAD     -1603727838
24.618312       BAD     -1604072241
23.294826       BAD     -1604063120
23.186180       BAD     -1604076233
22.964462       BAD     -1604069153
31.515322       BAD     -1604132288
42.129873       BAD     -1187849365

-------- sum_openmp_reduction_sum
ms      check   sum_diff
34.089689       OK      0
29.089964       OK      0
17.605884       OK      0
17.759791       OK      0
17.424375       OK      0
17.779009       OK      0
17.518697       OK      0
17.776509       OK      0
17.489323       OK      0
17.735416       OK      0

-------- sum_openmp_atomic
ms      check   sum_diff
1330.859795     OK      0
1320.857753     OK      0
1320.987869     OK      0
1320.553819     OK      0
1320.988465     OK      0
1320.628895     OK      0
1330.595751     OK      0
1320.730271     OK      0
1320.514763     OK      0
1320.376337     OK      0

-------- sum_openmp_critical
ms      check   sum_diff
4385.937429     OK      0
4365.334330     OK      0
4361.050503     OK      0
4409.528609     OK      0
4366.287441     OK      0
4384.821565     OK      0
4380.404920     OK      0
4370.798285     OK      0
4384.306949     OK      0
4359.819101     OK      0

(2015-02-15)

ガウシアンカーネル 3x3 で 4096x4096x8bitを、スレッドの個数を変えて処理してみた。

$ g++ -Wall -Wextra -std=c++0x -fopenmp openmp_gaussian.cpp -o openmp_gaussian

$ ./openmp_gaussian
omp_get_max_threads()   4
omp_individual_work_size        uint8_t * 4096 * 4096

elapse time = 3.89343

$ OMP_NUM_THREADS=4 ./openmp_gaussian
omp_get_max_threads()   4
omp_individual_work_size        uint8_t * 4096 * 4096

elapse time = 3.89494

$ OMP_NUM_THREADS=3 ./openmp_gaussian
omp_get_max_threads()   3
omp_individual_work_size        uint8_t * 4096 * 4096

elapse time = 5.19081

$ OMP_NUM_THREADS=2 ./openmp_gaussian
omp_get_max_threads()   2
omp_individual_work_size        uint8_t * 4096 * 4096

elapse time = 7.78272

$ OMP_NUM_THREADS=1 ./openmp_gaussian
omp_get_max_threads()   1
omp_individual_work_size        uint8_t * 4096 * 4096

elapse time = 15.5639

[openmp_gaussian.cpp]

// -*- tab-width : 4 ; mode : C++ -*-
// Raspberry Pi 2 Model B, g++ 4.6.3
// g++ -Wall -Wextra -std=c++0x -fopenmp openmp_gaussian.cpp -o openmp_gaussian


#include <iostream>
#include <vector>
#include <cstdint>

#include <omp.h>

namespace {

/**
 * 3x3 ガウシアンフィルタ カーネル
 *
 * @param[out] dst 出力画像配列
 * @param[in] src 入力画像配列
 * @param[in] size_x 画像配列の大きさX
 * @param[in] x 着目座標X
 * @param[in] y 着目座標X
 */
inline void
gaussian_3x3(
    std::vector<uint8_t> & dst,
    const std::vector<uint8_t> & src,
    const int size_x,
    const int x,
    const int y
) {
    const int gaussian[][3] = {
        { 1, 2, 1 },
        { 2, 4, 2 },
        { 1, 2, 1 },
    };
    const int denominator = 16;
    const int half = 3 / 2;

    int sum = 0;
    for (int dy = -half; dy <= half; ++dy) {
        for (int dx = -half; dx <= half; ++dx) {
            const size_t index = ((y + dy) * size_x) + (x + dx);
            sum += gaussian[dy + half][dx + half] * src[index];
        }
    }

    dst[y * size_x + x] = uint8_t(sum / denominator);
}

/**
 * ガウシアンフィルタ
 * - OpenMP 外側のループを並列化
 *
 * @param[out] dst 出力画像配列
 * @param[in] src 入力画像配列
 * @param[in] size_x 画像配列の大きさX
 * @param[in] size_y 画像配列の大きさY
 */
void
gaussian_3x3_openmp_for_outer_loop(
    std::vector<uint8_t> & dst,
    const std::vector<uint8_t> & src,
    const int size_x,
    const int size_y
) {
    #pragma omp parallel for
    for (int y = 1; y < size_y - 1; ++y) {
        for (int x = 1; x < size_x - 1; ++x) {
            gaussian_3x3(dst, src, size_x, x, y);
        }
    }
}

} // namespace

int
main(int, char *[]) {
    using std::cout;
    using std::endl;

    cout << "omp_get_max_threads()\t" << omp_get_max_threads() << endl;

    // 入力データサイズ
    const int SIZE_X = 1024 * 4;
    const int SIZE_Y = 1024 * 4;
    cout << "omp_individual_work_size\t" << "uint8_t * " << SIZE_X << " * " << SIZE_Y << endl;
    cout << std::endl;

    // 入力データを作成する
    std::vector<uint8_t> src(SIZE_X * SIZE_Y);
    srand(0);
    for (int i = 0; i < SIZE_X * SIZE_Y; ++i) {
        src[i] = uint8_t((rand() >> 2) % 256);  // 下2bit捨ててから、0〜255の値を得る。
    }

    std::vector<uint8_t> dst(SIZE_X * SIZE_Y);

    const double start = omp_get_wtime();
    gaussian_3x3_openmp_for_outer_loop(dst, src, SIZE_X, SIZE_Y);
    const double end = omp_get_wtime();

    cout << "elapse time = " << (end - start) << endl;

    return 0;
}
[編集]

cpuinfo, bogoMIPS (2015-02-11) #

TODO

2015-02-13

/proc/cpuinfo, BogoMIPS

$ cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 5 (v7l)
BogoMIPS        : 38.40
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 5

processor       : 1
(略)
processor       : 2
(略)
processor       : 3
(略)

やたらとBogoMIPSが小さい。??

[編集]

microSD #

[編集]

dump でバックアップ (2015-04-19) #

dump コマンドでバックアップしてみる。 バックアップ先はNAS、あるいばUSBメモリで。

情報源:

dumpコマンドをインストールする。念のためコマンドの絶対パスを調べておく。

$ sudo apt-get install dump

$ dpkg -S /sbin/dump
dump: /sbin/dump

$ dpkg -S /sbin/restore
dump: /sbin/restore

バックアップ先のファイル名を自動生成する。 (注意: ホスト名は raspi-config で 'raspi2-4' に変更している) echo コマンドで試す:

$ echo $(hostname --short)-$(date +%Y%m%d-%H%M%S).dump.gz
raspi2-4-20150418-223223.879407545.dump.gz

手動でNASの共有フォルダをマウントし、dumpして、アンマウントする:

$ sudo -i
# mount -t cifs //NASのIPアドレス/共有フォルダ /mnt -o "user=共有フォルダのユーザ名 password=パスワード"
# dump -0 -f - /dev/root | gzip -c > /mnt/$(hostname --short)-$(date +%Y%m%d-%H%M%S).dump.gz
# umount /mnt/backup
  • hostname: 「--short」で短いホスト名
  • date: 「+%Y%m%d-%H%M%S」で年月日-時分秒
  • dump: 「-0」でダンプレベル=フルバックアップ 「-f -」で出力先を標準出力に
  • gzip: 「-c」で出力先を標準出力に

なお、gzip で圧縮しない場合は、dump コマンドは次のようにする:

# dump -0 -f /mnt/$(hostname --short)-$(date +%Y%m%d-%H%M%S).dump /dev/root

動作を確認したら、一連の作業を /usr/local/sbin/ にシェルスクリプトとして置いておくとよい。

[編集]

restore でリストア (2015-04-25) #

今回は PC のUbuntu 14.04 Desktop amd64 を立ち上げて、microSD カードに対してリストアした。 (VMware 上で行っているが、VMware 自体の操作は略す)。 また、microSD は過去にRaspbianを入れていた物を使ったので、パーティションの作成は行ってない

必要なパッケージをインストールする。 今回、バックアップはNASのcifsに作ったので、dumpパッケージの他に、cifs-utils もインストールする。

$ sudo apt-get install dump cifs-utils

microSDを挿入する。今回は過去にRaspbianを入れていたカードを使ったので、パーティションが存在する。 バックアップは2番目のパーティション(root)なので、このパーティションをフォーマットする。

$ sudo umount /dev/sdf2
$ sudo mkfs.ext4 /dev/sdf2

Ubuntu のデスクトップで2番目のパーティションをクリックして「開く」を選ぶとマウントされる。

restore-root-mount.png

NASのディレクトリをマウントする。

$ sudo -i
# mount -t cifs //NASのIPアドレス/共有フォルダ名 /mnt -o "user=ユーザー名"
Password for ユーザー名@//NASのIPアドレス/共有フォルダ名: 

microSDのリストア先ディレクトリに移動して、NAS上のバックアップファイルをカレントディレクトリにリストアする。

# cd /media/Ubuntuのユーザ名/マウントされた名前/
# zcat /mnt/バックアップファイル名.dump.gz | restore -r -f -
# sync

なお、gzipで圧縮していない場合は、restore コマンドは次のようにする:

# restore -r -f /mnt/バックアップファイル名.dump

無事、リストアされた。

# ls
bin/	   dev/   lib/	       mnt/   restoresymtable  sbin/	 sys/  var/
boot/	   etc/   lost+found/  opt/   root/	       selinux/  tmp/
boot.bak/  home/  media/       proc/  run/	       srv/	 usr/

必要の応じてファイルを修正する。 (例:ホスト名を修正するなら、/etc/hostname と /etc/hosts を修正する)

microSDをアンマウントする。これで完了。

# cd 
# umount /mnt
[編集]

dump, restore 実行例 #

dump, 無線LAN, gzip 圧縮あり

無線LAN GW-USNANO2A 経由でNASにバックアップした。 この回線の速度は iperf で 2 〜 10 MB/s くらい。 gzip圧縮あり。2.85 GB で 20分00秒、2491 kB/s。

# dump -0 -f - /dev/root | gzip -c > /mnt/$(hostname --short)-$(date +%Y%m%d-%H%M%S).dump.gz
 DUMP: Date of this level 0 dump: Sun Apr 19 00:50:54 2015
 DUMP: Dumping /dev/root (/) to standard output
 DUMP: Label: none
 DUMP: Writing 10 Kilobyte records
 DUMP: mapping (Pass I) [regular files]
 DUMP: mapping (Pass II) [directories]
 DUMP: estimated 2984885 blocks.
 DUMP: Volume 1 started with block 1 at: Sun Apr 19 00:50:57 2015
 DUMP: dumping (Pass III) [directories]
 DUMP: dumping (Pass IV) [regular files]
 DUMP: 23.44% done at 2332 kB/s, finished in 0:16
 DUMP: 48.78% done at 2426 kB/s, finished in 0:10
 DUMP: 73.83% done at 2448 kB/s, finished in 0:05
 DUMP: 100.00% done at 2489 kB/s, finished in 0:00
 DUMP: Volume 1 completed at: Sun Apr 19 01:10:57 2015
 DUMP: Volume 1 2989740 blocks (2919.67MB)
 DUMP: Volume 1 took 0:20:00
 DUMP: Volume 1 transfer rate: 2491 kB/s
 DUMP: 2989740 blocks (2919.67MB)
 DUMP: finished in 1200 seconds, throughput 2491 kBytes/sec
 DUMP: Date of this level 0 dump: Sun Apr 19 00:50:54 2015
 DUMP: Date this dump completed:  Sun Apr 19 01:10:57 2015
 DUMP: Average transfer rate: 2491 kB/s
 DUMP: DUMP IS DONE

バックアップ元は 2.85GB で、実行所要時間は 20分。

バックアップファイルの大きさは約1.2GBだったので、 42% に圧縮されている。

# ls -l /mnt/backup/raspi2-4-20150419-005054.601461088.dump.gz
-rwxr-xr-x 1 root root 1293060867  4月 19 00:50 /mnt/backup/raspi2-4-20150419-005054.601461088.dump.gz

dump, 有線LAN, gzip 圧縮あり

有線LAN 経由でNASにバックアップした。 gzip圧縮あり。4.0GB で 26分40秒、2630 kB/s。 無線LANよりわずかに速い (2491 kB/s → 2630 kB/s)。GigaEtherなUSB-LANインターフェイスを使えば、もっと速くなるかも。

# dump -0 -f - /dev/root | gzip -c > /mnt/$(hostname --short)-$(date +%Y%m%d-%H%M%S).dump.gz
 DUMP: Date of this level 0 dump: Sun Apr 19 01:34:58 2015
 DUMP: Dumping /dev/root (/) to standard output
 DUMP: Label: none
 DUMP: Writing 10 Kilobyte records
 DUMP: mapping (Pass I) [regular files]
 DUMP: mapping (Pass II) [directories]
 DUMP: estimated 4205829 blocks.
 DUMP: Volume 1 started with block 1 at: Sun Apr 19 01:35:00 2015
 DUMP: dumping (Pass III) [directories]
 DUMP: dumping (Pass IV) [regular files]
 DUMP: 21.82% done at 3059 kB/s, finished in 0:17
 DUMP: 39.32% done at 2756 kB/s, finished in 0:15
 DUMP: 58.54% done at 2735 kB/s, finished in 0:10
 DUMP: 76.46% done at 2679 kB/s, finished in 0:06
 DUMP: 94.63% done at 2653 kB/s, finished in 0:01
 DUMP: Volume 1 completed at: Sun Apr 19 02:01:40 2015
 DUMP: Volume 1 4209400 blocks (4110.74MB)
 DUMP: Volume 1 took 0:26:40
 DUMP: Volume 1 transfer rate: 2630 kB/s
 DUMP: 4209400 blocks (4110.74MB)
 DUMP: finished in 1600 seconds, throughput 2630 kBytes/sec
 DUMP: Date of this level 0 dump: Sun Apr 19 01:34:58 2015
 DUMP: Date this dump completed:  Sun Apr 19 02:01:40 2015
 DUMP: Average transfer rate: 2630 kB/s
 DUMP: DUMP IS DONE

dump, 無線LAN, gzip 圧縮なし

無線LAN GW-USNANO2A 経由でNASにバックアップした。 gzip圧縮無し。2.7GB で 9分20秒、5054 kB/s。

# dump -0 /dev/root -f /mnt/$(hostname --short)-$(date +%Y%m%d-%H%M%S).dump
 DUMP: Date of this level 0 dump: Sun Apr 26 10:29:22 2015
 DUMP: Dumping /dev/root (/) to /mnt/raspi2-4-20150426-102922.dump
 DUMP: Label: none
 DUMP: Writing 10 Kilobyte records
 DUMP: mapping (Pass I) [regular files]
 DUMP: mapping (Pass II) [directories]
 DUMP: estimated 2825425 blocks.
 DUMP: Volume 1 started with block 1 at: Sun Apr 26 10:29:24 2015
 DUMP: dumping (Pass III) [directories]
 DUMP: dumping (Pass IV) [regular files]
 DUMP: 62.85% done at 5918 kB/s, finished in 0:02
 DUMP: Closing /mnt/raspi2-4-20150426-102922.dump
 DUMP: Volume 1 completed at: Sun Apr 26 10:38:44 2015
 DUMP: Volume 1 2830310 blocks (2763.97MB)
 DUMP: Volume 1 took 0:09:20
 DUMP: Volume 1 transfer rate: 5054 kB/s
 DUMP: 2830310 blocks (2763.97MB) on 1 volume(s)
 DUMP: finished in 502 seconds, throughput 5638 kBytes/sec
 DUMP: Date of this level 0 dump: Sun Apr 26 10:29:22 2015
 DUMP: Date this dump completed:  Sun Apr 26 10:38:44 2015
 DUMP: Average transfer rate: 5054 kB/s
 DUMP: DUMP IS DONE

dump, USBメモリ, gzip 圧縮なし

USBメモリ SanDisk SDCZ80-032G にバックアップした。 バックアップ先のファイルシステムは FAT32。 gzip圧縮無し。2.7GB で 4分15秒、11,099 kB/s。

# parted -l
Model: SanDisk Extreme (scsi)
Disk /dev/sda: 32.0GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      16.4kB  32.0GB  32.0GB  primary  fat32        lba


Model: SD USDU1 (sd/mmc)
Disk /dev/mmcblk0: 16.2GB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

Number  Start   End     Size    Type     File system  Flags
 1      4194kB  62.9MB  58.7MB  primary  fat16        lba
 2      62.9MB  15.1GB  15.0GB  primary  ext4

# mount /dev/sda1 /mnt
# dump -0 /dev/root -f /mnt/$(hostname --short)-$(date +%Y%m%d-%H%M%S).dump
 DUMP: Date of this level 0 dump: Sun Apr 26 10:48:28 2015
 DUMP: Dumping /dev/root (/) to /mnt/raspi2-4-20150426-104828.dump
 DUMP: Label: none
 DUMP: Writing 10 Kilobyte records
 DUMP: mapping (Pass I) [regular files]
 DUMP: mapping (Pass II) [directories]
 DUMP: estimated 2825425 blocks.
 DUMP: Volume 1 started with block 1 at: Sun Apr 26 10:48:30 2015
 DUMP: dumping (Pass III) [directories]
 DUMP: dumping (Pass IV) [regular files]
 DUMP: Closing /mnt/raspi2-4-20150426-104828.dump
 DUMP: Volume 1 completed at: Sun Apr 26 10:52:45 2015
 DUMP: Volume 1 2830310 blocks (2763.97MB)
 DUMP: Volume 1 took 0:04:15
 DUMP: Volume 1 transfer rate: 11099 kB/s
 DUMP: 2830310 blocks (2763.97MB) on 1 volume(s)
 DUMP: finished in 255 seconds, throughput 11099 kBytes/sec
 DUMP: Date of this level 0 dump: Sun Apr 26 10:48:28 2015
 DUMP: Date this dump completed:  Sun Apr 26 10:52:45 2015
 DUMP: Average transfer rate: 11099 kB/s
 DUMP: DUMP IS DONE
# umount /mnt
[編集]

/ パーティションサイズを14GiB に統一した (2015-03-01) #

Ubuntu 14.04 Desktop の仮想マシンを使って、複数のmicroSD に入れた Raspbian や Ubuntu (Raspberry Pi 2専用版) の / パーティションサイズを 14 GiB (14 * 1024 * 1024) に統一した。

こうやっておけば、16GB の MicroSD の容量が多少少なくても、コピーして動かせるはず。 コピーには DD for Windows - シリコンリナックス株式会社 の「ディスクサイズより大きなイメージファイルの書込を許可」する機能を使う。

手順:

(今回は PC で VMware Workstation 11.1.0 で、Ubuntu 14.04 Desktop の仮想マシンを使っている。スクリーンショットを撮るため)

1. (VMware で) Ubuntu 14.04 Desktop を起動する。

2. gparted をインストールする。「sudo apt-get install gparted」

3. (VMware を使ったので: VM -> 取り外し可能デバイス の USB microSDカードリーダー を「接続」する。)

gparted-005.png

4. microSD をカードリーダーに差し込むと、マウントされる。

5. gparted で / パーティションの大きさを小さくする。

5.1 Gparted(G) -> デバイスを更新

gparted-006.png

5.2 microSD のデバイスを選択する。手元では /dev/sdf だった

gparted-007.png

5.3 パーティション2 を選択して右クリックし(手元では/dev/sdf2)、「アンマウント(U)」を選ぶ。

gparted-008.png

5.4 パーティション2 を選択して右クリックし(手元では/dev/sdf2)、「リサイズ/移動(R)」を選ぶ。

gparted-001.png

5.5 「新しいサイズ」を小さくして、「リサイズ/移動」ボタンを押す。今回は 14336 MiB (=14 * 1024 = 14 GiB) にした。

gparted-002.png

5.6 ツールバーの緑の「チェック」を押して、適用する。

gparted-003.png

6. ドック? の USB メモリっぽいアイコンを右クリックして、「親ドライブを取り出す」を選ぶ。microSDが切り離されるので、カードリーダーから取り出す。

gparted-004.png

[編集]

microSD の容量・速度 (2015-02-12) #

情報源:

以下のmicroSDを使用した。

1,2は手持ちの物。3は今回新たに購入した物で、これを主に使う予定。

#概略型番容量(SDFormatter)速度(Win32 Disk Imager write, read)
1Toshiba class 414.8GB (15,989,780,992 byte)write 8.8MB/s, read 13.4〜20.2MB/s2015-02-12
2Samsung class 10MB-MP16D14.6GB (15,710,121,472 byte)write 17.3MB/s, read 27〜32MB/s2015-02-12
3Transcend class 10 UHI-1, MLCTS16GUSDHC10U115.0GB (16,162,511,872 byte)write 32.2MB/s, read 31.8〜32.6MB/s2015-02-12
4Transcend class 10TS16GUSDU1E14.7GB (15,800,599,552 byte)write 12.4〜13.1MB/s, read 32.1〜36.6MB/s2015-02-22

速度は、IODATA USB2-W63RW と Seagate ST2000DM001 間の転送時の値を記載した。

cd /sys/class/mmc_host/mmc?/mmc?:*
echo "man:$(cat manfid) oem:$(cat oemid) name:$(cat name) hwrev:$(cat hwrev) fwrev:$(cat fwrev)"
  • Toshiba class 4 : (未確認)
  • MB-MP16D : (未確認)
  • TS16GUSDHC10U1 : man:0x000074 oem:0x4a60 name:USDU1 hwrev:0x2 fwrev:0x0 (手持ちの4枚は全て同じ値だった)
[編集]

fio - Flexible I/O Tester (2015-02-22) #

を見て、fio を試してみた。

fio は git.kernel.dk Git - fio.git/summary から最新のタグ fio-2.2.5 を用いた。

手順:

sudo apt-get install -y libaio-dev
git clone -b fio-2.2.5 git://git.kernel.dk/fio.git
cd fio
./configure && make && sudo make install
cd ..
wget http://www.winkey.jp/downloads/visit.php/fio-crystaldiskmark
fio fio-crystaldiskmark | perl -ne '
print "$1 : " if(/(.+): \(groupid=/);
print "$1 " if(/bw=([\d. ]+[KM]?B\/s)/);
print "[ $1 IOPS]\n" if(/iops=(\d+)/)'

Transcend TS16GUSDHC10U1 (class 10, UHC-1, MLC):

Seq-Read : 19049KB/s [ 18 IOPS]
Seq-Write : 8478.4KB/s [ 8 IOPS]
Rand-Read-512K : 18929KB/s [ 36 IOPS]
Rand-Write-512K : 6140.9KB/s [ 11 IOPS]
Rand-Read-4K : 4142.3KB/s [ 1035 IOPS]
Rand-Write-4K : 114071B/s [ 27 IOPS]
Rand-Read-4K-QD32 : 5431.8KB/s [ 1357 IOPS]
Rand-Write-4K-QD32 : 187558B/s [ 45 IOPS]

Transcend TS16GUSDU1E (class 10):

Seq-Read : 18965KB/s [ 18 IOPS]
Seq-Write : 8285.8KB/s [ 8 IOPS]
Rand-Read-512K : 18921KB/s [ 36 IOPS]
Rand-Write-512K : 2258.6KB/s [ 4 IOPS]
Rand-Read-4K : 4293.2KB/s [ 1073 IOPS]
Rand-Write-4K : 602501B/s [ 147 IOPS]
Rand-Read-4K-QD32 : 5050.4KB/s [ 1262 IOPS]
Rand-Write-4K-QD32 : 372645B/s [ 90 IOPS]

Samsung MB-MP16D (class 10):

Seq-Read : 18875KB/s [ 18 IOPS]
Seq-Write : 10404KB/s [ 10 IOPS]
Rand-Read-512K : 18704KB/s [ 36 IOPS]
Rand-Write-512K : 1578.2KB/s [ 3 IOPS]
Rand-Read-4K : 5293.8KB/s [ 1323 IOPS]
Rand-Write-4K : 669128B/s [ 163 IOPS]
Rand-Read-4K-QD32 : 6519.2KB/s [ 1629 IOPS]
Rand-Write-4K-QD32 : 553794B/s [ 135 IOPS]

USBメモリ SDCZ80 32GB (EXT4 でフォーマット):

Seq-Read : 27990KB/s [ 27 IOPS]
Seq-Write : 25493KB/s [ 24 IOPS]
Rand-Read-512K : 25486KB/s [ 49 IOPS]
Rand-Write-512K : 20748KB/s [ 40 IOPS]
Rand-Read-4K : 6051.0KB/s [ 1512 IOPS]
Rand-Write-4K : 2890.9KB/s [ 722 IOPS]
Rand-Read-4K-QD32 : 6115.4KB/s [ 1528 IOPS]
Rand-Write-4K-QD32 : 2284.9KB/s [ 571 IOPS]

USBメモリは Linuxパーティションを作って、EXT4でフォーマットして、計測用ディレクトリを作成:

$ sudo cfdisk /dev/sda
$ mke2fs -t ext4 /dev/sda1
$ sudo mount /dev/sda1 /mnt
$ sudo mkdir /mnt/tmp
$ sudo chmod 777 /mnt/tmp

/tmp/mnt を使うジョブを用意:

$ diff fio-crystaldiskmark fio-crystaldiskmark-mnt
7c7
< directory=/tmp/
---
> directory=/mnt/tmp/

手順(エラー→やり直しを含む)

fio-2.2.5 を取得する:

$ git clone -b fio-2.2.5 git://git.kernel.dk/fio.git

ビルドしてインストールする:

$ ./configure && make && sudo make install
Operating system              Linux
CPU                           arm
Big endian                    no
Compiler                      gcc
Cross compile                 no

Static build                  no
Wordsize                      32
zlib                          yes
Linux AIO support             no
POSIX AIO support             yes
POSIX AIO support needs -lrt  yes
POSIX AIO fsync               yes
Solaris AIO support           no
__sync_fetch_and_add          yes
libverbs                      no
rdmacm                        no
Linux fallocate               yes
POSIX fadvise                 yes
POSIX fallocate               yes
sched_setaffinity(3 arg)      yes
sched_setaffinity(2 arg)      no
clock_gettime                 yes
CLOCK_MONOTONIC               yes
CLOCK_MONOTONIC_PRECISE       no
gettimeofday                  yes
fdatasync                     yes
sync_file_range               yes
EXT4 move extent              yes
Linux splice(2)               yes
GUASI                         no
Fusion-io atomic engine       no
libnuma                       no
strsep                        yes
strcasestr                    yes
getopt_long_only()            yes
inet_aton                     yes
socklen_t                     yes
__thread                      yes
RUSAGE_THREAD                 yes
SCHED_IDLE                    yes
TCP_NODELAY                   yes
Net engine window_size        yes
TCP_MAXSEG                    yes
RLIMIT_MEMLOCK                yes
pwritev/preadv                yes
IPv6 helpers                  yes
Rados Block Device engine     no
setvbuf                       yes
Gluster API engine            no
s390_z196_facilities          no
HDFS engine                   no
lex/yacc for arithmetic       no
    CC gettime.o
    CC ioengines.o
    CC stat.o
    CC log.o
    CC time.o
    CC filesetup.o
    CC eta.o
    CC verify.o
    CC memory.o
    CC io_u.o
    CC parse.o
    CC mutex.o
    CC options.o
    CC lib/rbtree.o
    CC smalloc.o
    CC filehash.o
    CC profile.o
    CC debug.o
    CC lib/rand.o
    CC lib/num2str.o
    CC lib/ieee754.o
    CC crc/crc16.o
    CC crc/sha512.o
    CC crc/sha1.o
    CC crc/crc32c.o
    CC crc/fnv.o
    CC crc/murmur3.o
    CC crc/crc32c-intel.o
    CC crc/xxhash.o
    CC crc/test.o
    CC crc/sha256.o
    CC crc/crc32.o
    CC crc/md5.o
    CC crc/crc7.o
    CC crc/crc64.o
    CC engines/cpu.o
    CC engines/mmap.o
    CC engines/sync.o
    CC engines/null.o
    CC engines/net.o
    CC memalign.o
    CC server.o
    CC client.o
    CC iolog.o
    CC backend.o
    CC libfio.o
    CC flow.o
    CC cconv.o
    CC lib/prio_tree.o
    CC json.o
    CC lib/zipf.o
    CC lib/axmap.o
    CC lib/lfsr.o
    CC gettime-thread.o
    CC helpers.o
    CC lib/flist_sort.o
    CC lib/hweight.o
    CC lib/getrusage.o
    CC idletime.o
    CC td_error.o
    CC profiles/tiobench.o
    CC profiles/act.o
    CC io_u_queue.o
    CC filelock.o
    CC lib/tp.o
    CC lib/bloom.o
    CC engines/posixaio.o
    CC engines/falloc.o
    CC engines/e4defrag.o
    CC engines/splice.o
    CC diskutil.o
    CC fifo.o
    CC blktrace.o
    CC cgroup.o
    CC trim.o
    CC engines/sg.o
    CC engines/binject.o
    CC lib/linux-dev-lookup.o
  LINK fio
  LINK t/fio-genzipf
  LINK t/fio-btrace2fio
  LINK t/fio-dedupe
  LINK t/stest
  LINK t/ieee754
  LINK t/axmap
  LINK t/lfsr-test
install -m 755 -d /usr/local/bin
install fio t/fio-genzipf t/fio-btrace2fio t/fio-dedupe tools/fio_generate_plots 
tools/plot/fio2gnuplot tools/genfio /usr/local/bin
install -m 755 -d /usr/local/man/man1
install -m 644 fio.1 /usr/local/man/man1
install -m 644 tools/fio_generate_plots.1 /usr/local/man/man1
install -m 644 tools/plot/fio2gnuplot.1 /usr/local/man/man1
install -m 755 -d /usr/local/share/fio
install -m 644 tools/plot/*gpm /usr/local/share/fio/

fio-crystaldiskmark を取得して、実行する……失敗。libaio の shared object が見つからない:

$ wget http://www.winkey.jp/downloads/visit.php/fio-crystaldiskmark

$ which fio
/usr/local/bin/fio

$ fio fio-crystaldiskmark
fio: engine libaio not loadable
fio: failed to load engine libaio
fio: file:ioengines.c:99, func=dlopen, error=libaio: cannot open shared object file: 
 No such file or directory

libaio の開発パッケージを探して、インストールする:

$ apt-cache search libaio
libaio-dev - Linux kernel AIO access library - development files
libaio1 - Linux kernel AIO access library - shared library
libaio1-dbg - Linux kernel AIO access library - debugging symbols

$ sudo apt-get install libaio-dev
パッケージリストを読み込んでいます... 完了
依存関係ツリーを作成しています
状態情報を読み取っています... 完了
以下の特別パッケージがインストールされます:
  libaio1
以下のパッケージが新たにインストールされます:
  libaio-dev libaio1
アップグレード: 0 個、新規インストール: 2 個、削除: 0 個、保留: 0 個。
27.8 kB のアーカイブを取得する必要があります。
この操作後に追加で 136 kB のディスク容量が消費されます。
続行しますか [Y/n]? y
...

ビルド時に生成したファイルを消去して、ビルド&インストールをやり直す:

$ git clean -x -f
$ ./configure && make && sudo make install
Operating system              Linux
CPU                           arm
Big endian                    no
Compiler                      gcc
Cross compile                 no

Static build                  no
Wordsize                      32
zlib                          yes
Linux AIO support             yes  ★ここが変化した
POSIX AIO support             yes
POSIX AIO support needs -lrt  yes
POSIX AIO fsync               yes
Solaris AIO support           no
__sync_fetch_and_add          yes
libverbs                      no
rdmacm                        no
Linux fallocate               yes
POSIX fadvise                 yes
POSIX fallocate               yes
sched_setaffinity(3 arg)      yes
sched_setaffinity(2 arg)      no
clock_gettime                 yes
CLOCK_MONOTONIC               yes
CLOCK_MONOTONIC_PRECISE       no
gettimeofday                  yes
fdatasync                     yes
sync_file_range               yes
EXT4 move extent              yes
Linux splice(2)               yes
GUASI                         no
Fusion-io atomic engine       no
libnuma                       no
strsep                        yes
strcasestr                    yes
getopt_long_only()            yes
inet_aton                     yes
socklen_t                     yes
__thread                      yes
RUSAGE_THREAD                 yes
SCHED_IDLE                    yes
TCP_NODELAY                   yes
Net engine window_size        yes
TCP_MAXSEG                    yes
RLIMIT_MEMLOCK                yes
pwritev/preadv                yes
IPv6 helpers                  yes
Rados Block Device engine     no
setvbuf                       yes
Gluster API engine            no
s390_z196_facilities          no
HDFS engine                   no
lex/yacc for arithmetic       no
FIO_VERSION = fio-2.2.5
    CC gettime.o
    CC ioengines.o
    CC init.o
    CC stat.o
    CC log.o
    CC time.o
    CC filesetup.o
    CC eta.o
    CC verify.o
    CC memory.o
    CC io_u.o
    CC parse.o
    CC mutex.o
    CC options.o
    CC lib/rbtree.o
    CC smalloc.o
    CC filehash.o
    CC profile.o
    CC debug.o
    CC lib/rand.o
    CC lib/num2str.o
    CC lib/ieee754.o
    CC crc/crc16.o
    CC crc/sha512.o
    CC crc/crc7.o
    CC crc/sha1.o
    CC crc/crc32c.o
    CC crc/fnv.o
    CC crc/murmur3.o
    CC crc/crc32c-intel.o
    CC crc/xxhash.o
    CC crc/test.o
    CC crc/sha256.o
    CC crc/crc32.o
    CC crc/md5.o
    CC crc/crc64.o
    CC engines/cpu.o
    CC engines/mmap.o
    CC engines/sync.o
    CC engines/null.o
    CC engines/net.o
    CC memalign.o
    CC server.o
    CC client.o
    CC iolog.o
    CC backend.o
    CC libfio.o
    CC flow.o
    CC cconv.o
    CC lib/prio_tree.o
    CC json.o
    CC lib/zipf.o
    CC lib/axmap.o
    CC lib/lfsr.o
    CC gettime-thread.o
    CC helpers.o
    CC lib/flist_sort.o
    CC lib/hweight.o
    CC lib/getrusage.o
    CC idletime.o
    CC td_error.o
    CC profiles/tiobench.o
    CC profiles/act.o
    CC io_u_queue.o
    CC filelock.o
    CC lib/tp.o
    CC lib/bloom.o
    CC engines/libaio.o
    CC engines/posixaio.o
    CC engines/falloc.o
    CC engines/e4defrag.o
    CC engines/splice.o
    CC diskutil.o
    CC fifo.o
    CC blktrace.o
    CC cgroup.o
    CC trim.o
    CC engines/sg.o
    CC engines/binject.o
    CC lib/linux-dev-lookup.o
    CC fio.o
  LINK fio
    CC t/log.o
    CC t/genzipf.o
  LINK t/fio-genzipf
    CC t/btrace2fio.o
  LINK t/fio-btrace2fio
    CC t/dedupe.o
    CC t/debug.o
  LINK t/fio-dedupe
    CC t/stest.o
  LINK t/stest
    CC t/ieee754.o
  LINK t/ieee754
    CC t/axmap.o
  LINK t/axmap
    CC t/lfsr-test.o
  LINK t/lfsr-test
install -m 755 -d /usr/local/bin
install fio t/fio-genzipf t/fio-btrace2fio t/fio-dedupe tools/fio_generate_plots 
tools/plot/fio2gnuplot tools/genfio /usr/local/bin
install -m 755 -d /usr/local/man/man1
install -m 644 fio.1 /usr/local/man/man1
install -m 644 tools/fio_generate_plots.1 /usr/local/man/man1
install -m 644 tools/plot/fio2gnuplot.1 /usr/local/man/man1
install -m 755 -d /usr/local/share/fio
install -m 644 tools/plot/*gpm /usr/local/share/fio/
[編集]

OS #

[編集]

Ubuntu (2015-02-27) #

Raspberry Pi 2 用に Ubuntu がでたので、インストールだけやってみる。

ARM/RaspberryPi - Ubuntu Wiki から、Download 2015-02-19-ubuntu-trusty.zip をダウンロードする。2分ほど掛かった。

イメージをmicroSDカードに書き込む。

ARM/RaspberryPi - Ubuntu Wiki に従って作業する。

Raspberry Pi 2 にmicroSDカードとキーボードとモニタを繋いで電源を投入し、ログインする。 パッケージを更新して、openssh-server をインストールし、IPアドレスを調べる。

sudo apt-get update && sudo apt-get upgrade && sudo apt-get install openssh-server
ifconfig

(& は Shift + 7 で入力できる)

2番目のパーティションを作り直し、再起動する: 2番目を消して (d [ENTER] 2 [ENTER])、2番目を作って (n [ENTER} p [ENTER] 2 [ENTER] [ENTER] [ENTER])、パーティション情報を書き込んで終了する (w)。

sudo fdisk /dev/mmcblk0

大きさを変えて、保存する。

sudo resize2fs /dev/mmcblk0p2
sudo reboot

スワップファイルが必要なら、以下のパッケージをインストールする。インストール時に2GB (搭載メモリの倍?) 確保される。

sudo apt-get install dphys-swapfile

以下、適当に:

2015-04-15

microSD カードへの書き込みに VMware上に用意した Ubuntu 14.04 を使ってみた。かなり速い。 ディスクイメージは先週リリースされた 2015-04-06-ubuntu-trusty.zip を使った。

★bmap-tools と unzip をインストールする。
$ sudo apt-get install bmap-tools unzip

★microSDカードに入れておいたディスクイメージを展開する。
$ unzip /media/user/volumename/2015-04-06-ubuntu-trusty.zip
★microSDカードのドライブを調べて、アンマウントする
$ df | grep /media
/dev/sdf1        15G  152M   15G   1% /media/username/volumename

$ umount /dev/sdf1
★bmaptoolでディスクイメージをmicroSDに上書きする。1分23.6秒で完了したのでかなり速い。
$ sudo bmaptool copy --bmap 2015-04-06-ubuntu-trusty.bmap 2015-04-06-ubuntu-trusty.img /dev/sdf
bmaptool: info: block map format version 1.3
bmaptool: info: 458752 blocks of size 4096 (1.8 GiB), mapped 121181 blocks (473.4 MiB or 26.4%)
bmaptool: info: copying image '2015-04-06-ubuntu-trusty.img' to block device '/dev/sdf' 
 using bmap file '2015-04-06-ubuntu-trusty.bmap'
bmaptool: info: 100% copied
bmaptool: info: synchronizing '/dev/sdf'
bmaptool: info: copying time: 1m 23.6s, copying speed 5.7 MiB/sec

microSD を Raspberry Pi 2 に差し込み、モニタ、キーボード、LANケーブル、電源を取り付ける。 以下同じ。

2015-04-06-ubuntu-trusty-001.jpg

2015-04-06-ubuntu-trusty-002.jpg

[編集]

Raspbian: kernel 起動中の warn: kernel lacks cgroups or memory controller not avaiable,... を消した (2015-02-27) #

情報源:

kernel 起動中の warn: kernel lacks cgroups or memory controller not avaiable,... を消すために、/boot/cmdline.txt の dwc_otg... 行に「 cgroup_enable=memory」を追加した。

修正内容:

# diff cmdline.txt.org cmdline.txt
1c1
< dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline rootwait
---
> dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 cgroup_enable=memory elevator=deadline rootwait

なお、一回修正をミスって kernel panic が発生してログインできなくなったので、microSDカードをWindows PCに入れて修正した。 (/boot は FAT なのでWindowsでも編集可能)

[編集]

Raspbian: apt-get とか (2015-02-15) #

Ubuntoとかと同じ。

$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get autoclean && sudo apg-get autoremove

/var/cache/apt/archives も消したいなら、さらに

$ sudo apt-get clean

2015-02-17 python-rpi.gpio python3-rpi.gpio raspberrypi-bootloader wolfram-engine のアップデート来てた。

$ sudo apt-get update && sudo apt-get upgrade
...
以下のパッケージはアップグレードされます:
  libraspberrypi-bin libraspberrypi-dev libraspberrypi-doc libraspberrypi0 
  omxplayer python-rpi.gpio python3-rpi.gpio raspberrypi-bootloader wolfram-engine
アップグレード: 9 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。
307 MB のアーカイブを取得する必要があります。
...

$ dpkg -L python-rpi.gpio
...
/usr/share/doc/python-rpi.gpio/copyright
/usr/share/doc/python-rpi.gpio/changelog.gz
/usr/share/doc/python-rpi.gpio/changelog.Debian.gz
...
/usr/share/pyshared/RPi/__init__.py
/usr/share/pyshared/RPi.GPIO-0.5.11.egg-info
...
/usr/lib/python2.7/dist-packages/RPi/GPIO.so
...
/usr/lib/pyshared/python2.7/RPi
...
/usr/lib/python2.7/dist-packages/RPi/__init__.py
/usr/lib/python2.7/dist-packages/RPi.GPIO-0.5.11.egg-info
/usr/lib/pyshared/python2.7/RPi/GPIO.so
...
[編集]

Raspbian: rpi-update (2015-02-15) #

2015-02-07 時点の Raspbian (2015-01-31 版)

$ uname -a
Linux raspi2-1 3.18.5-v7+ #225 SMP PREEMPT Fri Jan 30 18:53:55 GMT 2015 armv7l GNU/Linux

2015-02-15 に rpi-update を実行したら、kernel 3.18.7-v7+ がインストールされた。 また、Raspbian 2015-02-16 の配布イメージには この 3.18.7-v7+ が入っている。

$ sudo rpi-update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** Performing self-update
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7938  100  7938    0     0  26063      0 --:--:-- --:--:-- --:--:-- 31129
 *** Relaunching after update
 *** Raspberry Pi firmware updater by Hexxeh, enhanced by AndrewS and Dom
 *** We're running for the first time
 *** Backing up files (this will take a few minutes)
 *** Backing up firmware
 *** Backing up modules 3.18.5-v7+
 *** Downloading specific firmware revision (this will take a few minutes)
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   168    0   168    0     0    235      0 --:--:-- --:--:-- --:--:--   327
100 43.3M  100 43.3M    0     0   129k      0  0:05:43  0:05:43 --:--:--  259k
 *** Updating firmware
 *** Updating kernel modules
 *** depmod 3.18.7+
 *** depmod 3.18.7-v7+
 *** Updating VideoCore libraries
 *** Using HardFP libraries
 *** Updating SDK
 *** Running ldconfig
 *** Storing current firmware revision
 *** Deleting downloaded files
 *** Syncing changes to disk
 *** If no errors appeared, your firmware was successfully updated to b2f6c103e5355bee90ff57f55cdf6d7005485a23
 *** A reboot is needed to activate the new firmware

(再起動後)
$ uname -a
Linux raspi2-1 3.18.7-v7+ #755 SMP PREEMPT Thu Feb 12 17:20:48 GMT 2015 armv7l GNU/Linux
[編集]

Raspbian: Xの解像度 (2015-02-13) #

FullHDモニタ (1920x1080) (iiyama XU2290HS-B1) にHDMIケーブルで接続しているのに、1920x1024 で表示されない。

x_1824_984.jpg

「tvservice -s」では1980x1080と表示されているのだが。

$ tvservice -s
state 0x12001a [HDMI CEA (16) RGB lim 16:9], 1920x1080 @ 60.00Hz, progressive

2015-04-25 Raspbian 2015-02-16 を1からインストールして apt-get update , apt-get upgrade した環境ではちゃんと 1980x1080 で表示された。

[編集]

Raspbian: 設定 (2015-02-08) #

(後で書く)

raspi-config と、自分がDebian/Ubuntuでよく使う設定を行った。

Raspbianの設定

  • バージョンは 2015-01-31
  • apt-get update && apt-get upgrade で、いくつか更新された。
    • krb5-locales libgssapi-krb5-2 libk5crypto3 libkrb5-3 libkrg5support0 ntp unzip
  • TODO: raspi-config のスクリーンショット取ったのでまとめる。config.txt も貼ること。

Debian/Ubuntuのいつもの設定

  • etc-keeper, mercurial, subversion
    • gitはインストール済みだった
  • build-essential はインストール済みだった。
  • emacs
  • /root と /home/pi も mercurial で管理した。
  • キーボード: CAPSキーをCTRLキーにした。/etc/default/keyboard に「XKBOPTIONS="ctrl:nocaps" 」を付け加えて再起動したらOK。XもXなしでもこれ1つでOKらしい。
  • Linux/bash の設定を追加した。
  • htop 入れた。

2015-02-22 2015-02-16 版のイメージが出てた。

release_notes.txt より:

2015-02-16:
  * Newer firmware with various fixes
  * New Sonic Pi release
  * Pi2 compatible RPi.GPIO
  * Updated Wolfram Mathematica
2015-01-31:
  * Support for Pi2
  * Newer firmware
  * New Sonic Pi release
  * Updated Scratch
  * New Wolfram Mathematica release
  * Updated Epiphany
[編集]

ヒートシンク (2015-03-07) #

Raspberry Pi 2台のうち、片方に手持ちのヒートシンク (¥70くらい) を熱伝導両面テープ PA-069B で貼ってみた。

raspi2-headsink-before.jpg raspi2-headsink-after.jpg

計測方法:

  • Raspberry Pi 2 Model B を2台用いて、片方だけヒートシンクを装着し、
  • 以下の計測方法で、
  • 以下の2種類の負荷をかけたときの温度をそれぞれ計測した。
    • (1)アイドル: LANと電源のみ接続。X Windowなし
    • (2)OpenMP: while true; do ./Openmp-sample; done を実行。Openmp-sample はガウシアンフィルタ3x3を4コアで実行。

結果:

  • 計測時の室温 21.6℃ (温度計)
(A) ヒートシンク無し(B) ヒートシンクあり(C) 差 (A)-(B)
温度計BCM2836電流温度計BCM2836電流温度計BCM2836
(1) アイドル31.0031.4760.2533.4034.7040.25
(2) OpenMP52.2047.0780.4339.8041.1600.44
(3) 差 (2)-(1)21.2015.6020.186.406.4560.1914.809.146
[編集]

電源 (2015-02-07) #

  • 電源には、手持ちの Buffalo BSMPA09BK (2A ×2) を使った。
  • 接続した機材は、SDカード、HDMIモニタ、USB 2.0 バスパワーハブ、ワイヤレスマウス、キーボード。
    • 電圧: 4.8V前後、電流 0.45mA。USB 2.0 バスパワーハブ、ワイヤレスマウス、キーボードを抜くと、電流 0.25mAだった。
  • USBケーブルに 手持ちの Amazonベーシック USB2.0ケーブル 1.8m (タイプAオス- マイクロタイプBオス) を使ったところ、電圧低下が多くて、Raspbianの起動中に Raspberry Pi 2 B の画面の右上にマークが数秒、表示された。起動が完了したら表示されなくなった。GPIO pin 2(5V) - pin 6(GND) 間で 4.72V付近だった。
  • Nexus7 2013 付属のUSBケーブルでは、4.89Vくらい。これでも起動中にマークが数秒、表示される。
  • USBケーブルを ルートアール スマートフォン・タブレットPC対応 超急速充電microUSBケーブル 1.0m RC-UHCM10R に変えたところ、起動中にマークが表示されなくなった。
    • (2015-02-17) と、思ってたら、Webブラウザ起動してスクロールしたら、マークが表示された。TODO: USB-HUB をセルフパワーのに変えてみる。

電源電圧が足りないとき、画面の右上に表示されるマーク

PowerLow.jpg

4.726V Amazonベーシック USB2.0ケーブル 1.8m (タイプAオス- マイクロタイプBオス)

USBAmazon18.jpg

4.890V (Nexus 7 2013付属ケーブル)

USBNexus92013.jpg

4.973V ルートアール スマートフォン・タブレットPC対応 超急速充電microUSBケーブル 1.0m RC-UHCM10R

USBRouteR.jpg

4.941V ルートアール スマートフォン・タブレットPC対応 超急速充電microUSBケーブル 1.0m RC-UHCM10R + ルートアール USB 簡易電圧・電流チェッカー 2ポート出力 VA同時表示対応 RT-USBVA3

USBRouteR-AV.jpg

4.902V ルートアール スマートフォン・タブレットPC対応 超急速充電microUSBケーブル 1.0m RC-UHCM10R + USBスイッチケーブル

USBRouteR-SW.jpg

[編集]

カバーとか #

[編集]

ほこりよけ (未着手) #

2015-05-19

Adafruit Pi Protector for Raspberry Pi Model B+ / Pi 2 ID: 2292 - $7.50 の上だけが欲しい。上に物を載せるつもりが無いので、スペーサーを2本で支えるだけなら、こういう形のが楽そうだ。

GPIO の下はペテット+板でいいので。

寸法は

[編集]

固定 (2015-02-08) #

mbed Nucleo L152RE | mbed, ブレッドボード BB-801 - 秋月電子通商、Raspberry Pi 2 Model B:

base-top.jpg base-bottom.jpg

[編集]

Raspberry Pi 2 Model B を入手 (2015-02-07) #

  • 2015-02-02 18時にRSコンポーネットに発注。
  • 2015-02-06 10時到着, 不在のため再配達。(RSコンポーネントはデフォルトでは平日配達されるよう指定されるので)
  • 2015-02-07 10:30に再配達にて受け取り。

基板のシルクは:

  • Raspberry Pi 2 Model B V1.1 / (C) Raspberry Pi 2014
  • 02 15
  • Made in the UK

チップは:

  • BROADCOM BCM2836RTF8G / TE1445 P10 / 430260-20 N3 W
  • SMSC LAN9514-JZX / B1426-A1B17 / 426VH9A / ATA-SG
  • ELPIDA 38132B4PB-80-F