在编写嵌入式程序时,尤其是在汇编程序中调用C函数之前,要设置堆栈指针SP,首先要搞清楚,堆栈是做什么。
我们常说的堆栈,其实是栈,而不是堆,所谓“栈”从字面意思就能看出,跟“客栈”意思相同,意思是临时存放或入住的一个地方,对于程序来说,就是用于存储函数中的局部变量以及保存寄存器参数的,C程序函数一般都会用到很多的临时变量,这一点可能程序员看不到也不关心,但是CPU在运行程序时,会自动的使用堆栈,所以堆栈指针SP就必须要在调用C程序前设定。
我们知道对于ARM处理器来说,堆栈是向下生长的,即从高地址向低地址递减,而堆栈本身就是一块连续的内存空间,CPU的内存RAM空间存放规律一般是分段的,从地址向高地址,依次为:程序段(.text),恒常量段(.RO),带初始化值的全局变量段(.RW),不带初始化值的全局变量段(.ZI),静态变量,(其中.ZI和静态变量又统称为BSS段),然后上面还可能会有堆空间,然后最上面才是堆栈段,这样安排堆栈,是因为堆栈的特点决定的,所以堆栈的指针SP初始化一般在堆栈段的高地址,也就是内存的高地址,然后让堆栈指针向下增长(其实就是递减)。这样做的好处就是堆栈空间远离了其他段,不会跟其他段重叠,造成修改其他段数据,而引起不可预料的后果,还有设置堆栈大小的原则,要保证栈不会下溢出到数据空间或者程序空间。所谓堆栈溢出,是指堆栈指针SP向下增长到其他段空间。
每个处理器的RAM大小可能不同,而且有时往往会用到SDRAM,所以要根据板子的硬件特点而设置堆栈指针。
最新评论