1

優先度ベースのプリエンプティブスケジューラを使用するRTOSを設計しています。PCBには何が含まれますか?私はこれらのアイテムを思い付くことができただけです

1)PID 2)優先度3)プログラムカウンター4)ステータスレジスタ5)いくつかのフラグ

期限も含める必要がありますか?または他のフィールド

4

2 に答える 2

0

これは、これを作成するアーキテクチャに多少依存します。

ステータスレジスタだけでなく、すべてのレジスタ[1]が必要です。

スタックポインタ。おそらくスタックサイズ。

割り込みマスクの状態

OSが浮動小数点をサポートし、CPUに浮動小数点ユニットがある場合は、それらのレジスタも保存することを忘れないでください。

[1]複数のレジスタバンクを持つARMのようなもののためにこれを書いているのでなければ。その場合、通常の操作で使用するバンクを保存するだけで済みます。

于 2010-08-12T20:28:39.197 に答える
0

多くの場合、完全なレジスタセットはスレッドのスタックに保存されます。つまり、プログラムカウンター、ステータスレジスタ、およびコンテキストスイッチが必要なその他のレジスタを格納するために必要なのは1つのスタックポインタだけです。

これは、数か月前にオープンソース化したRTOS( Atomthreads)のTCB/PCBの実例です。

typedef struct atom_tcb
{
    /* Thread's current stack pointer */
    POINTER sp_save_ptr;

    /* Thread priority (0-255) */
    uint8_t priority;

    /* Thread entry point and parameter */
    void (*entry_point)(uint32_t);
    uint32_t entry_param;

    /* Queue pointers */
    struct atom_tcb *prev_tcb;    /* Previous TCB in doubly-linked TCB list */
    struct atom_tcb *next_tcb;    /* Next TCB in doubly-linked list */

    /* Suspension data */
    uint8_t suspended;            /* TRUE if task is currently suspended */
    uint8_t suspend_wake_status;  /* Status returned to woken suspend calls */
    ATOM_TIMER *suspend_timo_cb;  /* Callback registered for suspension timeouts */

} ATOM_TCB;

スタックポインタとは別に、必要な重要な要素は次のとおりです。

  • 優先度
  • リンクリストポインタ:単純なキューベースのスケジューラの準備完了キュー内のスレッドを管理したり、特定のセマフォなどで待機しているスレッドのキューを処理したりします。
  • 一時停止ステータス:セマフォで保留中などのアクションを処理するため。これらは、一時停止がタイムアウトした場合に呼び出されるコールバック関数(たとえば、キュ​​ーライブラリのタイムアウトハンドラーなど)を登録し、ウェイクアップされたスレッドにステータスコードを返すために使用されます。

これはそれを行う唯一の方法ではありません。RTOSの設計に着手し、さまざまなOSプリミティブ(セマフォ、キューなど)を実装すると、独自の特定の要件が明らかになることがわかります。

于 2010-08-24T20:45:31.407 に答える