对于RTOS中任务的TCB和任务堆栈之间的区别,我有一点误解,TCB是不是已经携带了所有关于上下文切换的信息,比如寄存器值等等?
谢谢。
发布于 2019-12-28 11:15:46
C不直接支持线程处理或多任务处理,也不支持线程,但是C实现通常需要局部变量、函数参数和函数返回地址的堆栈。
在先发制人的多线程环境中,每个线程必须有一个独立的堆栈,以便非线程感知的C代码有一个不同的执行环境。
正如您所述,TCB包含“有关上下文切换(例如寄存器值)的信息”,这在某些实现中可能是正确的,而在另一些实现中,TCB可能只包含任务堆栈的值--指针--将所有其他寄存器推到上下文开关上线程自己的堆栈中。在上下文切换期间,堆栈指针将被还原,然后存储在堆栈上的上下文被恢复。从线程堆栈中弹出的最后一个寄存器将是程序计数器,它将立即跳转到同一个堆栈(因此也是相同的局部变量和调用堆栈)的相同位置,这与它在被抢占时所拥有的相同。
请注意,实现可能在不同的方面有所不同,但上面是一个泛化的描述,而不是专门对FreeRTOS的描述。
以AVR目标为例的FreeRTOS上下文切换和操作系统滴答引起的上下文切换的详细信息在:https://www.freertos.org/implementation/a00018.html中给出。在那里,TCB只保留任务的堆栈指针,程序计数器被放置在堆栈上(在本例中是由中断自动设置的)。
您可以在特定的实现中检查struct tskTaskControlBlock。
https://stackoverflow.com/questions/59508515
复制相似问题