e-tipsmemo

ごった煮

Rust レイトレーシング ⑥ スーパーサンプリング


Rustでの演算子オーバーロードを行うために、構造体にAdd/Mul/Div Traitを実装する。

これを用いることで足し算、掛け算、割り算の演算子を使える。

スーパーサンプリングは光線の方向にランダムな要素を加えて、その方向から得られた色から平均をとることで物体のジャギを抑える事ができる。

rand::thread_rng().gen_range(a, b);

でa~bの乱数を得られる。 rand crateが必要なのでCargo.tomlに追加する。


ついでに実行時引数でスーパーサンプリングの回数を変更可能にした。

スーパーサンプリングを10回行った場合。
f:id:katakanan:20180202015103p:plain:w300

f:id:katakanan:20180202015220p:plain:w250f:id:katakanan:20180202015233p:plain:w250
左がスーパーサンプリングなし。
右がスーパーサンプリングあり。
なんとなくjpgっぽさが?ある

あと実行時間の比較。
f:id:katakanan:20180202015924p:plain
雑だがスレッド数8のときのほうが5倍ぐらい速い。


Programming Rust: Fast, Safe Systems Development

Programming Rust: Fast, Safe Systems Development

xgpiops.h No such flie or Directory

zyboでUSB3320のリセットがMIO46につながっているのは
Zybo Reference Manual [Reference.Digilentinc]
ここからわかる。
f:id:katakanan:20180205235840p:plain:w150
どうやらハードウェア類がLinux前にリセットされていなければならないのは組み込みあるあるなのかしらないが
以下のサイトによるとそうしなければならないようだ。
forum.digilentinc.com
しかし、肝心のコードを入れるとXIlinx SDKにxgpiops.hなんか無いと言われる。

結論。
bitstreamを作る前に、GPIO-MIOを使うように設定する。
f:id:katakanan:20180206000217p:plain

XSDKはVivadoから履かれたHDFをもとに、必要最低限なヘッダー類だけコピー・生成している。
結局「#include "xiicps.h"が無い」と同じことだった。

Zybo Zynq-7000 ARM/FPGA SoC Trainer Board

Zybo Zynq-7000 ARM/FPGA SoC Trainer Board

zybo自体は安い良いボードだと思うけど書籍はあまり充実していないなと思う。
というのも
情報はDigilentやネットで手に入ってしまう。
何よりもVivadoが頻繁に更新されてしまうので本に書かれる方法はすぐに古くなってしまうからであろうか。

Rust レイトレーシング ⑤ 法線

http://e-tipsmemo.hatenablog.com/entry/2018/02/05/000000e-tipsmemo.hatenablog.com
法線を用いて球に色を付ける。


交差した点の座標が必要。

あとは前回のものを微修正するだけでOK

法線を計算をしてHitRecordに詰める。


matchではSomeの中に引数のようなものを入れてそれを使用する。
法線は正規化されているので各要素は必ず1以下。そのまま色にして動作を確認する。

f:id:katakanan:20180201162901p:plain:w300
よさそう。


Programming Rust: Fast, Safe Systems Development

Programming Rust: Fast, Safe Systems Development

zybo ethernet Ubuntu 17 ipv4

0からzyboのLinux起動を試しており、イーサネットがつながらなかった。
e-tipsmemo.hatenablog.com
大体ここをベースに今回はUbuntu 17 (Artful)を利用する。

①デザイン

zyboのイーサネットピンをMIOから出す。MDIOを忘れないようにする。
f:id:katakanan:20180207210954p:plain
参考
f:id:katakanan:20180205235840p:plain:w200

②bitstreamをつくる。

省略

SDKを立ち上げてFSBLを作る。

省略

④Device treeをつくる。

ここが一番バージョンによって変わっているのか、ドライバが違うからだめなのかよくわからないが
とにかく、Digilentgithubにある書き方では動かなかった。(いままでは動いていた気がする)
動かなかった。。?書き方。
linux-Digilent-Dev/zynq-zybo.dts at master · Digilent/linux-Digilent-Dev · GitHub

ps7_ethernet_0: ps7-ethernet@e000b000 {
	#address-cells = <1>;
	#size-cells = <0>;
	clock-names = "ref_clk", "aper_clk";
	clocks = <&clkc 13>, <&clkc 30>;
	compatible = "xlnx,ps7-ethernet-1.00.a";
	interrupt-parent = <&ps7_scugic_0>;
	interrupts = <0 22 4>;
	phy-handle = <&phy0>;
	phy-mode = "rgmii-id";
	reg = <0xe000b000 0x1000>;
	xlnx,eth-mode = <0x1>;
	xlnx,has-mdio = <0x1>;
	xlnx,ptp-enet-clock = <108333336>;
	mdio {
		#address-cells = <1>;
		#size-cells = <0>;
		phy0: phy@1 {
			compatible = "realtek,RTL8211E";
			device_type = "ethernet-phy";
			reg = <1>;
		} ;
	} ;
} ;

これでも一応、eth0は出現するが

$ sudo ip link set eth0 up

でエラーが出る。

xemacps e000b000.ps7-ethernet: XEMACPS mii bus mii_probe fail.
xemacps e000b000.ps7-ethernet: eth0: no PHY found

device-tree-generatorを使ってみる。
xilinxの最新のdevice-tree-generatorを利用すると、全く違う構成になっている。

gem0: ethernet@e000b000 {
	compatible = "cdns,zynq-gem", "cdns,gem";
	reg = <0xe000b000 0x1000>;
	status = "disabled";
	interrupts = <0 22 4>;
	clocks = <&clkc 31>, <&clkc 31>, <&clkc 14>;
	clock-names = "pclk", "hclk", "tx_clk";
	#address-cells = <1>;
	#size-cells = <0>;
};

status="okay"に変更。
phy-modeを設定しているのは、pcw.dtsiにある。

&gem0 {
	phy-mode = "rgmii-id";
	status = "okay";
	xlnx,ptp-enet-clock = <0x6750918>;
};

ここはどうやらgem0本体と最終的に中身がマージされる。

あとはmdioの設定があるべきでそれは
system-top.dtsに置く?

mdio  {
	compatible= "cdns,macb-mdio";
	reg= <0xe000b000 0x1000>;
	clocks = <&clkc 30>, <&clkc 30>, <&clkc 13>;
	clock-names = "pclk", "hclk", "tx_clk";
	#address-cells = <1>;
	#size-cells = <0>;
	eth_phy0:phy@1 {
		compatible = "realtek,RTL8211E";
		device_type = "ethernet-phy";
		reg = <0x1>;
	};
};

これを追加して(cpuなどと同じ階層)みたところ、なんかうまくいった。
compatibleの値はプローブされるときに必要になる気がしているが
それが違うということはなんかドライバが別なのだろうか・・?

bootargs = "console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1";
も忘れないようにする。

Ubuntu ipv6の無効化

ここから先はUbuntuの設定

$ sudo ip link set eth0 up

をすると、NICが起きる(?)。
qiita.com
これをすれば無効にはなった。

ipv4 dhcp

なぜかipv4が降ってこなくて、ネットに繋がらなかった。
エトセ・ネットワーク・インターフェースはもういらないらしく、代わりにnetplanなるもので設定するらしい。
websiteforstudents.com

# This file describes the network interfaces available on your system
# For more information, see netplan(5).
network:
 version: 2
 renderer: networkd
 ethernets:
     eth0:
     dhcp4: yes

コマンドによって適用されるが、文法チェックを行ってくれるので安心。

sudo netplan apply

これでipv4が降ってきてpingが通った。
もしかしたら、
/etc/systemd/network/25-eth0.network

[Match]
Name=eth0

[Network]
DHCP=ipv4

が追加で必要かもしれない。

Rust レイトレーシング ④ 球体


sphereとshape_opを追加した。

shpereは色を持つ。ついでにColorにnewメンバ関数を追加ておく。


光が当たったところを記録する。hit関数によって返される。当たった点pと法線ベクトルnと光源からの距離t。


後々のためにHIT Traitを定義。「HIT Traitを実装しているものを引数にとる。」のようにできる。
hitはhitヒットしていないかもしれないので、Option型で返す。
rustbyexample.com
ダメそうだったらNoneを返す。


HIT Traitの実装。球と直線が交わるか計算。
使わない引数・変数は _hogeとするか、そのものを_にするかしないと、コンパイラから警告がでる。


matchを使うことで、Optionで帰ってくるものを綺麗に書ける。いちいちboolを返してtrueなら~という二度手間感がない。



球を追加する。

実行結果。
f:id:katakanan:20180130105946p:plain:w300
f:id:katakanan:20180130110736p:plain
よさそう。


Programming Rust: Fast, Safe Systems Development

Programming Rust: Fast, Safe Systems Development

EZ-USB FX2 Bulkloop ③

e-tipsmemo.hatenablog.com


BulkloopのTD_pollを見ていく。

BulkloopではPCからinのEPに送られてきたデータをoutのEPからPCに送り返すものであった(はず)

読み取り先のEPのステータスをチェックして


書き込み先のEPのステータスをチェックする。

EPのバッファー間でコピーする方法として、AUTOPTRを利用している。
EPのFIFOの先頭アドレスを、読み込み書き込みするたびにさしているアドレスがインクリメントされる、AUTOPTRセットしてforで回している。

互換性保持のために冗長にしている?
16bitなので

EP8のバッファのカウンタをコピーしたサイズ値にする

EP4BCLの8bit目はSKIPビットというもので
p93による。

Rust レイトレーシング ③ マルチスレッド

e-tipsmemo.hatenablog.com

続き。

見通しをよくするためにcolor構造体を利用することにした。

各色は0.0~1.0しか取らないので適当にclampしてやる必要があるのでそういった細かい関数は

へ書くことにした。



色は基本的にシーン内で計算することにした。



マルチスレッドになっているものを可変にする。
実行時引数を利用する。


それほど難しいことはなく、以下を参考にすればよい。
rustbyexample.com

ついでに時間を測り始めた。

time crateが必要。
Rust multithread 実行時間測定 - e-tipsmemo

cargoで引数を渡すには--を付ける。

$ cargo run -- 1
    Finished dev [unoptimized + debuginfo] target(s) in 0.26 secs
     Running `target/debug/rust_ray01 1`
Hello, world!
thread:1
time:5031427000 ns
$
$ cargo run -- 3
    Finished dev [unoptimized + debuginfo] target(s) in 0.0 secs
     Running `target/debug/rust_ray01 3`
Hello, world!
thread:3
time:1781288000 ns

速くなっている。。?

結果は変わらない。
f:id:katakanan:20180121110300p:plain:w300


Programming Rust: Fast, Safe Systems Development

Programming Rust: Fast, Safe Systems Development