7

機能/プロセスを考慮し、

void task_fun(void) { while(1) } このプロセスが通常の PC OS で実行される場合、喜んで永遠に実行されます。しかし、携帯電話では、HW ウォッチドッグの期限が切れてシステムがリセットされるため、電話全体が数分で確実にクラッシュします。PC では、このプロセスが期限切れになると、規定のタイム スライスがスケジュールされ、新しい実行可能なプロセスが実行されるようにスケジュールされます。

私の疑問は、RTOS に同じ戦略を適用できないのはなぜですか? このようなスケジューリング ポリシーが RTOS に実装されている場合、どのようなパフォーマンス制限が発生しますか?

もう 1 つの疑問はschedule()、PC OS ( Ubuntu ) と Linux カーネルも実行している電話の両方の機能をチェックしたことです。どちらもほぼ同じであることがわかりました。ウォッチドッグのハンドリングは、電話のどこで行われますか? 私の仮定では、プロセスを実行する前にウォッチドッグを開始するのはスケジューラーです。誰かがコードのどこでそれが行われているかを教えてもらえますか?

4

4 に答える 4

1

電話の「クラッシュ」は、電話の設計または特定のOSの問題であり、一般的な組み込みOSまたはRTOSではありません。優先度の低いタスク(おそらくウォッチドッグサービスを含む)を「飢餓状態」にします。これはおそらくここで起こっていることです。

ほとんどの組み込みRTOSでは、すべてのプロセスがシステム設計者によって展開時に定義され、必要に応じてすべてのプロセスがスケジュールされるように設計されています。このようなシステムにユーザー定義またはサードパーティのコードを配置すると、例のようにスケジューリングスキームが損なわれる可能性があります。ラウンドロビンスケジューラがシステムサービスを損なうことなくユーザーアプリケーションに同等にサービスを提供できるように、このようなすべてのプロセスを他のすべてのプロセスと同じ低い優先度で実行することをお勧めします。

電話のオペレーティングシステムは通常RTOSですが、ユーザープロセスはシステムプロセスよりも高い優先度で実行しないでください。シミュレートする「誤動作」アプリケーションからシステムを保護するために、このようなプロセスがウォッチドッグサービスよりも高く実行されることが意図されている場合があります。

ほとんどのRTOSは、プリエンプティブ優先度ベースのスケジューラーを使用します(最も優先度の高い準備完了タスクは、終了するか、譲歩するか、より高い優先度のタスクまたは割り込みによってプリエンプトされるまで実行されます)。また、同じ優先度レベルのタスクのラウンドロビンをスケジュールするものもあります(タスクは、終了するか、タイムスライスを生成するか、消費するまで実行され、同じ優先度の他のタスクを実行する準備が整います)。

于 2011-06-11T07:43:24.560 に答える
1

ウォッチドッグを実装する方法はいくつかありますが、いずれも Linux によって強制されるものではありません。

  • プロセスまたはスレッドは定期的に実行され、重要な操作が実行されていることをテストします。そうでない場合は、マシンを再起動するか、問題のあるコンポーネントをリセットするなどの修正アクションが実行されます。
  • プロセスまたはスレッドは継続的に実行され、余分な CPU 時間を吸収し、タイマーをリセットします。タスクを実行できない場合、タイマーが期限切れになり、修正アクションが実行されます。
  • 定期的にメッセージを送信しないと、ハードウェア コンポーネントによってシステムがリセットされます。つまり、ハードウェア タイマーが期限切れになります。

ここでは、RTOS やその他のマルチタスク オペレーティング システムで実行できないことは何もありません。

于 2011-06-10T06:52:26.770 に答える
1

デスクトップ コンピューターまたは携帯電話上の Linux は、RTOS ではありません。そのスケジューリング ポリシーは時間主導型です。

RTOS では、スケジューリングは、ISR を介した環境から、またはシステム コール (メッセージの送信、ミューテックスの待機など) を介したソフトウェア自体からのイベントによってトリガーされます。

于 2011-06-10T07:58:56.830 に答える
0

通常の OS には、2 種類のプロセスがあります。ユーザープロセスとカーネルプロセス。カーネル プロセスには時間の制約がありますが、ユーザー プロセスには時間の制約がありません。

RTOS では、すべてのプロセスがカーネル プロセスであるため、時間の制約を厳守する必要があります。すべてのプロセス/タスク (同じ意味で使用できます) は優先順位に基づいており、システムを正しく実行するには時間の制約が重要です。

したがって、コードvoid task_fun(void) { while(1) }が永遠に実行されると、他の優先度の高いタスクが枯渇します。したがって、ウォッチドッグはシステムをクラッシュさせて、他のタスクの時間的制約が満たされていないことを開発者に示します。

たとえば、GSM スケジューラは 4.6 ミリ秒ごとに実行する必要があります。タスクをそれ以上実行すると、GSM スケジューラ タスクの時間制約を満たすことができなくなります。そのため、その目的が無効になるため、システムを再起動する必要があります。

お役に立てれば :)

于 2012-03-29T08:06:35.847 に答える