【问题标题】:Main stack space and task stack space主栈空间和任务栈空间
【发布时间】:2017-04-05 11:24:03
【问题描述】:

我想知道主堆栈空间和任务的堆栈空间之间是否有任何区别。我参加了一个关于 RTOS 的测验,其中提出了以下问题

假设在任务函数中声明了一个非静态局部变量,在任务函数执行过程中,该非静态变量的内存究竟分配到了哪里?

void task_function(void *p)

{

 /*this is task function */

int i ; /* non static variable */
}

给出的选项是: RAM 的主堆栈空间。 b.Task的栈空间。

我想知道除了为每个任务分配的堆栈空间之外,是否还有一个单独的 RAM 的主堆栈空间。如果是,那为什么?

【问题讨论】:

  • 击败我。线程有堆栈。这就是自动存储变量的去向。对我来说就是这样。我也不知道什么是“主堆栈空间”:)
  • 如果主栈空间是指Main函数的栈空间,则不存储在主栈空间中。

标签: c++ c rtos freertos


【解决方案1】:

启动时,在调用main 之前会运行启动代码。启动代码放置了main 所需的运行时环境。这包括初始化已初始化的变量、清零未初始化的变量、设置堆栈指针,以及对于 C++,调用静态分配对象的构造函数。因此,当main 被调用时,已经有一个堆栈设置并正在使用中。我想这就是测验所指的“主堆栈”。

对于 Free-RTOS 和其他典型的 RTOS,当调用 main 时,RTOS 不会设置和运行。相反,这通常在main 内通过调用xTaskCreate 然后vTaskStartScheduler 完成。每次main 调用xTaskCreate 时,它都会创建一个任务并为该任务分配一个堆栈空间。但是,虽然main 正在运行,但它仍在使用由启动代码创建的原始堆栈。一旦调用vTaskStartScheduler,RTOS 调度程序将执行上下文切换到其中一个任务。上下文切换包括将堆栈指针更改为任务堆栈。因此,当任务开始执行时,它会使用自己的堆栈。

所以是的,有一个与任务的堆栈空间分开的主堆栈空间。有必要让main 在启动 RTOS 调度程序之前完成它所做的一切。

【讨论】:

  • 值得注意的是,在 Cortex-M 上,中断也在主堆栈空间 (CSTACK) 中运行。
  • 好吧,Cortex-M 主堆栈指针 (MSP) 与我所描述的问题不同。 Cortex-M 支持两个堆栈指针,MSP 和 PSP。如果 RTOS 将 PSP 用于任务,那么是的,处理器在处理中断时切换到 MSP。但我认为这不是这个问题的意义所在。
【解决方案2】:

问题的答案是 b。执行此函数的每个线程都将在为该线程分配的堆栈上声明变量 i。每个线程都有不同的堆栈。

我认为测试有一些故意模糊的答案,以找出那些不知道答案并猜测的人。

【讨论】:

    猜你喜欢
    • 2012-10-06
    • 2021-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多