メインループと割り込み処理

前回の記事では基板への出力処理について書きました。今回は出力処理とそれ以外の処理との分担について書いていきます。

◆メインループ

ロザンヌのすべての処理はプログラミング言語C言語)で記述されており、出力処理の他にもユーザーによる設定や液晶画面への表示など様々な処理をしていて、大まかな流れは以下の通りです。

f:id:duefuku:20210305233208p:plain
メインループ

基板の電源を切らない限り水色の部分を無限に繰り返します。これをメインループと呼びます。

◆割り込み処理

で、前回書いた出力処理はこのメインループ内に含まれておらず、独立した処理としてプログラムに記述されています。こんな感じです。

f:id:duefuku:20210305233101p:plain
メインループと出力処理

この図のようにメインループと出力処理を往復することになりますが、メインループ ⇒ 出力処理の流れはいわゆる「割り込み」として処理されます。割り込みについて仕事をしている状況で例えると、

  • メインループ:自分の仕事
  • 出力処理  :電話応対

みたいなものです。仕事中に電話がかかってきたら自分の仕事をいったん止めて電話に出て、電話応対を終わらせたらまた自分の仕事に戻る、という感じです。これで割り込みのイメージは何となく分かると思います。

仕事中に電話がいつかかってくるか分からないのと同じで、メインループから見ると割り込みがいつ発生するか分かりません。というのは半分間違いで、割り込みの発生条件はプログラムする自分で決定します。ロザンヌでは以下3つの割り込み条件を設定しています。

  1. 垂直同期信号(VSync)の立ち下がり発生時
  2. 0.1msタイマーのカウントアップ時(0.1ms経過した時点)
  3. 2msタイマーのカウントアップ時(2ms経過した時点)

なのでちょっとくどいですが、ver.3の処理を文章で書くと

  1. メインループ中にVSyncが立ち下がったらメインループからいったん出力処理に行ってそっちの処理(0.1msタイマー開始)を済ませてメインループに復帰する。
  2. メインループ中に0.1msタイマーがカウントアップ(0.1ms経過)したらメインループからいったん出力処理に行ってそっちの処理(0.1msタイマーのカウントアップ回数加算)を済ませてメインループに復帰する。(ただしカウントアップ回数がユーザー設定値に到達した時のみ2msタイマー開始&コンパネ状態チェック~出力計算を実行してからメインループに復帰する。)
  3. メインループ中に2msタイマーがカウントアップ(2ms経過)したらメインループからいったん出力処理に行ってそっちの処理(基板へ信号を出力)を済ませてメインループに復帰する。

となります。

◆実際の処理の流れ

以上を前回の記事の絵と合わせて表現すると以下のような感じです。(見づらくてすみません)

f:id:duefuku:20210320150613j:plain
メインループと出力処理(割り込み)の流れ

普段はメインループで処理していて、割り込みが発生するたびにそっちの処理を済ませてすぐにメインループに復帰する、というのを繰り返します。出力処理を割り込み処理にしたのは前回の冒頭で書いた通り最重要処理と思ったからです。出力処理を最優先にすることで連射の安定化を図っています。


この辺の作りは常識的な範囲なのか逸脱しているのか自分でもよく分かりませんが、安定した連射出力を得るという目的は達成できているっぽいので概ね正しいのでは、と思っています。


それでは今回はここまでということで。次は何を書こう...