2020年7月28日火曜日

ようやく綺麗な感じに

のんびりとドライバの作り方を参考にそれなりのものが形になってきました。
ユーザープログラムから一歩踏み込めば割り込み制御もなんの制限もなく行えました。
この辺の部分の経験は全く無く、ハードウェアで遊んでいたところからいきなり離れてソフト的な部分が主体となってしまった結果だと思います。

そんなドライバとアプリを組み合わせた見慣れてきたデバッグ結果は…
pi@rasp4b4g:~/gpioread $ ./dht2 --debug
debug mode.
sampling_start_lev : 1
sampling_end_lev   : 0
length : 84
sampling data :
9 82 88 54 24 54 70 54 24 54 24 54 71 54 70 54 24 54 71 55 24 54 24 54 24 54 24 54 24 54 24 54 24 54 25 54 25 53 25 54 24 54 70 54 71 54 70 54 70 54 72 54 24 54 24 54 24 54 24 54 70 54 25 53 25 54 71 54 24 54 71 53 71 54 70 54 24 54 71 54 24 54 71 54
sampling loop counter :
32 318 336 207 93 207 271 208 93 207 93 208 271 207 271 207 93 208 274 208 93 208 93 207 93 208 93 207 93 208 93 207 93 208 96 208 93 207 93 208 93 207 271 208 271 207 271 207 271 208 274 208 93 207 93 208 93 207 93 207 271 208 93 207 93 208 274 208 93 207 271 207 271 208 271 207 93 207 271 208 93 207 274 207
start : 1595943714 981689
p1 : 2
p2 : 14
p3 : 20016
p4 : 20017
p5 : 20018
p6 : 35460
p7 : 35492
p8 : 35875
bitcount : 40
data high '0' : 24 ~ 25
data high '1' : 70 ~ 72
data low : 53 ~ 55
data : 4D 00 1F 09 75
2回目の読出しを行います。
sampling_start_lev : 1
sampling_end_lev   : 0
length : 84
sampling data :
9 82 88 54 24 54 70 54 24 54 24 54 71 54 70 54 71 53 26 53 25 54 24 54 24 54 24 54 24 54 24 54 24 54 25 54 24 55 24 54 24 54 70 54 71 53 71 54 70 54 72 53 25 53 25 54 24 54 24 54 24 54 70 54 71 54 71 54 24 54 71 54 70 54 70 54 24 54 71 54 24 54 25 53
sampling loop counter :
33 317 336 208 93 207 271 208 93 207 93 207 271 208 271 208 271 207 97 207 93 208 93 207 93 208 93 207 93 207 93 208 93 207 97 207 93 208 93 207 93 208 270 208 271 207 271 207 271 208 275 207 93 207 93 208 93 207 93 208 92 208 271 207 270 208 274 208 93 207 271 208 270 208 271 207 93 207 271 208 93 207 96 207
start : 1595943717 018241
p1 : 1
p2 : 4
p3 : 20006
p4 : 20007
p5 : 20008
p6 : 35423
p7 : 35455
p8 : 35731
bitcount : 40
data high '0' : 24 ~ 26
data high '1' : 70 ~ 72
data low : 53 ~ 55
data : 4E 00 1F 07 74
temperature : 31.7
humidity : 78.0

色々といじっている最中におかしなことになってしまったんですが、今までの部分のソースをほとんどそのまま使っているために、ドライバから戻ってきた値の展開忘れとかそんなところのミスばかりでした。原因を調べるためにドライバにまでデバッグ用のカウンタを持たせたりしています。プライベートコードなので正直バグじゃなければ無駄でもなんでもw
現状Raspberry pi 4bにDHT11を接続して、Raspberry pi 3bにDHT22を2個接続した状態になっています。で、3bの方でも試してみました。

pi@rasp3b:~/gpioread $ ./dht2 --debug --type dht22 --gpio 6
debug mode.
sampling_start_lev : 1
sampling_end_lev   : 0
length : 84
sampling data :
20 78 82 54 26 54 26 54 26 54 26 54 26 54 26 54 73 54 25 68 73 54 26 55 73 54 73 54 74 54 26 54 74 54 25 67 26 54 26 54 26 54 26 54 26 54 26 54 26 54 73 67 26 54 27 53 74 54 26 54 74 54 73 54 26 54 25 65 73 54 74 54 73 54 26 54 74 54 26 54 26 54 73 46
sampling loop counter :
137 560 581 382 186 385 187 382 187 385 184 385 186 383 186 385 524 385 177 481 524 385 186 251 283 379 526 383 526 382 187 385 523 385 177 482 186 383 186 383 186 385 187 382 187 385 184 385 187 364 519 427 187 385 184 385 523 385 187 382 526 383 526 382 186 385 177 460 524 385 523 385 524 385 186 383 525 383 187 382 187 385 516 335
start : 1595944360 315793
p1 : 0
p2 : 181
p3 : 981
p4 : 981
p5 : 981
p6 : 15267
p7 : 15283
p8 : 16004
bitcount : 40
data high '0' : 25 ~ 27
data high '1' : 73 ~ 74
data low : 53 ~ 68
data : 02 BA 01 2C E9
2回目の読出しを行います。
sampling_start_lev : 1
sampling_end_lev   : 0
length : 84
sampling data :
18 78 82 54 26 54 26 54 26 54 26 54 26 54 26 54 74 54 25 67 74 54 26 54 73 54 74 54 74 53 26 54 74 54 73 67 26 54 26 54 26 54 26 54 26 54 26 54 26 54 73 67 26 54 26 54 74 54 26 54 73 54 74 54 26 54 25 64 74 54 74 54 73 54 26 54 74 54 26 54 73 54 26 46
sampling loop counter :
86 392 406 269 130 205 83 255 131 269 131 268 130 269 129 270 366 270 125 335 368 268 131 268 368 267 369 267 369 264 130 270 361 269 362 337 128 270 131 267 131 269 129 269 131 268 130 270 131 268 363 335 131 268 130 270 366 270 129 269 366 270 367 269 131 268 125 322 367 269 367 269 367 269 129 270 366 270 130 267 369 268 126 234
start : 1595944362 332636
p1 : 1
p2 : 168
p3 : 969
p4 : 969
p5 : 969
p6 : 15361
p7 : 15386
p8 : 16391
bitcount : 40
data high '0' : 25 ~ 26
data high '1' : 73 ~ 74
data low : 53 ~ 67
data : 02 BB 01 2C EA
temperature : 30.0
humidity : 69.9

2連続でも問題なく綺麗に取れてそうな結果となりました。これでようやく今までのモヤモヤがすっきりしました。

まだソース上の手直しを行ってきれいに整理してゆこうと思っていますが、ドライバを作っていた時の感想でも。

ドライバ内ではあまり実行時間を気にせず、それなりに作っていきました。
ドライバでの制限で通常のアプリでは簡単に行えたことが自分で実装する必要があったりしましたが、その辺は調べてわかる範囲なら何とかなるのすが、知識不足と検索能力でわからない部分はアプリ側で行う形にして逃げました。
結構痛かったのは2つあって、一つ目はペリフェラルアドレスの取得の方法。型番とかで決め打ちで逃げてもいいのですが、手持ちのRaspberry piは2b~4Bとあって、忘れたころに実行して辺にはまるのが嫌だったので、何とかしたかった。結局これはアプリからアドレスを渡すということで逃げました。
もうひとつは、GPIOレジスタのプルアップ/ダウンの設定を行うために150サイクルのウェイト処理が必要なのですが、良くわからなかったというところ。メジャー所の掲示板にも同様の質問があったりしましたが、決定的な解決策の提示はありませんでした。ARMの仕組みやアセンブラやに明るいわけではないので、どうすれば確実に固定のウェイトが入れられるかが分からなかったので、この部分もドライバでは処理しない方向で逃げてしまいました。

割込みに関しては先週調べていたインラインアセンブラで簡単に制御できたので助かりました。

処理速度はcであればあまり意識しなくても大丈夫だと思っていたのですが、メモリマップドレジスタを操作するうえで必須となるメモリリマップ操作を毎回行っていると、かなり足を引っ張られ、サンプリングのループカウンタ比だと大体10分の1程度になっていました。
まず最初に手を付けたのがその部分を初期化と解放処理に含める形に直すことから始めました。
次に行ったのはドライバのioct呼出しのオーバーヘッドがそれなりにあるので処理の切り分け方を調整しました。ドライバとアプリのどちらで実装するかを切り分けながら、タイムラグを許容できる部分で処理を切り分ける必要がありました。

とりあえずは、μ秒単位ならraspberry piのドライバ上であれば扱えそうですね。なぜか4bの方がスループットが落ちているようですが、計算すると分解性能は0.2μ秒程度。現状インライン展開や、処理上の見直しを行っていないので、やるとすればやはり限界処理速度なんてあこがれるかな?w

0 件のコメント:

コメントを投稿