ポーリングと割り込みとは何ですか
ポーリングとは、プログラムが自分から何度もピンを読んで、変化を探す方法です。割り込みは、変化が起きたときに、チップがプログラムを呼んでくれる方法です。
このレッスンでは、同じボタンを2つの方法で読み、ボタンのバウンスを数えて取り除きます。
このレッスンのゴール
メモ
ポーリングと割り込みの違いを説明し、バウンスを取り除くことができる。
キーワード
| ことば | いみ |
|---|---|
| ポーリング | プログラムが自分で何度もピンを読むこと |
| 割り込み | 変化を知らせて、処理を呼び出す仕組み |
| ハンドラ | 割り込みのときに呼ばれる関数 |
| 立ち上がり | ピンが0から1に変わる瞬間 |
| バウンス | ボタンが押された瞬間に、細かく揺れる信号 |
| デバウンス | バウンスによる余計な押下を取り除くこと |
学生が入力するセルは、このプレビューでは空白です。
ポーリングは何度も聞きに行く
ポーリングでは、ループの中で毎回ピンを読みます。前の値が0で、今の値が1なら、立ち上がりです。ボタンが押されたと分かります。
簡単ですが、ループがほかの仕事で忙しいと、短い変化を見逃します。
画面の語は英語です
重要
ラボのチップは、実在しないマイコンのシミュレータです。スクリプトは英語で出力します。pin はピンの値、press seen? の yes は、立ち上がりを見つけたしるしです。
ポーリングで12ティック読む
docker exec jupyter python3 steps/poll.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
ポーリングの出力を読む表
| ティック | ピンの値 | 押しを見つけたか |
|---|---|---|
| 0 と 1 | 0 | いいえ |
| 2 | 1 | はい |
| 3 | 0 | いいえ |
| 4 | 1 | はい |
| 5 から 9 | 1 | いいえ |
| 10 と 11 | 0 | いいえ |
学生が入力するセルは、このプレビューでは空白です。
1回の押しが2回に数えられる
最後の行は one real press, but the loop counted 2 です。実際の押しは1回なのに、2回と数えました。
ティック3で信号が一瞬0に戻り、ティック4でまた立ち上がったからです。これがバウンスです。
割り込みはチップが呼んでくれる
割り込みでは、立ち上がりが起きると、チップが IFR の旗を立てます。タイマーの制御で IE が有効なら、チップがハンドラを呼びます。
プログラムは、ピンを読み続けなくて済みます。ほかの仕事をしていても、変化を逃しません。
割り込みでハンドラを呼ぶ
docker exec jupyter python3 steps/interrupt.pyここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
割り込みでもバウンスは残る
ハンドラは、ティック2とティック4で呼ばれ、handler calls: 2 と出ます。ポーリングと同じ2回です。
そのあとスクリプトは、前に残した呼び出しから3ティック以内のものを捨てます。結果は calls kept after waiting out the bounce: 1 で、1回の押しになります。
立ち上がりを手元で数える
signal = [0, 1, 1, 0, 0, 1, 0, 1, 1, 1]
last = 0
edges = 0
for value in signal:
if last == 0 and value == 1: # 0から1への変化
edges = edges + 1
last = value
print("立ち上がりは", edges, "回")
# 練習: 後ろから4つ目の 0 を 1 に変えると、立ち上がりはいくつになりますか。
よくある間違い
注意
「割り込みを使えば、バウンスはなくなる」と考える人が多くいます。ハンドラは、揺れるたびに呼ばれます。割り込みが省くのは、読み続ける手間です。バウンスは、プログラムで取り除きます。