C 不直接支持线程或多任务,并且不支持线程感知,但是 C 实现通常需要用于局部变量、函数参数和函数返回地址的堆栈。
在抢占式多线程环境中,每个线程必须具有独立的堆栈,以便非线程感知的C代码具有独特的执行环境。
正如您所说,TCB 包含“有关上下文切换的信息,例如寄存器值”,这在某些实现中可能是正确的,在其他实现中,TCB 可能只包含任务堆栈指针的值- 所有其他寄存器都被推送到线程的堆栈指针上下文切换上有自己的堆栈。在上下文切换期间,堆栈指针将被恢复,然后存储在堆栈上的上下文也将被恢复。最后一个从线程堆栈中弹出的寄存器将是程序计数器,导致立即跳转到具有相同堆栈(因此具有相同的局部变量和调用堆栈)的相同位置,与抢占时的情况相同。
请注意,实现方式可能有多种不同,但以上是一般性描述,而不是对 FreeRTOS 的具体描述。
以 AVR 目标为例的 FreeRTOS 上下文切换以及由操作系统滴答引起的上下文切换的详细信息请参见: https: //www.freertos.org/implementation/a00018.html。TCB 仅保留任务的堆栈指针,程序计数器放置在堆栈上(在本例中由中断自动放置)。
您可以在您的具体实现中检查struct tskTaskControlBlock。