ソフトウェアタイマの設計
RTOS(Real-Time Operating System:リアルタイムOS)の周期処理は、組み込みシステムの品質や安定性を左右する重要な要素の一つです。適切に設計することによって、処理のタイミングが安定し、システムの応答性を高められます。この記事では、ソフトウェアタイマの基本的な仕組みから、代表的な処理方式や実装時の設計ポイントまでを解説します。
ソフトウェアタイマとは
RTOSのソフトウェアタイマは、一定時間の経過や周期的な処理をソフトウェアで管理する仕組みです。ハードウェアタイマを直接使う場合と比べて複数のタイマを論理的に管理しやすく、さまざまな周期処理に利用できます。
RTOSが使われる環境で、センサからの情報取得や制御のための演算を実施する場合、一定周期での繰り返し処理が求められます。各処理が遅滞なく進むように周期処理を設計する必要があり、その設計はシステム全体の応答性に直結します。
代表的な処理方式
代表的な周期処理
代表的な処理方式である割り込み方式とポーリング方式の二つを解説します。あわせてタイマの精度についても説明します。
割り込み方式
特定の操作などのイベントを起点として処理を実行する方式です。割り込みは外部イベントだけでなく、タイマ満了(タイマ割り込み)でも発生します。周期処理では、タイマ割り込みを基準にタスク起床や時刻管理をおこなうことが一般的です。
割り込みハンドラは事前に登録しておき、イベント発生時にCPUがハンドラへ分岐して実行します。
割り込み発生時、CPUは(アーキテクチャに応じて)一部のレジスタを自動退避し、残りは割り込みハンドラやRTOSの割り込み入口処理で退避します。RTOSでは必要に応じてタスクコンテキストの切り換えもおこないます。
ポーリング方式
一定の周期(例:周期タスク)またはループ処理で、特定のイベントが発生しているか(状態)を定期的に確認する方式です。周期を短くするとCPU負荷が増え、長くすると検知遅延が増えます。
一方、先述した割り込み方式では、割り込み処理の終了後に元の状態に戻すオーバーヘッドが発生します。イベントが高頻度で、かつ確認処理が軽量な場合は、短周期ポーリングのほうがコンテキストの切り換えの総量が減り効率的なこともあります。
タイマの精度
割り込みが頻発するとその分オーバーヘッドが増え、処理遅延につながります。RTOSでは一定周期で発生する割り込みを基準に時間を管理することがあり、この周期的な割り込みを「ティック」と呼びます。
ティックの周期を短くすると、時間管理の粒度を細かくできます。一方で、ティック割り込みの頻度が高くなるほどRTOSのオーバーヘッドも増えるため、必要な時間精度とCPU負荷のバランスに関する配慮が欠かせません。
なお、周期ティック割り込みは、アイドル中でもCPUを定期的に起こす要因になり、低電力モードの効果を下げることがあります。アイドル状態ではティック割り込みを抑制するティックレスモードを選択すれば、より低電力な設計を実現できます。ただし、低電力モードへの移行や復帰には時間がかかることがあるため、電力とシステムの応答要件のバランスを検討する必要があります。
ソフトウェアタイマでは、分解能(ティック粒度など)だけでなく、割り込み禁止区間・高優先度タスクの実行・タイマサービス処理の混雑によってもジッタや遅延が発生します。高精度が必要な周期制御では、用途に応じて専用ハードウェアタイマや高優先度タスク設計を検討します。
実装パターン
ソフトウェアタイマを実装する代表的な方式と、それぞれの特徴を解説します。
コールバック型
コールバック型とは、タイマ満了時にあらかじめ登録したコールバック関数を呼び出す方式です。多くのRTOSでは、タイマ割り込みISR(Interrupt Service Routine)は時刻更新や起床要求など最小限にとどめ、実際のコールバック処理は、タイマサービス(デーモン)タスクで実行します。長時間処理は避け、必要な場合は別タスクへ通知して処理を委譲します。
タスク通知型
タイマ満了時に特定のタスクへ通知し、そのタスクで処理する方式です。タスクが分かれているため、処理の依存関係が明確であり保守性の高い仕組みになります。しかし、タスクの切り換えに伴うオーバーヘッドが発生します。
実装パターンの組み合わせ
ソフトウェアタイマの設計はシステムの処理時間を左右する重要な要素です。RTOSによっては、ソフトウェアタイマの管理を専用のタイマ管理タスクに集約する仕組みが用意されています。これにより、重複や競合を効果的に防げる点がメリットです。
ソフトウェアタイマからタスクを起床する場合は、対象となるタスクの優先度や他タスクとの実行関係も考慮する必要があります。


