【问题标题】:What type of process control block for RTOS?RTOS 的过程控制块类型是什么?
【发布时间】:2010-08-07 06:20:48
【问题描述】:

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

1)PID 2)优先级 3)程序计数器 4)状态寄存器 5)一些标志

我还应该包括截止日期吗?或任何其他字段

【问题讨论】:

  • 一大块标记为将来使用的字节。指向上一个/下一个 PCB 的指针。

标签: operating-system real-time rtos


【解决方案1】:

这在一定程度上取决于您所编写的架构。

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

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

中断屏蔽状态

如果您的操作系统支持浮点并且您的 CPU 具有浮点单元,请不要忘记同时保存这些寄存器。

[1] 除非你是为 ARM 之类的东西写的,它有几组寄存器。在这种情况下,您只需要保存正常操作中使用的银行即可。

【讨论】:

    【解决方案2】:

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

    这是一个真实的 TCB/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;
    

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

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

    这不是唯一的方法。当您着手设计 RTOS 并实现各种 OS 原语(信号量、队列等)时,您会发现自己的特殊要求变得清晰。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-06
      • 2016-11-15
      • 1970-01-01
      • 2019-08-10
      • 1970-01-01
      • 2011-07-13
      • 1970-01-01
      • 2014-06-14
      相关资源
      最近更新 更多