第5章 · 組込みソフトウェア開発·v1.0.0·更新 2026/7/10·読了目安 約17分
変更要約: 初版
5.4割込みハンドラとリソース管理
この節の要点
ISR(割込みサービスルーチン)を短く保ち後続処理へ委譲する設計原則、リエントラントな関数設計とクリティカルセクションによる排他制御、そして限られたスタック/ヒープを守るメモリ枯渇・メモリリークへの対処を学びます。
割込みは組込みシステムがリアルタイムに外部事象へ反応するための中核機構ですが、割込みハンドラ(ISR)の中に処理を詰め込みすぎると、その間は他の割込みや通常処理が止まり、システム全体の応答性を損ないます。さらに、ISRと通常処理が同じ変数を共有すると、タイミング次第でデータが壊れる危険もあります。この節では、ISRをどう設計すべきか、そして共有資源をどう守るかという、組込みソフトウェアの信頼性を左右する判断を学びます。
5.4.1ISR設計原則(短く保ち遅延処理へ委譲)
- ISR(割込みサービスルーチン)=割込みが発生した際にCPUが実行する処理。ISRの実行中は同レベル以下の割込みがマスクされ受け付けられなくなるため、ISRを長く保つほど他の割込み対応が遅れ、システム全体のリアルタイム性が悪化する。原則は「ISRの中では必要最小限のこと(割込み要因のクリア・重要なデータの退避等)だけを行い、時間のかかる処理は通常処理側に委譲する」こと。
- 委譲の実装パターンとして、ISRは受信データをバッファに格納しフラグやセマフォを立てるだけにとどめ、実際のデータ加工・通信処理は通常のタスク側(メインループやRTOSタスク)で行う、という設計が一般的。これにより割込み応答の遅延(割込みレイテンシ)を最小化しつつ、時間のかかる処理も実行できる。
5.4.2リエントラントとクリティカルセクション
- リエントラント(再入可能)=ある関数の実行中に割込みが発生し、その割込みハンドラ(や別のタスク)から同じ関数が呼び出されても、互いの実行結果に影響を与えず正しく動作する性質。静的変数やグローバル変数への依存を避け、ローカル変数(スタック上)だけで完結させることでリエントラント性を確保するのが基本。ISRから呼び出す可能性のある共通関数は必ずリエントラントに設計する必要がある。
- ISRと通常処理(あるいは複数のタスク)が同じグローバル変数や共有バッファを読み書きする場合、片方の処理が中断された不完全な状態でもう片方がその変数にアクセスするとデータが破壊される(競合状態)。これを防ぐため、共有変数へのアクセス中はクリティカルセクション(割込み禁止区間や排他制御用のロック)で囲み、他の処理からの割り込みを一時的に防ぐ。ただしクリティカルセクションを長く取りすぎると、その間は割込みに応答できずリアルタイム性が悪化するため、必要最小限の範囲に絞るのが設計の要諦。

