我想知道主堆栈空间和任务堆栈空间之间是否有区别。我已经对RTOS进行了测验,询问了以下问题

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

void task_function(void *p)

{

 /*this is task function */

int i ; /* non static variable */
}


给出的选项是: RAM的主堆栈空间。 b。任务的堆栈空间。

我想知道是否有为每个任务分配的堆栈空间以外的RAM的主堆栈空间。如果是,那为什么呢?

最佳答案

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

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

是的,有一个主堆栈空间与任务的堆栈空间是分开的。必须使main能够执行启动RTOS调度程序之前的所有工作。

关于c++ - 主堆栈空间和任务堆栈空间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43229791/

10-16 04:26