RAM中设置堆栈区

RAM的特点就是高速存储。形象的说:堆栈是一种存储部件,即数据的写入跟读出不需要提供地址,而是根据写入的顺序决定读出的顺序 ;
而在RAM中设置堆栈是为了存储程序运行过程中的变量或数据的;提高代码的执行速率。
例如:现在有一个函数调用了一个子函数;那么调用前的一些变量或数据就要放入堆栈中;当子函数执行完后又把变量或数据从中堆栈取出来。
但是你要注意堆和栈是两种不同的数据结构;
堆(操作系统): 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收,分配方式倒是类似于链表。
栈(操作系统):由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈
堆(数据结构):堆可以被看成是一棵树,如:堆排序
栈(数据结构):一种后进先出的的数据结构

栈就是一条流水线,而流水线中加工的就是方法的主要程序,在分配栈时,由于程序是自上而下顺序执行,就将程序指令一条一条压入栈中,就像流水线一样。而堆上站着的就是工作人员,他们加工流水线中的商品,由程序员分配:何时加工,如何加工。而我们通常使用new运算符为对象在堆上分配内存(C#),堆上寻找对象的任务交给句柄,而栈中由栈指针管理

转载请注明出处,谢谢。

  先说结论,STM32再启动的时候RAM首先分配给使用到的全局变量,及调用库占用的一些数据(不太清楚是什么数据)

,然后再将剩余的空间分配给Heap和stack。


        以下是网上关于Heap和Stack的说:

(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似

于数据结构中的栈。

(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配

方式类似于数据结构中的链表。

(3)全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态

变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。

(4)文字常量区:常量字符串就是存放在这里的。

(5)程序代码区:存放函数体的二进制代码。

        一直有疑惑 堆区(heap)和全局区是不是在一块呢,

        今天在研究STM32启动的时候发现STM32的RAM起始MSP和栈的地址时(stm32的栈是向下增长的,栈顶地址是ram分配的最大空间了),结论如上述,下面截图详细说明。

  

上图是.map文件里看到的Heap和Stack的地址(空间分配),由图看出HEAP一行是堆空间分配的开始(从0x20000188),到STACK一行(0x20003188)结束共0x3000字节 (12K)的空间。

         Stack_Mem一行(0x20003188)到栈顶地址__initial_sp(0x20003588)一共是0x400字节(1K)空间。他们的大小正是我在起始文件startup_stm32f10x_md.s文件里分配的大小。如下图:


嗯,是一致的。

按stm32的datasheet上说,其RAM是从0x20000000开始的。下面是datasheet截图:


而我的工程里堆区和栈区是从0x20000188开始的,那么0x20000188前面的空间部分被什么占用了呢。起始从第一个.map文件截图可以看出来,首先是被全局变量占用了一部分0x58=88Byte。

      

这部分大小正好跟我的工程所用全局变量大小是一直的,如下图编译工程的结果RW-data大小即是工程所用到的全局变量大小

至于0x20000188-0x20000058=剩下的空间是什么,我猜测应该是库占用的。因为后缀是libspace(.bss),请看上图。

至此分析结束2016/12/20

       以上个人分析仅作为个人的学习记录分析,各位谨慎参考。如有错误还请指出,Thanks ! (∩_∩)

图片呢?都吞掉了?这网站真是的。。。

猜你喜欢

转载自blog.csdn.net/duobaohongtu3/article/details/80660956
RAM