Полный набор регистров часто сохраняется в стеке потока, что означает, что для хранения счетчика программ, регистров статуса и любых других регистров, которые необходимо переключать по контексту, может быть все, что вам нужно.
Вот реальный пример УТС/PCB от RTOS я открытым кодом несколько месяцев назад (Atomthreads):
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;
Помимо указателя стека, ключевые элементы, которые я должен был следующим:
- Приоритет
- связный список указателей: Чтобы управлять потоками в очередь готовых для простой очереди-ба sed или очереди обработки потоков, ожидающих на определенном семафоре и т. д.
- Состояние приостановки: для обработки таких действий, как ожидающие действия на семафоре. Они используются для регистрации функции обратного вызова, которая будет вызываться, если время ожидания приостановки (которое может быть обработчиком тайм-аута в библиотеке очереди, например) и передать коды статуса обратно в пробужденную нить.
Это не единственный способ сделать это. Вы обнаружите, что ваши собственные конкретные требования становятся ясными, когда вы указываете дизайн RTOS и реализуете различные примитивы ОС (семафоры, очереди и т. Д.).
Большой блок байтов, обозначенный для использования в будущем. Указатели на предыдущую/следующую печатную плату. – dbasnett