リアルタイム制御

レイテンシ

要求から応答までの遅延時間。

概要

レイテンシ(Latency)は、あるイベント・要求が発生してから、それに対する応答・処理が始まる(または完了する)までの時間的な遅延を指します。組み込み・リアルタイムシステムにおいては、「どのくらい速く反応できるか」を表す最も基本的な性能指標のひとつです。

レイテンシは「遅延」と訳されることが多いですが、単に「遅い」という意味ではなく、「要求と応答の間の時間差」という中立的な概念です。ゼロに近いほど理想的ですが、物理的・ソフトウェア的な限界によって最小値が決まります。

組み込みシステムでのレイテンシには複数の種類があります。

  • 割り込みレイテンシ(Interrupt Latency): 割り込み信号発生からISRが実行を開始するまでの時間
  • スケジューリングレイテンシ(Scheduling Latency): タスクが「実行可能」になってから実際に実行が始まるまでの時間
  • エンドツーエンドレイテンシ: センサがデータを取得してからアクチュエータが動作するまでのトータル時間

リアルタイム性の観点では、最悪ケースのレイテンシ(WCL: Worst Case Latency)がデッドライン内に収まることが重要です。

歴史・背景

レイテンシという概念は電子工学の黎明期から存在し、信号処理の遅延時間として定義されていました。デジタルコンピュータが登場してからは、メモリアクセスレイテンシ(DRAM、キャッシュ等)や通信レイテンシが重要な指標として扱われてきました。

組み込みリアルタイムシステムにおける割り込みレイテンシの概念は、1970〜80年代のリアルタイムOS研究と並行して発展しました。ARMがCortex-Mアーキテクチャを設計した際(2004年〜)、割り込みレイテンシの最小化がアーキテクチャ設計の主要目標のひとつとされ、「Tail-chaining」「Late-arriving」「Lazy Stacking」等の最適化が導入されました。

Linuxカーネルのリアルタイム化(PREEMPT_RTパッチ)も、本質的には「スケジューリングレイテンシの削減」を目的とした取り組みです。

技術仕様

割り込みレイテンシの内訳

割り込みレイテンシ = ペリフェラル信号出力
                   + NVICでの認識・優先度判定(0〜数クロック)
                   + パイプラインフラッシュ(0〜数クロック)
                   + レジスタ自動退避(12クロック、Cortex-M)
                   + ベクタテーブル読み取り(2クロック)
                   + ISR先頭命令到達まで

ARM Cortex-M主要モデルの最小割り込みレイテンシ:

プロセッサクロック最小割り込みレイテンシ(クロック数)時間換算(例)
Cortex-M048MHz16クロック333ns
Cortex-M3120MHz12クロック100ns
Cortex-M4168MHz12クロック71ns
Cortex-M7400MHz12クロック30ns

上記は最小値であり、割り込み禁止区間・キャッシュミス・FPUレジスタ保存等により実際は長くなります。

各要因によるレイテンシ増大

要因追加レイテンシ(目安)
割り込み禁止区間(クリティカルセクション)数μs〜数十μs(コードに依存)
キャッシュミス(Cortex-M7)数クロック〜数十クロック
外付けFLASH(Wait State)1〜5クロック/アクセス
DMAバス競合数クロック〜
RTOS割り込み管理オーバーヘッド数十ns〜数μs
スケジューラのタスク選択数μs(FreeRTOS, Tick割り込み後)

Linuxのスケジューリングレイテンシ

カーネル設定最悪スケジューリングレイテンシ
標準Linux数ms〜数十ms(非リアルタイム)
CONFIG_PREEMPT(組み込み向け)〜数ms
PREEMPT_RT(Full RT)100μs〜1ms程度
Xenomai(Linuxと共存するRTOS)10〜50μs程度

動作原理

エンドツーエンドレイテンシの計算

センサからアクチュエータまでのトータルレイテンシは、各処理段階の遅延の和です。

Ltotal = Lsensor + Ladc + Lisr + Lqueue + Ltask_schedule + Lprocess + Loutput

例:温度制御システム(Cortex-M4, 168MHz, FreeRTOS, 1kHz Tick)

Lsensor     : 温度センサの応答時間 = 1ms
Ladc        : ADC変換時間(12bit, クロック除数設定) = 1μs
Lisr        : ISRのレイテンシ + 実行時間 = 71ns + 2μs ≈ 2μs
Lqueue      : キューへの書き込み + タスク通知 = 1μs
Ltask_schedule: Tick割り込みまでの待機(最悪1ms)= 0〜1ms
Lprocess    : PID演算時間 = 10μs
Loutput     : PWMデューティ更新 = <1μs

Ltotal(最悪)≈ 1ms + 2μs + 1μs + 1ms + 10μs ≈ 2.01ms

Tick割り込みを待つ「スケジューリングレイテンシ」が支配的な場合は、portYIELD_FROM_ISR()を使ってISR直後にコンテキストスイッチを発生させることで大幅に削減できます。

割り込み禁止区間のレイテンシへの影響

/* 長い割り込み禁止区間の例(悪い設計) */
taskENTER_CRITICAL(); /* 割り込み禁止開始 */
/* ... 100μsかかる処理 ... */
taskEXIT_CRITICAL();  /* 割り込み許可 */
/* → この100μsの間に発生した割り込みは、禁止解除後まで遅延 */

/* 改善:禁止区間を最小化 */
taskENTER_CRITICAL();
uint32_t snap = shared_data; /* データをスナップショット(数ns) */
taskEXIT_CRITICAL();
process_data(snap); /* クリティカルセクション外で処理 */

レイテンシの計測方法

/* GPIOとロジックアナライザによる計測 */
void gpio_interrupt_handler(void) {
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_SET); /* ISR入口でHigh */
    /* ... ISR処理 ... */
    HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, GPIO_PIN_RESET);
}
/* トリガGPIOとGPIOB_PIN0の時間差 = 割り込みレイテンシ + ISR実行時間 */

/* DWT(Data Watchpoint and Trace)カウンタによる精密計測 */
CoreDebug->DEMCR |= CoreDebug_DEMCR_TRCENA_Msk;
DWT->CYCCNT = 0;
DWT->CTRL |= DWT_CTRL_CYCCNTENA_Msk;

uint32_t start = DWT->CYCCNT;
/* 計測対象の処理 */
uint32_t elapsed = DWT->CYCCNT - start;
float time_us = (float)elapsed / SystemCoreClock * 1e6f;

用途・ユースケース

産業制御

  • サーボモーター制御: エンコーダ信号から電流出力まで100μs以内のレイテンシが必要
  • CNCマシン: 位置誤差フィードバックから補正出力まで500μs以内
  • EtherCAT: 分散クロック(Distributed Clock)で1μs未満の同期精度を実現

通信・ネットワーク

  • 産業Ethernet(PROFINET IRT): 通信サイクル125μs、レイテンシ1ms以下
  • CAN FD: フレームレート最大8Mbps、バス遅延数μs以下(終端抵抗・ケーブル長依存)
  • TSN(Time-Sensitive Networking): 帯域確保と遅延保証を組み合わせた次世代Ethernet

音声・映像

  • プロオーディオ(JACK): バッファレイテンシ2〜5ms(実用的な下限)
  • HDMI: ソース→ディスプレイのレイテンシ数ms〜数十ms(ディスプレイ処理含む)

実装・開発のポイント

レイテンシ削減の優先順位

  1. 割り込み禁止区間の最小化: 最も効果的。クリティカルセクションはデータのコピーのみに限定
  2. portYIELD_FROM_ISR()の使用: ISR終了直後にコンテキストスイッチを強制
  3. Tick周波数の向上: デフォルト1kHzを10kHzにすると最大スケジューリングレイテンシが1ms→100μsへ(ただしオーバーヘッド増加)
  4. RTOSのTicklessモードの適切な利用: 省電力とレイテンシのトレードオフ
  5. ISRの処理量を最小化: キューへの転送のみにしてタスクに委譲

cyclictestによるLinux RTレイテンシ計測

# PREEMPT_RT Linuxでのレイテンシ計測
# -p99: 優先度99のリアルタイムスレッド
# -i1000: 1ms周期でテスト
# -l100000: 100000回ループ
cyclictest -p99 -i1000 -l100000 -m -q

# 結果例:
# T: 0 ( 1234) P:99 I:1000 C: 100000 Min:    12 Act:    15 Avg:    18 Max:   187 [μs]
# Max = 187μs が最悪レイテンシ

他技術との比較

システム典型的な割り込みレイテンシスケジューリングレイテンシ
ベアメタル(Cortex-M4)数百ns〜数μsなし(直接実行)
FreeRTOS(Cortex-M4)数μs(RTOS管理込み)Tick依存(最悪1ms)
Zephyr RTOS数μs数十μs〜1ms
PREEMPT_RT Linux(ARM)数十μs100μs〜1ms
標準Linux数μs数ms〜数十ms
Windows(汎用)数ms数十ms

レイテンシの最小化はリアルタイム性の根幹です。システムの要求(デッドライン)に対して十分な余裕を持つレイテンシを実現するために、ハードウェア選定・RTOS設定・コード設計の全てを一体として最適化することが重要です。ジッタ(レイテンシのばらつき)も合わせて管理することで、安定した制御システムを構築できます。

関連用語

参考リンク