【发布时间】:2017-01-06 10:35:48
【问题描述】:
我已经开始调查 FreeRTOS 并研究了任务上下文保存例程。该例程存储寄存器和堆栈指针。我的问题是关于不同线程中的堆栈。如果有一个线程执行编译器生成的推送和弹出怎么办。难道不能覆盖不同线程的栈吗?
【问题讨论】:
-
如果没有内存保护,你可以做任何事情。如果有,那就没有。但是为什么你认为堆栈可以被覆盖?在那里运行的每个线程都会有编译器生成的推送和弹出,所以......?
-
但是如果根据特定条件有一些推送和弹出怎么办?然后可以覆盖另一个线程的堆栈。
-
不过,请解释一下这将如何发生。线程有单独的堆栈,为什么它们会相互覆盖?这个具体的条件是什么?
-
是的,有很多带有条件的推送和弹出等等。它们仍然有单独的堆栈,唯一可以覆盖它们的方法是堆栈溢出或故意更改堆栈指针。编译器、ifs 或 buts 不会改变任何东西。
-
@Gustavo :每个线程的堆栈指针是上下文切换期间存储和恢复的集合的一部分。通过在其他寄存器之后恢复线程的堆栈指针和程序计数器,可以对大多数目标进行上下文切换。
标签: multithreading embedded rtos