主堆栈 space 和任务堆栈 space
Main stack space and task stack space
我想知道主堆栈 space 和任务堆栈 space 之间是否有任何区别。我参加了一个关于 RTOS 的测验,其中提出了以下问题
假设在task函数中声明了一个非static局部变量,在task函数执行过程中恰好分配了非static变量的内存?
void task_function(void *p)
{
/*this is task function */
int i ; /* non static variable */
}
给出的选项是:a。 RAM 的主堆栈 space。 b.Task 的堆栈 space.
我想知道除了为每个任务分配的堆栈 space 之外,是否还有一个单独的 RAM 主堆栈 space。如果是,那是为什么?
问题的答案是b。执行此函数的每个线程都将在为该线程分配的堆栈上声明变量 i。每个线程都会有不同的堆栈。
我认为测试有一些故意含糊的答案,以找出那些不知道答案和猜测的人。
启动时,在 main
之前有 运行 秒的启动代码被调用。启动代码放置了 main
所需的 运行 时间环境。这包括初始化已初始化的变量、将未初始化的变量归零、设置堆栈指针,以及对于 C++,为静态分配的对象调用构造函数。因此,当 main
被调用时,已经有一个堆栈设置并在使用中。我想这就是测验所指的 "main stack".
对于 Free-RTOS 和其他典型的 RTOS,当 main
被调用时,RTOS 没有设置和 运行ning。相反,这通常是在 main
内通过调用 xTaskCreate
然后 vTaskStartScheduler
来完成的。每次 main
调用 xTaskCreate
它都会创建一个任务并为该任务分配一个堆栈 space。但是,虽然 main
是 运行ning,但它仍在使用由启动代码创建的原始堆栈。一旦 vTaskStartScheduler
被调用,RTOS 调度程序将执行上下文切换到其中一个任务。上下文切换包括将堆栈指针更改为任务的堆栈。因此,当任务开始执行时,它会使用自己的堆栈。
所以是的,有一个主堆栈 space 与任务的堆栈 space 是分开的。这是必要的,以便 main
可以完成它在启动 RTOS 调度程序之前所做的一切。
我想知道主堆栈 space 和任务堆栈 space 之间是否有任何区别。我参加了一个关于 RTOS 的测验,其中提出了以下问题
假设在task函数中声明了一个非static局部变量,在task函数执行过程中恰好分配了非static变量的内存?
void task_function(void *p)
{
/*this is task function */
int i ; /* non static variable */
}
给出的选项是:a。 RAM 的主堆栈 space。 b.Task 的堆栈 space.
我想知道除了为每个任务分配的堆栈 space 之外,是否还有一个单独的 RAM 主堆栈 space。如果是,那是为什么?
问题的答案是b。执行此函数的每个线程都将在为该线程分配的堆栈上声明变量 i。每个线程都会有不同的堆栈。
我认为测试有一些故意含糊的答案,以找出那些不知道答案和猜测的人。
启动时,在 main
之前有 运行 秒的启动代码被调用。启动代码放置了 main
所需的 运行 时间环境。这包括初始化已初始化的变量、将未初始化的变量归零、设置堆栈指针,以及对于 C++,为静态分配的对象调用构造函数。因此,当 main
被调用时,已经有一个堆栈设置并在使用中。我想这就是测验所指的 "main stack".
对于 Free-RTOS 和其他典型的 RTOS,当 main
被调用时,RTOS 没有设置和 运行ning。相反,这通常是在 main
内通过调用 xTaskCreate
然后 vTaskStartScheduler
来完成的。每次 main
调用 xTaskCreate
它都会创建一个任务并为该任务分配一个堆栈 space。但是,虽然 main
是 运行ning,但它仍在使用由启动代码创建的原始堆栈。一旦 vTaskStartScheduler
被调用,RTOS 调度程序将执行上下文切换到其中一个任务。上下文切换包括将堆栈指针更改为任务的堆栈。因此,当任务开始执行时,它会使用自己的堆栈。
所以是的,有一个主堆栈 space 与任务的堆栈 space 是分开的。这是必要的,以便 main
可以完成它在启动 RTOS 调度程序之前所做的一切。