Hatena::ブログ(Diary)

hikaru149の日記

2018-11-03

2018-11-02

PSoC (ARM gcc) で64ビット整数をprintf

10:12

PSoC (ARM gcc) で64ビット整数をprintfしようとしてこけた。

これはPSOCのARMライブラリのprintfの問題かな。

そもそも%llXを正しく取り扱えていないようだ。

2018-10-29

赤外線リモコンプロジェクト

23:38

赤外線LEDPSoC内蔵のオペアンプトランジスタ電流バッファで電流駆動したら、

どうもf特が悪くて38kHzの変調波にならない。これじゃあダメだ。

2018-10-28

PSOCの浮動小数点演算能力

10:28

PSOC浮動小数演算能力を確認していなかったのでネットで調査。

見つけたサイトはここ。

http://dad8893.blogspot.com/2017/06/arduino-nucleo-psoc.html

以下、上記サイトの抜粋。

(その他のArm-Mシリーズの話はここを参照。 https://www.aps-web.jp/academy/cm/

単精度浮動小数点超越関数の計算時間は、

ハードウェアFPUを持つARM-M4の圧勝。

PSoC5LP@80MHz(ARM-M3)だとSoftVFPでざっと、30us、

PSoC4@48MHz (ARM-M0)だと、100us 見ておけば良さそう。

倍精度に関しては、同じ人の書いたここ

http://dad8893.blogspot.com/2016/02/nucleo-f401recortex-m4psoc-5lpcortex-m3.html

によると、M4もSoftVFPになるようで、M3の方が若干速いそうだ。

Arduino, Nucleo, PSoCの単精度浮動小数点数演算の速度比較

比較対象 MPU Core Clock FPU

Arduino Uno R3 ATMega328P ATMega(8bit) 16MHz 無

PSoC 4 Pioneer Kit PSoC 4 Cortex-M0 48MHz 無

PSoC 5LP Protyotyping Kit PSoC 5 LP Cortex-M3 80MHz 無

Nucleo F401RE STM32F401 Cortex-M4 84MHz 有

Nucldo F446RE STM32F446 Cortex-M4 180MHz 有

float型(単精度浮動小数点数型)で算術関数を呼び出して100回ループを回してバッファを埋める。

細かいところは違うが、PSoCPSoC Creatorで、Nucleoはmbedで同じ処理をするコードを書いて測定。


No Device No2 Op time(us) clock(MHz) period(us) clocks:op

1 F446RE 1 div 0.117 180 0.005555556 21.06

1 F446RE 2 sinf 0.4939 180 0.005555556 88.902

1 F446RE 3 cosf 0.4665 180 0.005555556 83.97

1 F446RE 4 expf 0.6758 180 0.005555556 121.644

1 F446RE 5 logf 0.614 180 0.005555556 110.52

1 F446RE 6 sqrtf 0.2392 180 0.005555556 43.056

2 F401RE 1 div 0.2505 84 0.011904762 21.042

2 F401RE 2 sinf 1.0109 84 0.011904762 84.9156

2 F401RE 3 cosf 0.964 84 0.011904762 80.976

2 F401RE 4 expf 1.4127 84 0.011904762 118.6668

2 F401RE 5 logf 1.3038 84 0.011904762 109.5192

2 F401RE 6 sqrtf 0.5127 84 0.011904762 43.0668

3 PSoC5LP 1 div 2.35 80 0.0125 188

3 PSoC5LP 2 sinf 17.25 80 0.0125 1380

3 PSoC5LP 3 cosf 20.69 80 0.0125 1655.2

3 PSoC5LP 4 expf 27.05 80 0.0125 2164

3 PSoC5LP 5 logf 29.78 80 0.0125 2382.4

3 PSoC5LP 6 sqrtf 9.07 80 0.0125 725.6

4 PSoC4 1 div 13.19 48 0.020833333 633.12

4 PSoC4 2 sinf 69.17 48 0.020833333 3320.16

4 PSoC4 3 cosf 80 48 0.020833333 3840

4 PSoC4 4 expf 86.38 48 0.020833333 4146.24

4 PSoC4 5 logf 106.25 48 0.020833333 5100

4 PSoC4 6 sqrtf 24.35 48 0.020833333 1168.8

5 Arduino 1 div 34 16 0.0625 544

5 Arduino 2 sinf 139.24 16 0.0625 2227.84

5 Arduino 3 cosf 146.52 16 0.0625 2344.32

5 Arduino 4 expf 196.2 16 0.0625 3139.2

5 Arduino 5 logf 182.4 16 0.0625 2918.4

5 Arduino 6 sqrtf 64.08 16 0.0625 1025.28

「time(us)」は1処理あたりの実行時間。「clock:op」は1処理あたりのクロック数(推定値)。

FPU付きのNucleo F446RE、F401REが圧倒的に高速。

Cortex-M3PSoC 5 LPもまあまあ頑張っている。

2018-10-20

Maximaでベクトルの計算

14:56

ここの情報そのまま。

http://d.hatena.ne.jp/Levi/20090313


パッケージの読み込みが必要。

(%i1) load(vect);

ベクトルはリストで表現

(%i2) A : [a,b,c];

スカラー乗算

(%i3) B : 3*A;

内積

(%i4) A . B;

外積は~で

(%i5) [a,b,c] ~ [x,y,z];

(%o5) [a,b,c] ~ [x,y,z]

展開させるにはexpressを使う

(%i6) express(%);

(%o6) [bz-cy, cx-az, ay-bx]

expressは外積とか次のgrad,div,curl,laplacianの結果に使う。

勾配 gradient、 発散 divergence、回転 rotation

(%i7) grad(p);

(%i8) div( [a,b,c] );

(%i9) curl( [a,b,c] );

express( div([x^2,y^2,z^2]) ); とかやっても微分してくれず、

(%o10) ¥frac{d}{dz} z^2 + ¥frac{d}{dy} y^2 + ¥frac{d}{dx} x^2

と出る。これをx,y,zで微分させるにはevを使う。

(%i11) ev(%o10, diff);

(%o11) 2z^2 + 2y^2 + 2x^2

rotationのdivergenceは必ずゼロ

(%i12) div(curl([a,b,c]);

(%o12) 0

ラプラシアン

(%i13) laplacian(p);

(%i14) laplacian([a,b,c]);

など。