優先度ベースのプリエンプティブスケジューラを使用するRTOSを設計しています。PCBには何が含まれますか?私はこれらのアイテムを思い付くことができただけです
1)PID 2)優先度3)プログラムカウンター4)ステータスレジスタ5)いくつかのフラグ
期限も含める必要がありますか?または他のフィールド
優先度ベースのプリエンプティブスケジューラを使用するRTOSを設計しています。PCBには何が含まれますか?私はこれらのアイテムを思い付くことができただけです
1)PID 2)優先度3)プログラムカウンター4)ステータスレジスタ5)いくつかのフラグ
期限も含める必要がありますか?または他のフィールド
これは、これを作成するアーキテクチャに多少依存します。
ステータスレジスタだけでなく、すべてのレジスタ[1]が必要です。
スタックポインタ。おそらくスタックサイズ。
割り込みマスクの状態
OSが浮動小数点をサポートし、CPUに浮動小数点ユニットがある場合は、それらのレジスタも保存することを忘れないでください。
[1]複数のレジスタバンクを持つARMのようなもののためにこれを書いているのでなければ。その場合、通常の操作で使用するバンクを保存するだけで済みます。
多くの場合、完全なレジスタセットはスレッドのスタックに保存されます。つまり、プログラムカウンター、ステータスレジスタ、およびコンテキストスイッチが必要なその他のレジスタを格納するために必要なのは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プリミティブ(セマフォ、キューなど)を実装すると、独自の特定の要件が明らかになることがわかります。