3

アプリケーションで FreeRTOS をどのように使用すればよいか悩んでいます。簡単なシナリオを提案させてください。メインと、ハードウェア固有のコードを持つモジュールがあるとします。このコードは、システムまたはセンサー内の特定のモーターを制御するためのものです...定義された役割を持つハードウェアのビット。module.c 内に という関数がありますModuleNameTaskmainを使用してタスクを作成し、xTaskCreateを渡しModuleNameTaskます。myModuleNameTaskは main.c ではなく module.c で定義されているため、 のような関数を使用するには、module.c 内に FreeRTOS のビットを含める必要がありますvTaskDelay。私はこれらのファイルを module.c 内に含めているという事実が好きではありません。移植性がなくなったと感じているからです。

それで、これをどのように処理しますか?それをmodule.cから削除しModuleNameTaskて、main.cに配置する必要がありますか? または、FreeRTOS のビットを module.c に含めなければならないという事実を受け入れるだけです。何かアドバイス?

4

2 に答える 2

8

モジュールが機能するために FreeRTOS に必要な機能は何ですか。明らかに、ヘッダーを含める必要がない場合や、関数を呼び出さない場合があります。

これらの関数を別のヘッダーに入れ、独自の関数名 ( . など)os/<operating_sys>/freertos.hでラップします。my_createtask(<args>)別の OS に移植するには、独自の関数の新しいラッパーを含む新しいファイルを提供する必要があります。

これをうまく行わないと、createtask 関数が FreeRTOS 関数とまったく同じように見え、簡単にマップできることに気付くでしょうが、linux/vxWorks/その他の OS を使用する場合、関数には正しい引数がありません。

createtask 関数には、関心のあるパラメーターのみを含める必要があります。他のものはラッパーにハードコーディングする必要があります。これにより、移植が容易になります (他のオペレーティング システムでハード コードするためのさまざまなパラメーターが必要になります)。

于 2012-11-04T08:45:01.340 に答える
5

RTOSとデバイスレイヤーの両方を抽象化します。

デザインのOSインターフェイスを定義し(これはFreeRTOS機能のサブセットである場合もあれば、RTOSプリミティブを使用して実装された高レベルのインターフェイスを含む場合もあります)、FreeRTOSを使用してこのインターフェイスを実装します。

次に、RTOS抽象化レイヤーインターフェイスのみを使用して、デバイスレイヤーを含むアプリケーション全体を定義します。アプリケーションを別のプラットフォームまたはRTOSに移植する場合は、抽象化レイヤーの実装を変更するだけで済み、元の実装と同じセマンティクスを維持するようにしてください。異なるハードウェア間で汎用できるようにデバイス層も適切に抽象化されている場合は、ハードウェアの依存関係に対して同じことを行うことができます(つまり、物理的な実装からそれらを抽象化します)。

FreeRTOS、VxWorks、Segger embOS、Keil RTX、さらにはWindowsとLinux(テストとシミュレーション用)に移植したC ++のRTOS抽象化を使用して、このアプローチを長年にわたってうまく使用してきました。もちろんC++を使用する必要はありませんが、このタスクには適しています。

抽象化では、次のことを考慮する必要があります。

  • 糸脱毛
  • IPC(キュー、パイプ、イベントフラグ、メールボックスなど)
  • 同期(ミューテックス、セマフォ)
  • タイマー
  • 割り込みハンドラ

あなたのインターフェースはFreeRTOS自体とは非常に異なって見えるかもしれません、そしてあなたがどんな種類の機能を必要とするかもしれないかを見るために他の多くのRTOSインターフェースを見る価値があるかもしれません。

于 2012-11-04T09:06:04.020 に答える