Monotonic の仕組み
内部では、すべての Monotonic 実装が Timer Queue を使用します。これは、対応する Future が完了すべき時刻を記述したエントリを持つ優先度キューです。
スケジューリング用 Monotonic タイマーの実装
rtic-time フレームワークは、コンペアマッチを備え、さらに必要に応じてスケジューリング用のオーバーフロー割り込みもサポートする任意のタイマーを利用できるため、柔軟です。タイマーを RTIC で利用可能にするための唯一の要件は、rtic-time::Monotonic トレイトを実装することです。
RTIC 2.0 では、Monotonic を実装する際のすべての時間ベースの操作の基盤として、ユーザーが fugit などの時間ライブラリを利用していることを前提としています。これらのライブラリを使うことで、Monotonic トレイトを正しく実装することが大幅に容易になり、その結果、システム内のほぼ任意のタイマーをスケジューリングに使用できるようになります。
このトレイトには、各メソッドに対する要件が記載されています。参考にできるリファレンス実装が rtic-monotonics に用意されています。
Systick basedは固定の割り込み(tick)レートで動作します。多少のオーバーヘッドはありますが、シンプルで、長い時間範囲をサポートしますRP2040 Timerは、割り込みなしで長時間待機できる「本格的な」実装です。スケジューリングを処理するためにTimerQueueをどのように使うかを明確に示しています。nRF52 timersは、nRF52 の RTC と通常タイマー向けに Monotonic とタイマーキューを実装しています
貢献
Monotonic の新しい実装への貢献は、複数の方法で行えます。
rtic-monotonicsに feature flag の下でこのトレイトを実装し、それらをメインの RTIC リポジトリに含めるための PR を作成してください。この方法なら、実装は in-tree となるため、RTIC はその正しさを保証でき、新しいリリース時に更新できます。- 外部リポジトリで変更を実装してください。この方法では
rtic-monotonicsに含まれませんが、将来的にそうしやすくなる可能性があります。
The timer queue
タイマーキューはリストベースの優先度キューとして実装されており、リストノードは、monotonic を待機する際に作成される Future を await したときに生成される Future の一部として静的に割り当てられます。したがって、タイマーキューは実行時に失敗しません(そのサイズと割り当てはコンパイル時に決定されます)。
チャネル実装と同様に、タイマーキュー実装は競合を防ぐためにグローバルな クリティカルセクション (CS) に依存しています。例では、ビルドオプションに --features test-critical-section を追加することで、CS 実装が提供されます。