【问题标题】:RTOS TCB vs Task stackRTOS TCB 与任务堆栈
【发布时间】:2020-04-17 21:10:34
【问题描述】:

我对任务的 TCB 和 RTOS 中的任务堆栈之间的区别有点误解,TCB 不是已经携带了所有需要的有关上下文切换的信息,例如寄存器值等吗?

谢谢。

【问题讨论】:

  • 堆栈由任务本身使用(例如调用函数时)。操作系统使用 TCB 来管理任务。
  • 请参阅您的处理器用户手册以了解如何确认中断。可能是硬件在中断线程的堆栈上保存了一些上下文,例如标志,指令指针。您的操作系统手册将解释其他上下文数据,例如堆栈指针,保存在 TCB 中。
  • 简而言之,TCB 保存着任务的各种属性,栈顶保存着各种寄存器。

标签: c embedded freertos rtos


【解决方案1】:

C 不直接支持线程或多任务处理,也不是线程感知的,但是 C 实现通常需要 堆栈 用于局部变量、函数参数和函数返回地址。

在抢占式多线程环境中,每个线程必须有一个独立的堆栈,以便非线程感知的 C 代码具有不同的执行环境。

正如您所说,TCB 包含“有关上下文切换的信息,例如寄存器值”,这在某些实现中可能是正确的,在其他实现中,TCB 可能仅包含任务的值 ​​stack-pointer - 所有其他寄存器在上下文切换时被推送到线程自己的堆栈。在上下文切换期间,stack-pointer 将被恢复,然后存储在堆栈上的上下文被恢复。从线程堆栈中弹出的最后一个寄存器将是 program-counter 导致立即跳转到具有相同堆栈(因此相同的局部变量和调用堆栈)的相同位置,它当它被抢占时有。

请注意,实现方式可能会有所不同,但以上只是笼统的描述,而不是对 FreeRTOS 的具体描述。

使用 AVR 目标作为示例的 FreeRTOS 上下文切换的详细信息以及由 OS 滴答引起的上下文切换在:https://www.freertos.org/implementation/a00018.html 中给出。在那里,TCB 只保留任务的堆栈指针,程序计数器放在堆栈上(在本例中由中断自动)。

您可以在您的具体实现中检查struct tskTaskControlBlock

【讨论】:

  • 很好的解释!应该很快收到accept IMO。
  • 那个 esp32.info 现在是 NSFW
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-23
  • 2011-05-04
  • 2017-05-02
  • 2011-01-27
  • 2014-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多