2020年7月29日水曜日

ioctlだと割り込みは発生しない?

寝付こうかと思ったらふとこんな疑問が。

システムコールが割込み処理という話は今まで聞いたことは無いけど、ありえなくはなさそうなので、気になりだすとダメですねwざっくりと検索して見るものの、これといった話はなさそう。なので割込み制御部分をコメントアウトしてしばらく様子を見ることに。

連続実行しているとようやく発生しました。

pi@rasp4b4g:~/gpioread $ ./dht2 --debug
debug mode.
sampling_start_lev : 1
sampling_end_lev   : 0
length : 82
sampling data :
8 83 87 54 24 54 71 54 24 54 24 54 71 54 24 54 70 54 72 53 25 54 24 54 24 54 24 54 24 55 24 54 24 54 25 54 24 54 24 54 25 53 71 54 70 54 71 54 70 54 26 53 25 54 24 54 24 132 25 53 25 54 70 54 25 54 24 54 71 54 70 54 25 53 71 54 24 54 71 54 71 54
sampling loop counter :
29 318 336 208 93 208 271 207 93 208 93 208 271 208 93 208 271 207 277 207 94 207 93 208 93 207 94 207 93 208 93 207 94 207 100 209 93 207 93 208 93 207 272 209 271 208 271 210 272 208 97 207 93 208 93 208 93 383 93 206 92 207 273 206 97 207 91 200 270 209 272 208 93 208 271 208 94 208 273 205 276 209
start : 1595972051 498325
p1 : 2
p2 : 14
p3 : 20016
p4 : 20017
p5 : 20018
p6 : 34319
p7 : 34352
p8 : 34721
bitcount : 39
受信データの長さが異常でした。

4bで実行しているので発生頻度自体少ないのかもしれませんが、それでもドライバでセンサーからの受信は安定度が増している感じがします。実行レベルが違うことで割込み時のオーバーヘッドが軽くなっているのかな?検索しつつ気まぐれに実行し続け、数回ですがこ取りこぼしを確認したので、結果として

ioctl呼出し時は、割り込み制御がかかることはない。

という当たり前の結果となりました。割り込み制御ビットや制御レジスタを参照したかったのですが、制御ビットの参照方法が分からないというwそもそもインラインアセンブラの変数の受け渡し方法とかも必要が無いからとすっ飛ばしていたのでこういう時に対応できなくなります…。

void enable_irq(void){
    __asm__("CPSIE IF;");
}

void disable_irq(void){
    __asm__("CPSID IF;");
}

こんなインラインアセンブラでもちゃんと効果が確認できてよかった。タイマー割込みは止めていないのでそれに引っかかった時はダメかもしれませんが。

0 件のコメント:

コメントを投稿