解釈 | リアルタイム オペレーティング システムのコンセプト カーディング

RTOSとは何ですか? リアルタイム オペレーティング システムを深く理解すると、RTOS の基本原理は、割り込み処理とタスク スケジューリングを通じてリアルタイム パフォーマンスを達成することであることがわかります。スレッドとスケジューリングは、RTOS の 2 つの最も重要な概念です。

この記事では、まずこれら 2 つの概念について説明し、その後、RTOS のその他の関連用語をカーネル クラスとスレッド クラスの関連用語に簡単に分けて説明します。これらの基本概念を理解することが、RTOS を学習する上で重要な部分です。ここで、カーネルとは、RTOS のコア部分、つまり RTOS メーカーが提供するプログラムを指し、スレッドとは、アプリケーション設計者がコンパイルし、カーネルのスケジューリングに従って実行されるプログラムを指します。

スレッドとスケジューリングの基本的な意味

スレッドとスケジューリングは RTOS において切り離すことのできない重要な基本概念であり、RTOS を学習するにはこれらを完全に理解することが重要です。

1. スレッドの基本的な意味

スレッドは RTOS で最も重要な概念の 1 つです。RTOSでは、複雑な組み込みアプリケーションのプロジェクトを、一定のルールに従って機能が明確な小さなプロジェクトに分解し、それぞれの小さなプロジェクトの動作ルールを設定してRTOSに引き渡して管理する、これがRTOSの基本的な考え方です。ベースのプログラミング。この小さなプロジェクトをスレッド(Thread)と呼び、RTOSがこれらのスレッドを管理することをスケジューリング(Scheduling)と呼びます。

RTOS でスレッドを正確かつ完全に定義するのはそれほど簡単ではなく、スレッドはさまざまな観点から理解することができます。スレッドスケジューリングの観点から見ると、RTOS におけるスレッドは、RTOS スケジューリングの基本単位である明確な機能を備えた小さなプログラムであると考えることができますが、RTOS ソフトウェア設計の観点からは、独立した相互作用するプログラム、そのようなプログラムの集合はスレッドと呼ばれ、各スレッドには特定の優先順位が与えられます。CPU の観点から見ると、単一の CPU の下では、CPU は特定の瞬間にのみ処理 (実行) します。 、または 1 つのスレッドだけが CPU を占有します。RTOS カーネルの主な機能は、システム内の各スレッドが実行できるように、合理的な方法で時間を割り当てる (スケジューリング) ことです。

実際、特定の RTOS によっては、スレッドをタスク (Task) と呼んだり、他の名詞が使用されたりする場合があり、意味は若干異なる場合がありますが、本質は同じであり、あまりコストをかける必要はありません。 RTOS を学習する鍵となるのは、スレッド設計方法を習得し、スケジューリング プロセスを理解し、プログラミングの堅牢性を向上させ、基礎となる駆動原理を理解し、プログラムの標準化、移植性と再利用性を向上させ、実際の開発能力を向上させることであるため、その正確なセマンティクスに力を注ぐ必要があります。組み込みシステムなどの RTOS ベースの組み込みソフトウェア開発でスレッドの使用を真に理解して習得するには、スレッドのステータス、構造、優先順位、スケジューリング、同期などの観点から理解する必要があります。これについては後続の章で詳しく説明します。

2. スケジューリングの基本的な意味

マルチスレッド システムでは、RTOS カーネル (カーネル) はスレッドの管理、または各スレッドへの CPU 時間の割り当てを担当し、スレッド間の通信を担当します。

スケジューリングとは、どのスレッドを実行するかを決定することであり、カーネルの最も重要な責任です。各スレッドには、その重要性に応じて特定の優先順位が与えられます。さまざまなスケジューリング アルゴリズムは、RTOS のパフォーマンスに大きな影響を与えます。優先度ベースのスケジューリング アルゴリズムは、RTOS で一般的に使用されるスケジューリング アルゴリズムです。その中心的な考え方は、準備完了状態で最も高い優先度を持つスレッドを常に最初に実行することです。ただし、優先度の高いスレッドが CPU を使用する権利を持つかどうかは、使用されるカーネルのタイプによって決まります。優先度ベースのカーネルには、ノンプリエンプティブルとプリエンプティブルの 2 つのタイプがあります。

カーネル クラスのその他の基本概念

RTOS シナリオでプログラミングする場合、チップ起動プロセスは最初に RTOS カーネルと呼ばれるプログラム コードを実行します。このコードの機能は、ユーザー スレッドの動作環境を開き、スレッド スケジューリングの準備をすることです。RTOS は一般にカーネルとエクステンションで構成され、カーネルの主な機能はスレッド スケジューリングであり、エクステンションの主な機能はアプリケーション プログラミング インターフェイス (API) を提供することです。カーネル クラスのその他の基本概念には主に、タイム ティック、コードのクリティカル セクション、ノンプリエンプティブル カーネルとプリエンプティブル カーネル、リアルタイム関連の概念、および RTOS リアルタイム インジケーターが含まれます。

1. タイムティック

クロック ティック (ClockTick) は、直接クロック ティックと訳されることもありますが、タイマーによって生成される特定の周期的な割り込みで、カーネルが優先順位の高いスレッドが準備完了状態に入ったかどうかを判断できるようにします。

2. コードのクリティカルセクション

コードのクリティカル セクションはクリティカル セクションとも呼ばれ、処理中に分割できないコードのことを指し、コードのこの部分の実行が開始されると、中断は許可されません。クリティカル セクションのコードを確実に実行するには、クリティカル セクションに入る前に割り込みをオフにし、クリティカル セクションのコードが実行された直後に割り込みをオープンする必要があります。

3. 非プリエンプティブル カーネルとプリエンプティブル カーネル

ノンプリエンプティブ カーネル (Non-PreemptiveKernel) では、各スレッドが CPU の使用権を自発的に放棄する必要があります。ノンプリエンプティブ スケジューリング アルゴリズムは、協調マルチスレッドとも呼ばれます。各スレッドが連携して CPU を共有します。ただし、非同期イベントは引き続き割り込みサービスによって処理されます。割り込みサービスは、優先度の高いスレッドを一時停止状態から準備完了状態に変更できます。CPU の使用権を放棄すると、新しい優先度の高いスレッドは、CPU の使用権を取得できます。 CPUを使用する権利。

システムの応答時間が重要な場合は、プリエンプティブ カーネル (PreemptiveKernel) を使用する必要があります。プリエンプティブル カーネルでは、実行中のスレッドを中断して、より高い優先順位を持つ別のスレッドが実行できるようにすることができます。割り込みサービスサブルーチンによって高優先度のスレッドが準備完了状態になった場合、割り込みが完了すると、割り込まれたスレッドは一時停止され、高優先度のスレッドが実行を開始します。

4. リアルタイム関連の概念と RTOS リアルタイム インジケーター

ハード リアルタイム (HardReal-Time) では、指定された時間内に操作が完了する必要があり、これはオペレーティング システムの設計時に保証されています。通常、優先順位主導、時間決定主義、プリエンプティブ スケジューリングを備えた RTOS システムはハード リアルタイムと呼ばれます。リアルタイム システム。ソフト リアルタイム (SoftReal-Time) は、スレッドの優先順位に従って操作ができるだけ早く完了する限り、それほど厳密ではありません。

RTOS が追求するのは、リアルタイム スケジューリング、確定的な応答時間、システムの高い信頼性であり、一般に RTOS はスレッド スケジューリング、メモリ オーバーヘッド、システム応答時間、割り込み遅延などのさまざまな側面から評価できます。

(1) スレッドスケジューリングの時間インジケーター

RTOS のリアルタイム機能とマルチスレッド機能は、そのスレッド スケジューリング メカニズムに大きく依存します。ほとんどの商用リアルタイム システムでは、緊急事態が発生した場合にオペレーティング システムがシステムの使用権を迅速に取得してイベントに対応できるように、「プリエンプティブ スレッド スケジューリング」機能が提供されています。つまり、オペレーティング システムは、アプリケーション (アプリケーション スレッド) の実行をアクティブに終了し、最も優先度の高いスレッドに実行権限を与える権利を持っています。

スケジューリング レイテンシー (SchedulingLatency): 優先順位の高いスレッドの準備が整ってから、そのスレッドが実行を開始するまでの時間を指します。つまり、スレッドがトリガーされてから実行を開始できるようになるまでの時間です。

スレッド切り替え時間 (Context-SwitchingTime): スレッドが何らかの理由で終了すると、RTOS はその実行サイト情報を保存し、対応するリストを挿入し、特定のスケジューリング アルゴリズムに従って新しいスレッドを再選択して、そのスレッドを動作させます。このプロセスの時間をスレッド切り替え時間と呼びます。スレッドの切り替え時間が短いほど、RTOS のパフォーマンスは高くなります。

回復時間 (RecoveryTime): スレッドの完了後、システムがメイン プログラムの実行を再開するために応答するまでに必要な時間を指します。

(2) 最小限のメモリオーバーヘッド

RTOSの設計プロセスでは、コストの制約から組み込みシステム製品のメモリ構成は一般に大きくなく、限られたメモリ空間にRTOSだけでなくユーザープログラムもロードする必要があります。したがって、最小メモリ オーバーヘッドは重要な指標であり、RTOS 設計と他のオペレーティング システム設計の明らかな違いの 1 つです。

(3) システムの応答時間

システム応答時間 (システム応答時間): システムが処理要求を送信してから応答信号を与えるまでの時間を指します。つまり、スレッド要求の生成からスレッドの完了までの時間間隔を指します。特定の時間制約を満たす必要があります。制御は特定のリアルタイム要件を満たす必要があります。つまり、応答時間が臨界時間未満である必要があります。システムの応答時間は、CPU に外部割り込みが送信されて処理が開始されるまでの時間と、CPU が処理を完了するまでの時間の 2 つの時間で構成されます。システムの応答時間を改善するには、まず反応時間と処理時間を短縮します。応答時間は電気信号の伝導時間であり、プロセッサーの速度が異なっていても、この時間はそれほど変わりません。

(4) 割り込み遅延

割り込みは、非同期イベントの発生を CPU に通知するためのハードウェア メカニズムです。CPU が割り込みを認識してスレッド コンテキストを保存すると、割り込みサービス ルーチン (ISR) にジャンプして実行し、割り込みを処理した後、実行可能リストの中で最も優先度が高いスレッドに戻ります。RTOS がコア状態で動作しているとき、または一部のシステム コールを実行しているときは、外部割り込みの到着によりすぐには割り込みサービス ルーチンを実行せず、RTOS がユーザー状態に戻ったときにのみ外部割り込み要求に応答します。最大時間は割り込み禁止時間です。

割り込みレイテンシ (Interrupt latency) 時間: 割り込みサービス ルーチンの最初の命令が実行されるまで、システムが割り込みの開始を確認し、処理プロセス全体に要する時間を指します。割り込み禁止時間が短いほど、割り込み遅延時間が短くなり、システムのリアルタイム性が高くなります。

スレッドクラスのその他の基本概念

ここでは、スレッド クラスのその他の基本概念を要約します。スレッド コンテキストとスレッドの切り替え、スレッド間通信、デッドロック、スレッドの優先順位、優先順位の駆動、優先順位の反転、優先順位の継承、リソース、共有リソース、相互排他などです。

1. スレッドコンテキストとスレッド切り替え

スレッドのコンテキスト (Context)、つまり CPU 内のレジスタ。マルチスレッド カーネルは、別のスレッドを実行することを決定すると、実行中のスレッドの現在のコンテキストを保存します。このコンテキストは、ランダム アクセス メモリ (RandomAccessMemory、RAM) 内のスレッドの現在の状態の保存領域 (Task'sContextStorageArea) に保存されます。スレッド独自のスタック。スタッキング作業が完了すると、次に実行するスレッドの現在のステータスがスレッド スタックから CPU のレジスタに再ロードされ、次のスレッドの実行が開始されます (このプロセスは、スレッド スイッチングまたはコンテキスト スイッチングと呼ばれます)。

2. スレッド間通信

スレッド間通信とは、スレッド間で情報を交換することを指し、その機能は同期とデータ送信を実現することです。同期とは、スレッド間の協力関係に従って、異なるスレッドの実行順序を調整することを指します。スレッド間の通信方式には主にイベント、メッセージキュー、セマフォ、ミューテックスなどがあります。スレッド間通信の概念と、それに続く優先度の反転、優先度の継承、リソース、共有リソース、および相互排除の概念については、後続の章で詳しく説明します。

3. デッドロック

デッドロックとは、2 つ以上のスレッドが互いのリソースを解放するのを無期限に待機することです。デッドロックの必要条件は、リソースの相互排他アクセス、リソースの非プリエンプション、リソースのリクエスト保持、スレッドの循環待機の 4 つです。デッドロックの問題を解決する方法は、デッドロックに必要な条件をすべて破棄することです。たとえば、スレッドの実行中にのみすべてのリソースが割り当てられ、その他の任意の状態は割り当てられないことを規定し、リソース要求の保持特性を破壊します。

4. スレッド優先度、優先度ドライバー、優先度反転、優先度継承

マルチスレッド システムでは、各スレッドには優先順位 (Priority) があります。

優先順位主導: マルチスレッド システムでは、実行中のスレッドは常に最も高い優先順位を持つスレッドになります。いつでも、CPU は常に最も優先度の高いスレッドに割り当てられます。

優先度の逆転: 優先度の低いスレッドがリソースを解放するのを待ってスレッドがブロックされる場合、この現象は優先度の逆転と呼ばれ、プログラミング時に注意しなければならない問題です。優先度継承テクノロジは優先度逆転問題を解決することができ、現在市場にあるほとんどの商用オペレーティング システムは優先度継承テクノロジを使用しています。

優先順位の継承: 優先順位の継承は、優先順位逆転問題を解決するために使用される手法です。優先度の逆転が発生すると、優先度の低いスレッドの優先度が、優先度の高いスレッドの優先度と一致するように一時的に引き上げられます。これにより、優先度の低いスレッドができるだけ早く実行できるようになり、優先度の高いスレッドが必要とするリソースが解放されます。

5. リソース、共有リソース、相互排他

リソース (リソース): スレッドによって占有される任意のエンティティをリソースと呼ぶことができます。リソースは、プリンター、キーボード、モニターなどの入出力デバイスであることも、変数、構造体、配列であることもあります。

共有リソース (SharedResources): 複数のスレッドで使用できるリソースは、共有リソースと呼ばれます。データの破壊を防ぐために、共有リソースを扱う場合、各スレッドはリソースを独占する (相互排他) 必要があります。

相互排他 (MutualExclusion): 相互排他は、複数のスレッドによる共有データへの順次アクセスを制御するために使用される同期メカニズムです。マルチスレッド アプリケーションでは、2 つ以上のスレッドが同じデータ領域に同時にアクセスすると、アクセスの競合が発生しますが、相互排他により、競合を引き起こすことなく共有データに順番にアクセスできます。

おすすめ

転載: blog.csdn.net/Kyland2020/article/details/130946643