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