2024年5月1日水曜日

linux で DiskMark

Microsoft が公開しているdiskspd for linux を使用します
Windows用のDisk I/O ベンチで有名なCrystalDiskMark のバックエンドで使用されているそうです
以下の内容はdiskspd for linuxを参考にさせて頂きました。

# make、gcc、libaio-dev のパッケージが必要です
$ sudo apt install make gcc libaio-dev

# 適当なディレクトリーに移動して git clone します
$ git clone https://github.com/microsoft/diskspd-for-linux

# diskspd-for-linuxのディレクトリーに移動して make
$ cd diskspd-for-linux
$ make
$ sudo make install

# diskspd単体で使う場合、いろいろオプションが必要ですが、CrystalDiskMark V8相当のスクリプトが githubで公開されているのでそれを使用します
$ git clone https://github.com/haxyier/DiskMark-linux-sh
$ cd DiskMark-linux-sh
$ ./DiskMark-linux.sh test.dat

# DiskMark-linux.shを実行すると実行結果が細かく出力されので、CrystalDiskMark相当の出力に整形します $ ./DiskMark-linux.sh test.dat |tee diskspd.dat
$ cat diskspd.dat | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'


# rasspbery pi 3 B+をUSB接続のmSATAのHATで実行した結果は以下の様になりました
# cat diskspd.dat | awk '/^Executing/ {printf "%s%s%s\t",$3,$4,$5} /^Total IO$/ {getline;getline;getline; print $7 }'
Read(SEQ1MQ8T1)... 27.20
Read(SEQ1MQ1T1)... 28.00
Read(RND4KQ32T16)... 0.52
Read(RND4KQ1T1)... 7.74
Write(SEQ1MQ8T1)... 29.20
Write(SEQ1MQ1T1)... 33.60
Write(RND4KQ32T16)... 0.08
Read(RND4KQ1T1)... 9.26

pi3のUSBはUSB2なので最大60MB/sですが、ちょっと遅いですね。

ちなみにIntel Pentium N4200の載ったLIVA Z でM.2のSATAのSSDでは以下の結果です
Read(SEQ1MQ8T1)... 500.20
Read(SEQ1MQ1T1)... 412.40
Read(RND4KQ32T16)... 9.07
Read(RND4KQ1T1)... 13.28
Write(SEQ1MQ8T1)... 240.00
Write(SEQ1MQ1T1)... 153.00
Write(RND4KQ32T16)... 0.28
Read(RND4KQ1T1)... 49.07

readに関してはSATAの上限まででてますね。

2016年5月7日土曜日

クロス開発の環境を整える その2

5.GPIO用のライブラリのインストール
RaspberryPIのGPIOを操作する場合、直接GPIOのドライバを操作する方法もありますが、いろいろ面倒くさいのでGPIOのドライバインターフェースとして公開されている、WiringPi を利用します。
クロス開発で利用する場合、WiringPi のライブラリ/ヘッダをクロス開発の環境に組み込む必要があります。
・WiringPiのサイトから git でソースclone します。

$ cd ~/develop
$ git clone git://git.drogon.net/wiringPi
・wiringPiディレクトリーにWiringPiのソースがコピーされます。

・WiringPiのライブラリをクロス開発用にビルドします。

$ cd wiringPi
$ cd wiringPi
$ make ARCH=$ARCH CC=$CC

・ビルドされたライブラリを以下の場所にコピーし、別名のリンクを張ります。
$ cp libwiringPi.so.2.32 ~/develop/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/lib/.
$ cd ~/develop/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/lib/
$ ln libwiringPi.so.2.32 libwiringPi.so

・WiringPiのヘッダファイルを以下の場所にコピーします。
$ cd ~/develop/wiringPi/wiringPi
$ cp *.h ~/develop/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64/arm-linux-gnueabihf/libc/usr/include/.

*コピー先はいずれも開発PCが64bitOSの場合です。


6.サンプルプログラムを動かす ・取得したWiringPiにLEDを点滅させるサンプルプソースがあるのでビルドして動かしてみます。
$ cd ~/develop/wiringPi/examples
$ cc -o blink blink.c -lwiringPi
・実行ファイル blink が作成されますので Raspberry Pi に実行ファイルを転送し、実行します。
・サンプルで使用されているGPIOはGPIO17が使用されていますので LEDの回路をGPIO17(PIN11)とGNDに接続します。
・LEDの回路についてはいろいろなサイトで紹介されているのそちらを参考にしてください。
・WiringPi を使用したプログラムを動かす場合、デフォルトでは root の権限が必要となります。
・一般ユーザで動かすためには以下の環境変数をセットします。

$ export WIRINGPI_GPIOMEM=True

・上記の"="の後に設定する文字列に意味はありません。何らかの文字が設定されていればOKです。
 WIRINGPI_GPIOMEM=1 や WIRINGPI_GPIOMEM=yes でもOKです。


クロス開発を行うための環境構築は以上となります。

2016年5月6日金曜日

クロス開発の環境を整える その1

・Raspberry Piの細かいことは他のサイトにお任せして、LinuxPCにクロス開発の環境を整えます。
・開発を行うPCではLinuxが動いてることが前提です。
・Eclipse ?なにそれ?ってことでコマンドラインを用いた開発環境を構築します。
決してEclipseを使えないからではありません。頑張れば使えます。 が、頑張りたくありません。
・WindowsのPCしかない場合は、virtual machine でLinux 環境を構築しましょう。
・使用するLinuxディストリビューションはなんでもいいですが、お手軽なUbuntuかその派生ディストリビューションがいいでしょう。
・ちなみに私の最近のお気に入りは Voyager linux です。


** クロス開発環境は以下の手順で進めます **
1.開発PCの準備
2.Raspberry Pi と 開発PCの接続
3.Raspberry Pi と 開発PCとのファイル転送
4.クロス開発環境のインストール
5.GPIO用のライブラリのインストール
6.サンプルプログラムを動かす


1.開発PC(Linux)の準備
あ~、まぁ~今さらなんで省きます。
Linuxの環境が準備出来ない場合は素直にWindows環境でのクロス開発環境を導入しましょう。

2.Raspberry Pi と 開発PCの接続
sshで接続します。
RaspberryPIはデフォルトでsshサーバが動きますので特にやることはないです。

3.Raspberry Pi と 開発PCとのファイル転送
開発PCでビルドしたプログラムをRaspberryPIで動かすために開発PCからRaspberryPIに何らかの方法で転送する必要があります。
方法は何でもいいです。
以下のような方法があります。

a.usbメモリで行う。
→抜いたり刺したり、マウントしたりアンマウントしたりいろいろめんどくさいですが、usbメモリさえあればいいので簡単です。

b.ftpで転送。
→最近のDesktop向けのLinuxディストリビューションにはFTPサーバがデフォルトで入ってなかったりします。
まぁ、開発PCにFTPサーバをインストールすればいいのでお手軽です。

c.sambaでマウント
→RaspberryPIと開発PCにsambaの環境をインストールする必要があります。
これもインストールして設定すればそれで終わりなのでお手軽です。

d.nfsでマウント
→linuxというかunix系OS同士でのサーバ-クライアント接続はこれが楽です。
ただし、開発PCの環境によってはちょっと面倒なことになります。
nfsでの接続はサーバ、クライアントの uid、gid での接続になりますのでRaspberryPiと開発PCのuid、gidを合わせる必要があります。
いろいろ面倒くさいのでここでは省略します。


4.クロス開発環境のインストール
それでは、クロス開発環境のインストールです。
GitHubにRaspberryPiのクロス開発環境がありますのでこれをcloneします。
(gitコマンドは予めinstallしておく必要があります。)
適当なディレクトリを作成し、そこで以下のコマンドを実行します。
ここでは ~/develop で行うこととします。

$ mkdir develop
$ cd develop
$ git clone https://github.com/raspberrypi/tools.git

  toolsにクロス開発の環境がコピーされます。
  クロス開発のコマンドは開発PCのOS32bit/64bitにより以下の物を使用します。
    ・32bitOSの場合
      tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian 配下
    ・64bitOSの場合
      tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64 配下

開発環境をcloneしたら使用するための環境変数を設定します。
以下の内容のファイルを作成し、 sourceコマンドで環境変数を設定します。
(開発PC:64bitOS)

$ vi raspi_dev

export RASPI_CROSSROOT=~/share/develop/tools/arm-bcm2708/gcc-linaro-arm-linux-gnueabihf-raspbian-x64
export RASPI_CROSSCMDDIR=$RASPI_CROSSROOT/bin
export ARCH=arm
export CROSS_CMD=$RASPI_CROSSCMDDIR/arm-linux-gnueabihf-

export AS="$CROSS_CMD"as
export LD="$CROSS_CMD"ld
export CC="$CROSS_CMD"gcc
export CXX="$CROSS_CMD"g++
export CPP="$CROSS_CMD"gcc" -E"
export AR="$CROSS_CMD"ar
export NM="$CROSS_CMD"nm
export STRIP="$CROSS_CMD"strip
export OBJCOPY="$CROSS_CMD"objcopy
export OBJDUMP="$CROSS_CMD"objdump

alias as=$AS
alias ld=$LD
alias cc=$CC
alias gcc=$CC
alias cpp=$CPP
alias g++=$CXX
alias ar=$ar
alias nm=$NM
alias strip=$STRIP
alias objcopy=$OBJCOPY
alias objdump=$OBJDUMP

$ source raspi_dev
$ cc -v 2>&1 | grep Target

Target: arm-linux-gnueabihf

ターゲットがarm CPUになっていれば、OK

・適当なソースを準備してビルドし、きちんとRaspberryPi用にプログラムが作成されるかを確認します。
・hello.c


#include <stdio.h>
int main()
{
    printf("Hi, everyone!\n");
    return 0;
}

・コンパイル/リンク
$ cc -o hello hello.c

・実行ファイルを確認
$ file hello
hello: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV),~~~~~
↑ ARM の表示がでていれば RaspberryPi用にビルドされています。
もし X86 とかになっている場合、クロス開発用の環境設定ができていないので確認しましょう。

作成した実行ファイルをraspberryPiにファイルを転送し、実行します。
転送の仕方によっては実行権限が外れる場合もあるので、実行する前に実行権限が付いてるか確認しておきましょう。

次へ続く