割り込み優先度設計の考え方|リアルタイム性を壊さないために

目次

割り込み処理解説シリーズ

本記事は「割り込み処理解説」シリーズの1つです。

割り込み処理解説シリーズの全体像はこちら

  1. 割り込みとは何か?ポーリングとの違いから理解する【組み込み入門】
  2. 割り込み処理でやってはいけないこと5選|組み込み設計の落とし穴
  3. 割り込みは「処理を書く場所」ではない|組み込み設計の本質
  4. 割り込み×状態遷移設計|イベント駆動型組み込みの基本パターン
  5. 割り込み優先度設計の考え方|リアルタイム性を壊さないために(この記事)
  6. 割り込みとRTOSなし構成の違いとは?設計思想の本質を整理する

割り込みは便利ですが、

優先度設計を間違えると、簡単に壊れます。

しかも、
原因が非常に分かりづらい。

この記事では、
割り込み優先度をどう考えるべきかを整理します。


そもそも優先度とは何か?

マイコンでは複数の割り込みが同時に発生する可能性があります。

  • タイマ割り込み
  • UART受信
  • ADC完了
  • 外部入力

このとき、

どれを先に実行するか

を決めるのが優先度です。


よくある誤解

❌ 「重要な機能ほど優先度を上げればいい」

一見正しそうですが、危険です。

重要=即時性が必要
とは限りません。


優先度設計の基本原則

原則① 実行時間が短いものを高くする

理由:

  • ネスト発生時の影響を減らす
  • スタック消費を抑える
  • レイテンシを最小化する

短く終わる割り込みは上位にしやすい。


原則② 周期が短いものは慎重に扱う

1ms周期タイマを最上位にすると、

  • 他の割り込みが常に押しのけられる
  • システム全体が不安定になる

周期が短い=高優先度
ではありません。


原則③ データ損失リスクで考える

例:

  • UART受信バッファが小さい → 優先度高め
  • ログ出力 → 低めでもOK

「失うと困るもの」を基準にする。


ネストの怖さ

優先度が高い割り込みが発生すると、

実行中の割り込みを中断します。

これをネストと言います。

Low ISR 実行中
   ↓
High ISR 発生
   ↓
High ISR 実行
   ↓
Low ISR に復帰

ここで問題になるのが:

  • スタック消費増大
  • 実行時間予測不能
  • 再入バグ

RAM不足やスタック破壊の原因になります。

(メモリ記事とも内部リンクできるポイント)


実務でやりがちな失敗

❌ とりあえず全部デフォルト

優先度を設計せず放置。

→ 不具合が出たとき地獄。


❌ 優先度を上げて“解決した気になる”

動いたからOK。

しかし本質は設計破綻。


私が意識している設計手順

① 割り込み一覧を書き出す
② 実行時間を概算する
③ 発生周期を整理する
④ データ損失リスクを評価する
⑤ スタック最大使用量を確認する

これをやるだけで事故は激減します。


優先度設計は“性能”ではなく“安定性”の話

優先度を上げることは、
処理を速くすることではありません。

システム全体を壊さないためのバランス設計

です。


まとめ

割り込み優先度設計の原則:

  • 短い処理を上位に
  • 周期だけで決めない
  • データ損失リスクで考える
  • ネストを前提に設計する

この記事が参考になった方へ

割り込みについてはこちらの記事でもまとめています。

割り込み処理解説シリーズの全体像はこちら

  1. 割り込みとは何か?ポーリングとの違いから理解する【組み込み入門】
  2. 割り込み処理でやってはいけないこと5選|組み込み設計の落とし穴
  3. 割り込みは「処理を書く場所」ではない|組み込み設計の本質
  4. 割り込み×状態遷移設計|イベント駆動型組み込みの基本パターン
  5. 割り込み優先度設計の考え方|リアルタイム性を壊さないために(この記事)
  6. 割り込みとRTOSなし構成の違いとは?設計思想の本質を整理する

技術に関するご相談・開発・自動化ツール作成・記事執筆などのご依頼も承っています。

小さなご相談からでもお気軽にご連絡ください。

お問い合わせはこちら

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする


目次