RTOS のリアルタイム パフォーマンスに影響を与える要因は何ですか?

公式アカウントをフォロー+スターを付けて、楽しいコンテンツをお見逃しなく

aa888dc69b0f8aa7ded3b00e1ef37732.gif

から転載 | 埋め込みベース

RTOS: リアルタイム オペレーティング システム、正式名: リアルタイム オペレーティング システム。

大きな特徴の 1 つは、リアルタイムです。

以前「RTOS リアルタイム オペレーティング システム、本当にリアルタイムですか?」という記事をシェアしました。」ということで、今日は RTOS のリアルタイム パフォーマンスに影響を与える要因とは何かについて簡単に説明します。

概要

組み込みリアルタイム システムでは、一般にリアルタイム パフォーマンスに対する高い要件が求められます。では、リアルタイム パフォーマンスとは何でしょうか?

リアルタイム:イベントの発生からシステムの応答までの時間。

しかし、実際のアプリケーションプログラミングでは、特定のコードが原因でシステムのリアルタイム性が低下する場合があります。では、リアルタイム性を左右する要因は何でしょうか?

  • スレッド内のタスクがブロックされています

  • 割り込み関連の操作

  • クリティカルセクション関連の操作

スレッド内のタスクがブロックされています

リアルタイム スレッドでブロック タスクを実行することを避ける必要があります。

  • セマフォの解放、ロックの解放、ブロックされたキューなどを待機するスレッドを回避します。

  • 遅延操作には遅延関数の使用を避けてください。遅延が必要な場合は、リアルタイム スレッドの実行サイクルを使用して関数を定期的に呼び出すことを検討してください。

/*
  PeriodFunc()函数的运行周期为10ms
  period_ms为RTThread线程的运行周期
*/
void PeriodFunc(uint32_t period_ms) {
  static uint8_t run_period_ms = 10;
  static uint8_t current_period_ms = 0;

  current_period_ms += period_ms;
  if(current_period_ms >= run_period_ms) {
    current_period_ms = 0;
    /* user code */
  }
}
void RTThread(void *args) {
  while(1) {
    /* 
      使用该方法一定要保证线程的运行周期时准确的,
      否则函数的运行周期将不会准确 
    */
    PeriodFunc(1);
    DelayMs(1);
  }
}

割り込み関連の操作

1. オフタイム

プログラムには重要な部分がいくつかあります。安全にアクセスしたい場合は、割り込みをオフにする必要があります。その場合は、このコードにアクセスする前に全体割り込みをオフにし、アクセス後に全体割り込みをオンにしてください。システムは外部割り込みに応答できません。このセクションの時間はオフ割り込み時間です。

2. 最大シャットダウン時間

これは、非常に多くのクリティカル セクション コードのシャットダウン時間の最大のものを指します。つまり、リアルタイム オペレーティング システムの多くの時間問題は最悪のケースに基づいているため、この時間は最悪の場合の割り込みのシャットダウン時間を表します。下に。

3. 割り込み応答時間

この割り込みの受信から、この割り込みに対応する割り込みサービス関数の最初のステートメントの実行までに経過した時間。その計算式は次のとおりです。

割り込み応答時間 = 最大割り込みオフ時間 + CPU 内部レジスタを保護する時間 + 割り込みサービス関数に入る実行時間 (対応するターミナル サービス関数のアドレスは割り込みベクタ テーブル、つまりエントリに従って見つかります) + 開始までの時間割り込みサービス ルーチン (ISR) の最初のコマンドの実行時

4. 割り込み復帰時間

割り込み応答が成功したとき(つまり、割り込みサービスルーチン(ISR)の最初の命令の実行が開始された瞬間)から、割り込みサービス関数の実行が完了し、次の命令が実行されるまでの時間を指します。中断されたタスクのコード実行。その計算式は次のとおりです。

割り込み回復時間 = 割り込みサービス関数の実行に必要な時間 (これは正確ではありません。つまり、基本的な実行に必要な時間は含まれておらず、割り込みサービス関数を終了する前に OSIntExit() 関数が呼び出されます) ) + OSIntExit() (この関数は割り込みサービス関数の最後に呼び出され、割り込みから抜け出す前にタスクスイッチが発生します) + OSIntCtxSw() (実際にタスクスイッチが発生する関数はレジスタなどの操作を実行します)データポップアップ)

クリティカルセクション関連の操作

1. 基本的なクリティカルセクション

クリティカルセクションは相互排他を実現する非常に原始的な方法であり、クリティカルセクションに入る方法は、割り込みロックを使用してすべての割り込みをオフにする方法です(もちろんタスクをスケジュールすることはできません)。クリティカル セクションのコードの実行時間は非常に短くなければなりません。そうしないと、割り込みの応答時間に悪影響を及ぼします。

割り込みロックを利用してクリティカルセクションを操作する方法はあらゆる場面で応用可能であり、その他の同期方法も割り込みロックを利用して実装されており、割り込みロックは最も強力で効率的な同期方法であると言えます。割り込みロックを使用する場合の主な問題は、割り込みが無効になっている間はシステムが割り込みに応答しなくなるため、外部イベントに応答できなくなることです。したがって、割り込みロックはシステムのリアルタイム性能に多大な影響を及ぼし、不適切に使用すると、システムのリアルタイム性能がまったく発揮されなくなります(システムが必要な時間を完全に逸脱する可能性があります)適切に使用すると、高速で効率的な同期方法になります。

2. タスクのクリティカルエリア

保留中のスケジューラは、ロック スケジューラとも呼ばれます。基本的なクリティカル セクションは、コードの一部が他のタスクや割り込みによって中断されないように保護することですが、サスペンド スケジューラによって実装されるクリティカル セクションは、コードの一部を他のタスクによる中断から保護することしかできず、中断を制限することはできません。このようにして、割り込みが有効になります。

------------ 終了 ------------

56931c7bde6b7ec47a57be2b5587405f.gif

●コラム「組み込みツール

●コラム「組込み開発」

●コラム「Keilチュートリアル」

●埋め込み列に選択されたチュートリアル

公式アカウントに注意し、ルールに従って技術交流グループに参加するには「 Jiagroup 」と返信し、さらに多くのコンテンツを表示するには「 1024」と返信します。

29a7879ac3223e9ce2270200e5b9a936.jpeg

efb4604c100e0f5b484a7dbbd6ac8267.png

さらに共有を確認するには、元のテキストを読む」をクリックしてください。

おすすめ

転載: blog.csdn.net/ybhuangfugui/article/details/131929055