Azure RTOS ThreadXの機能と動作

つぶつぶコラム

本コラムでは、「Azure RTOSコンポーネント」についての基本機能やその動作について説明します。本内容はコラム執筆時(2023年7月)時点のものであり、今後機能が変更または削除される場合があることをご了承ください。

なお本コラムの内容は執筆者の個人的な見解も入っており、Microsoft 社からの正式な情報ではないことにご注意ください。

AzureRTOSとは

Azure RTOSは、Microsoft 社が提供するコンパクトで高速なリアルタイムOS「Azure RTOS ThreadX」を含む組込み向け開発スイートです。リソースが制限されたデバイスに信頼性の高い超高速パフォーマンスを提供し、使いやすく、多くの実績があり、全世界で100億を超えるデバイスに導入されています。

また「Azure RTOS コンポーネント」と呼ばれる各製品が用意されており、「Azure RTOS ThreadX」「Azure RTOS FileX」「Azure RTOS GUIX」「Azure RTOS GUIX Studio」「Azure RTOS NetX」「Azure RTOS NetXDuo」「Azure RTOS USBX」および「Azure RTOS TraceX」があります。

これらの「Azure RTOS コンポーネント」は、元々は旧ExpressLogic社が開発および販売していた製品群ですが、ExpressLogic社はMicrosoft社に買収され、現在はMicrosoft 社が提供しています。なおExpressLogic社時代には「Azure RTOS コンポーネント」は「X-Ware」と呼ばれていましたが、中身は同じです。

「Azure RTOS コンポーネント」は現在GitHubで一般公開(https://github.com/azure-rtos/)されており、ツール類以外はすべてのソースコードを閲覧することが可能です。

ThreadXとは

ThreadXはAzure RTOS コンポーネントのうち、組込み機器向けアプリケーション向けに設計された高度なリアルタイム オペレーティング システム(RTOS)です。リアルタイム マルチスレッド処理、スレッド間の通信と同期、メモリ管理など、RTOSに必要な基本的な機能は一通り用意されており、またいくつかの特徴的な固有機能を持っています。

ThreadXの機能

ThreadXは機能コンポーネントと呼ばれる機能群があり、block pool, byte pool, event flags, mutex, queue, semaphore, thread control, timerの機能が用意されています。

アプリケーションの動作は、thread(スレッド)と呼ばれる動作単位で制御され、基本的には一つのスレッドだけ(注:SMP動作の場合は動作可能なプロセッサコアの数)が動作状態になります。この動作状態のスレッドが何かの待ち状態に入った場合や各機能によって優先度が高いスレッドが実行可能状態になった場合、あるいは割込み処理からの機能要求などによって優先度の高いスレッドが実行可能状態になったときに、実行可能状態のスレッドの中で一番優先度の高いスレッドに切り替わります。

タイムスライス動作

ThreadXのユーザスレッドにはタイムスライス時間の設定が可能です。タイムスライス時間が設定されたスレッドは、指定時間が経過した時に、同一優先度の実行可能状態のスレッドのうち、内部のスレッド管理情報(レディーキュー)にある同一優先度のスレッドの次に実行すべきスレッドに切り替えます。この動作により、ラウンドロビンスケジュールを実行することが可能です。ThreadXのタイムスライス動作は、あくまでも同一優先度の中で行われる切り替え動作であり、一般的なRTOSの切り替え動作であるレートモノトニックスケジューリング(Rate-Monotonic Scheduling、RMS)に従い、優先度による判断を先に行うため、リアルタイム性能については影響を与えません。

プリエンプションスレッシュホールド

プリエンプション時のディスパッチ判断で、動作中のスレッドのプリエンプションスレッシュホールド値と動作すべきスレッドの優先度を比較して、次に動作すべきスレッドを決定します。

別の言い方で簡単に言えば、「二重優先度を使用したディスパッチ判断方法」ですが、この機能によりコンテキスト切り替えを減らすことが可能で、組込みシステムやIoTアプリケーションで採用されることの多い、性能があまり高くないプロセッサをより効率よく動作させることができます。

プリエンプションスレッシュホールド機能の詳細については、「Scheduling Fixed-Priority Tasks with Preemption Threshold (プリエンプションしきい値を使った固定優先度タスクのスケジューリング)」(コンコーディア大学 Yun Wang、ピッツバーグ大学 Manas Saksena 共著) を参照してください。

なお日本でよく使用されているμITRONの機能のうち、ミューテックスの機能の属性で「優先度上限プロトコル(TA_CEILING属性を指定した場合)」がプリエンプションスレッシュホールド機能とほぼ同等の判断処理を行います。ただしμITRONミューテックスの優先度上限プロトコルはミューテックスをロックした後に有効になり、アンロックした後は通常の判断に戻ります。