【问题标题】:Microprocessor context switch微处理器上下文切换
【发布时间】:2017-01-06 10:35:48
【问题描述】:

我已经开始调查 FreeRTOS 并研究了任务上下文保存例程。该例程存储寄存器和堆栈指针。我的问题是关于不同线程中的堆栈。如果有一个线程执行编译器生成的推送和弹出怎么办。难道不能覆盖不同线程的栈吗?

【问题讨论】:

  • 如果没有内存保护,你可以做任何事情。如果有,那就没有。但是为什么你认为堆栈可以被覆盖?在那里运行的每个线程都会有编译器生成的推送和弹出,所以......?
  • 但是如果根据特定条件有一些推送和弹出怎么办?然后可以覆盖另一个线程的堆栈。
  • 不过,请解释一下这将如何发生。线程有单独的堆栈,为什么它们会相互覆盖?这个具体的条件是什么?
  • 是的,有很多带有条件的推送和弹出等等。它们仍然有单独的堆栈,唯一可以覆盖它们的方法是堆栈溢出或故意更改堆栈指针。编译器、ifs 或 buts 不会改变任何东西。
  • @Gustavo :每个线程的堆栈指针是上下文切换期间存储和恢复的集合的一部分。通过在其他寄存器之后恢复线程的堆栈指针和程序计数器,可以对大多数目标进行上下文切换。

标签: multithreading embedded rtos


【解决方案1】:

每个线程必须为其自己的调用堆栈分配足够的堆栈加上上下文存储所需的堆栈。上下文存储所需的额外堆栈空间量取决于目标,但特别是在 FreeRTOS 的情况下,常量 configMINIMAL_STACK_SIZE 将至少是该大小加上一些余量。

在中断上下文中使用线程堆栈的某些目标上,您还需要考虑中断对堆栈的使用。如果中断是可嵌套的;最坏的情况是,所有中断在任何中断完成之前都按优先级顺序变为活动状态——这可能不太可能发生,但您应该考虑这种情况。

常见问题解答中提供了有关 FreeRTOS 堆栈分配的建议http://www.freertos.org/FAQMem.html#StackSize

【讨论】:

    猜你喜欢
    • 2011-03-03
    • 2012-07-14
    • 1970-01-01
    • 2021-07-19
    • 2015-08-26
    • 2016-07-01
    • 1970-01-01
    • 2021-08-29
    相关资源
    最近更新 更多