Operating system RTOS的过程控制块类型是什么?

Operating system RTOS的过程控制块类型是什么?,operating-system,real-time,rtos,Operating System,Real Time,Rtos,我正在设计一个RTOS,它使用基于优先级的抢占式调度器。PCB会包含什么?我只能想出这些东西 1) PID 2) 优先权 3) 程序计数器 4) 状态寄存器 5) 一些旗帜 我还应该包括一个截止日期吗?或者任何其他字段,这在某种程度上取决于您为之编写本文的体系结构 您需要所有寄存器[1],而不仅仅是状态寄存器 堆栈指针。可能是堆栈大小 中断掩码状态 如果你的操作系统支持浮点运算,而你的CPU有一个浮点运算单元,别忘了保存这些寄存器 [1] 除非你是为ARM这样的东西写这篇文章,它有几个寄存器库。

我正在设计一个RTOS,它使用基于优先级的抢占式调度器。PCB会包含什么?我只能想出这些东西

1) PID 2) 优先权 3) 程序计数器 4) 状态寄存器 5) 一些旗帜


我还应该包括一个截止日期吗?或者任何其他字段,这在某种程度上取决于您为之编写本文的体系结构

您需要所有寄存器[1],而不仅仅是状态寄存器

堆栈指针。可能是堆栈大小

中断掩码状态

如果你的操作系统支持浮点运算,而你的CPU有一个浮点运算单元,别忘了保存这些寄存器


[1] 除非你是为ARM这样的东西写这篇文章,它有几个寄存器库。在这种情况下,您只需要保存正常操作中使用的存储组。

完整的寄存器集通常保存在线程堆栈上,这意味着一个堆栈指针可能就是存储程序计数器、状态寄存器和任何其他需要进行上下文切换的寄存器所需的全部

下面是一个真实世界的TCB/PCB示例,它来自我几个月前开源的RTOS(:

除了堆栈指针,我需要的关键元素如下:

  • 优先级
  • 链表指针:为简单的基于队列的调度器管理就绪队列中的线程,或处理等待特定信号量的线程队列等
  • 暂停状态:用于处理信号量上的挂起等操作。这些用于注册暂停超时时要调用的回调函数(例如,可能是队列库中的超时处理程序),并将状态代码传递回唤醒的线程

这不是唯一的方法。当您开始设计RTO并实现各种操作系统原语(信号量、队列等)时,您会发现您自己的特定需求变得很清楚。

标记为供将来使用的大块字节。指向上一个/下一个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;