我们在学校或者各种编程类书本上,通常都会看到一句话:“函数是程序的基本组成单位”。可以说,理解函数对编程是非常重要的,与函数调用紧密结合的机制就是函数调用栈了。而栈有一个特别的属性,那就是栈的增长方向问题了。 最近我发现一些多年编程经验的朋友对这一块也是迷迷糊糊的,在阅读RTOS源码的时候,也会经常看到栈的增长方向配置项目,那么今天就带大家了解一下栈的增长方向到底是咋回事。1 栈的增长方向 首先,我们要明确的是栈同样也是分布在我们的内存之中,而内存是通过地址来进行编排访问的,如下是堆栈的示意图: 对于堆栈而言原本并没有方向一说,只有入栈和出栈一说,程序中执行push指令则栈顶向上移动,执行pop指令则栈顶向下移动,其仅仅只是一种先进后出的数据结构,增长方向都是从栈底向栈顶方向移动,即分配数据的过程。 而我们平时所说的栈的增长方向又是怎么回事呢? 为了在内存中分配一段内存给堆栈,我们必须要区分堆栈相对于内存的地址而言的方向性,通常栈顶增长的方向是从内存的低地址向高地址变化,我们则称为向上增长;反之则向下增长。 所谓“水往高处流,即向上增长”,这样应该就很好**了。2 有什么用? 当了解处理器中栈指针的增长方向以后,我们在debug程序的时候才能真正的把控程序的运行过程。 在移植RTOS的过程中我们都需要对每个任务的堆栈分配一个合适的连续内存区域来使用,此时初始状态堆栈指针指向什么位置就跟堆栈的增长方向密切相关,有过RTOS移植经验的朋友应该都有在RTOS配置项中关注过这块的选择。 RTOS在任务初始化的时候,其堆栈指针应该指向其栈底位置,那么对于堆栈向上增长,任务初始化的时候我们需要把堆栈指针设置在所分配内存的低地址内存处,反之则设置到高地址处。
|