割り込みは「処理を書く場所」ではない|組み込み設計の本質

目次

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

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

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

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

これまで、

  • 割り込みの基本
  • 割り込みでやってはいけないこと

を整理してきました。

今回は少し抽象度を上げます。

割り込みは「処理を書く場所」ではない。

これは単なるテクニックではなく、設計思想の話です。


なぜ人は割り込みに処理を書いてしまうのか?

理由はシンプルです。

  • そこにイベントがあるから
  • すぐ動くから
  • コードが短く見えるから

例えば:

void UART_IRQHandler(void)
{
    receive_data();
    parse_packet();
    update_state();
}

一見きれいに見えます。

しかしこれは、

責務を混ぜている状態

です。


割り込みの本来の役割

割り込みの役割はたった一つ。

「イベントが発生した」ことを通知すること

処理を完結させる場所ではありません。

理想形はこうです。

volatile uint8_t uart_event = 0;void UART_IRQHandler(void)
{
    uart_event = 1;   // 通知だけ
}

あとはメインループ側で処理します。


なぜ“通知だけ”が正解なのか?

理由は4つあります。

① 実行時間を最小化できる

② ネストに強くなる

③ テストしやすい

④ 保守性が上がる

特に重要なのは③と④です。

割り込み内にロジックを書くと、

  • 単体テストが困難
  • 再利用しづらい
  • 仕様変更に弱い

という構造になります。


割り込みは「入口」にすぎない

設計の観点で見ると、

[割り込み] → [イベント通知] → [状態管理] → [処理]

というレイヤー構造が理想です。

割り込みは一番外側の「入口」。

ロジックの中心にしてはいけません。


並行処理としての割り込み

割り込みは本質的に「並行処理」です。

  • いつ実行されるか分からない
  • メイン処理と同時に走る
  • スタックを共有する

ここを理解すると、

ISRにロジックを書くのがいかに危険か

が見えてきます。


実務で意識していること

私が意識しているのはこの原則です。

ISRは3行以内に収める。

  • フラグを立てる
  • バッファに1バイト入れる
  • タイムスタンプを取る

それ以上はメインへ。

これだけでトラブルは激減します。


設計思想の話

割り込みをどう扱うかは、

  • 設計レベル
  • 並行処理理解
  • 保守性意識

がそのまま出ます。

動くコードを書く人と、
壊れない設計をする人の差が出る場所です。

とはいえ、割り込み内で処理せざるを得ない場合もある

理想は「通知のみ」です。

しかし実務では、

  • ハードウェアFIFOが小さい
  • 受信データを即座に退避しないと溢れる
  • レイテンシが数µs単位で厳しい

といった事情で、
割り込み内で最低限の処理が必要になることもあります。

例えば:

void UART_IRQHandler(void)
{
    uint8_t data = UART_DR;  // レジスタ読み出し
    buffer[write_idx++] = data;  // 即退避
}

ここで重要なのは、

ISRで「完結させない」こと。

  • 解析はしない
  • 判定はしない
  • 状態変更は最小限
  • ループ処理はしない

まとめ

割り込みは、

  • 処理を書く場所ではない
  • 通知する場所
  • 設計の入口

ここを理解すると、設計全体が安定します。

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

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

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

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

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

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

お問い合わせはこちら

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

この記事を書いた人

コメント

コメントする


目次