所以我在读MicroC/OS-II的书,但是在任务堆栈的部分,我找不到确切的堆栈是什么,最重要的是-它是做什么用的。我知道这不是一件冗长和困难的事情,但我必须要理解它。这本书只介绍了如何设置堆栈大小和其他一些类似的事情。那么,有没有人能用简单的话给我解释一下,在uC/OS-II中,什么是任务栈,它是用来做什么的?
发布于 2013-05-29 19:53:55
一般来说,在过程化编程语言的上下文中,栈是存储函数/过程/子例程的局部变量和返回地址(在“栈帧”中)的地方-调用深度越大,存储的栈帧就越多-每个函数一个栈帧还没有返回。无论您是否使用诸如MicroC/OS-II之类的RTOS,这一部分都是正确的。
在单线程环境中,只需要一个堆栈,这通常是作为C运行时环境设置的一部分提供的。在多线程环境中,每个单独的执行线程都需要一个堆栈,通常是由您为每个线程分配堆栈空间,或者至少指定其长度。
发布于 2013-05-29 18:12:24
我不知道MicroC/OS-II,但任务的堆栈几乎总是相同的:
在任务执行期间,它存储当前上下文中所需的数据。这意味着当子例程(方法等)调用时,“堆栈帧”被存储在堆栈的顶部。此堆栈帧存储被调用子例程的局部变量、子例程结束时使用的返回地址以及其他一些信息。当子例程返回时,堆栈帧将被删除。如果子例程调用另一个(或递归调用自己),则另一个堆栈帧将存储在当前堆栈帧的顶部。
与堆栈不同的是,堆栈中存储的数据是以与已经存储的数据相反的顺序删除的,堆存储数据的时间很长,只要它们的内存不被释放,这可以按任意顺序完成。
发布于 2013-05-30 03:05:56
许多处理器都有一个堆栈指针,其中大多数都有专门使用该堆栈指针的指令。堆栈指针是保存地址的寄存器,与程序计数器没有什么不同。堆栈只是堆栈指针指向的内存,在更高的级别上,您或操作系统或某人将可用内存空间划分为不同的用途,一部分用于数据,一部分用于程序,一部分用于堆(mallocs和free),还有一些用于堆栈。堆栈指针和相关指令允许代码临时分配一些内存。例如,全局变量至少在程序的生命周期内停留在一个内存位置。局部变量只在函数执行时需要一个内存位置,当函数返回时,你不需要那个局部变量内存(静态定义的局部变量像全局变量一样被分配,但只在函数执行期间可用,所以不是临时的)。您可以在函数中执行malloc和free来分配此本地内存,也可以简单地使用堆栈。而且许多/大多数编译器只是简单地使用堆栈。除了局部变量,您可能还需要存储返回地址,如果函数a()调用函数b()从b返回到您在a中的位置,则需要在调用b()之后返回到下一条指令。如果B调用c,那么在b()的上下文中,您需要将返回保存到a(),现在在c()中,您需要知道如何返回到b()。诸若此类。这与体系结构和调用约定有关,一些体系结构总是使用堆栈进行返回,一些体系结构倾向于使用特定的寄存器。当嵌套调用时,尽管所有的架构最终都需要使用堆栈作为返回地址,所以这里也使用了堆栈。如果函数a()调用自己10次,并且有一个局部整数,并且返回地址假设每次调用需要8个字节的堆栈,那么第一个调用将堆栈指针移动8个字节分配8个字节,第二个调用另一个8字节,依此类推。当您开始命中返回时,堆栈指针向后移动8个字节,另一个返回堆栈指针上的另外8个字节。
现在将它从单个应用程序转换为多个应用程序,如果同时(操作系统)为每个应用程序/任务/过程/线程/任何您可能希望每个应用程序都有自己的堆栈执行(一个操作系统)。这通常非常简单,因为您只需要保存前一个任务的堆栈指针,并将堆栈指针设置为下一个任务切换时的最后一个值。当然,您可能会变得更加复杂,并且具有保护机制,因此每个应用程序只能存在于其内存空间内,包括堆栈和堆。而mmu可以通过将物理内存分割成多个部分而使其更加复杂,并且mmu使其看起来像是应用程序虚拟地址空间中的独立部分是线性的。等。
正如nurd_droid指出的,一些处理器根据处理器的模式有不同的堆栈指针。你可能有一个用于用户/应用程序模式的函数,当一个系统调用发生时,一个系统/超级用户堆栈指针,一个中断发生,一个中断堆栈指针。有些体系结构只有一个堆栈pointer...Some体系结构堆栈不在主内存空间中,堆栈和堆栈指针隐藏在逻辑中,你并不能真正看到它(在这种情况下,堆栈大小通常是相当有限的,如果你不管理堆栈的使用,堆栈可能会自己滚来滚去,或者发生其他不好的事情)。
https://stackoverflow.com/questions/16809935
复制相似问题