2020年7月24日金曜日

割り込みの様子を見てみる

日照時間が少なく、日が差しても気温が上がるだけで湿気が高い日が続いていて過ごしにくい日が続いていますね…。

色々と無駄な足掻きを必死にしてもう少しで、、、というところでやっぱりダメという感じのことを繰り返しています。

取りこぼしの原因は何らかの割り込み処理なんだろうなぁとは分っているものの、μsやms単位の処理を気にすることはほとんどない世界に居すぎたため、armやlinuxの割り込み処理を調べることがから始めました。

割り込みを一時的に停止させる方法は大きく分けて3つあるようで、アセンブラでCPSIE/CPSIDでIとFのフラグを操作すれば割り込みを有効/無効化する方法と、armのメモリマップドレジスタを操作することで割込み制御を行う方法があるようです。
ただし、CPS命令は特権モードでしか使用できません(無視されるだけかも)。
最後の一つはarmは割り込み処理中は割り込みが発生しないので、割り込み処理で実装すればこの問題は解決できそうです。現状のままだとするとメモリマップドレジスタしか選択肢は無いようです。

ユーザーの権限さえあればarm自身のメモリマップドレジスタを自由に直接触れるのでかなり柔軟にアプリケーション側の協調が行えるようになっている印象を受けました。基本的な仕組みや考え方は昔から変わっていないようなのですが、割り込みの種類が増えているので、その辺の話をもうちょっと調べる必要があるのかな。

色々と調べていったうちにそのものずばりの内容の物を見つけたので早速試したものの、これも処理落ちが発生してしまいました。

とりあえず割り込み状況を把握しやすそうなソースだったのでこのソースを基に色々といじってみようかと
https://qiita.com/yagshi/items/8803400e419cf8512162
まずはほぼそのままの状態でコンパイルして実行した結果をグラフ化したもの
 点をプロットさせているだけですが、IRQ割り込みを無効化するとそれなりに落ち着いた感じにはなりますが、それでも赤い点が上下に散らばってしまっているところがあるので、ここで何らかの処理落ちが発生しています。
ソースを見る限り、IRQ割り込みだけしか止めていないようだったので、FIQの方も無効化してみました。


それでも、まだちらほらと上下している点が見えるので処理落ちが発生しています。

cpuクロックが原因なのかもしれないと、
pi@rasp3b:~ $ sudo cpufreq-set -c 0 -g performance
pi@rasp3b:~ $ sudo cpufreq-set -c 1 -g performance
pi@rasp3b:~ $ sudo cpufreq-set -c 2 -g performance
pi@rasp3b:~ $ sudo cpufreq-set -c 3 -g performance
としてみましたが、結果はあまり変わり映えしませんでした。
それでも確かに、レジスタでIRQとFIQの割り込みを無効化させればそれなりに安定して動いてはくれそうな雰囲気です。アプリではこの辺が限界なのでしょうかね?

0 件のコメント:

コメントを投稿