割り込みルーチンには重い処理を書かないという常識

  • 投稿日:
  • by



じゃぁ割り込みきっかけで重い処理を起動したいときはどうするんだヨ。


タイマ割り込みで、定期的に重い処理をするとします。


重いといっても、割り込み周期ほどではないとします。


# そうでないと周期の設計が間違っているだけのこと


ここで



周期以内には終わるんだから、割り込み禁止のままで全部処理しちゃったほうが、排他制御を考えなくていいじゃん。


と考えるのは、間違いです。いろんな意味で。*1


タイマ割り込みがきっかけだけをつくるのであれば、割り込みルーチンは排他制御で保護されたカウンタを+1でもするだけでよいのです。


タイマきっかけで動作させたい処理は別タスクで、



  • カウンタが1以上になるのを待つ(セマフォtake)

  • 1以上になったら-1してセマフォgive

  • 重い処理を実行

  • 最初に戻る


これだけです。間抜けな実装では、重い処理中もセマフォをつかんだままにして、



割り込みルーチンがセマフォ経由で重い処理に待たされる



という愚の骨頂を実現してたりします。


カウンタセマフォが使えるなら1発で済む話だと思うんですが。




*1:そういう手合いはシリアルドライバ周辺のソースでも煎じて飲んでみたらよいと思う。普段馬鹿にしているシリアルがきちんと動作するためのインフラがどうなっているか理解するという経験ができるはず。とか書きながら自分もうろ覚えだったりする。