STM32中堆栈的理解_第1页
STM32中堆栈的理解_第2页
STM32中堆栈的理解_第3页
STM32中堆栈的理解_第4页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

STM32中堆栈的理解STM32中堆栈的理解关于程序的内存分配1.栈区(stack):由编译器⾃动分配和释放,存放函数的参数与返回值、局部变量等。2.堆区(heap):由程序员分配管理,⼀般未使⽤(malloc函数)。3.全局区与静态区:存储全局变量和静态变量,其中初始化的全局变量和静态变量在⼀块区域,未初始化的全局变量和静态变量在相邻的另⼀块区域。4.⽂字常量区:存放常量字符串。5.程序代码区:存放程序代码。栈区、堆区、全局区静态区存储在SRAM中,⽂字常量区和程序代码区存放在Flash中。通过Rebuild可以看出整个内存分配。Code:存储代码RO-data:存储const常量和指令RW-data:存储初始化值不为0的全局变量、静态变量ZI-data:存储初始化值为0的全局变量、静态变量所以Flash=Code+RO-data+RW-data,SRAM=RW-data+ZI-data在.map⽂件中也可以看见47648=0xBA20,所以SP指针的栈顶地址是0x2000BA20。打开.map⽂件可以查看程序的内存分配0x20000000是sram开始的地址,可以看到各段的分布。STACK:栈区HEAP:堆区.data:初始化的全局变量、静态变量.bss:未初始化或者初始化为0的全局变量、静态变量0x08000000是flash开始的地址,可以看到各段的分布。.constdata:⽂字常量区Code:函数代码在OptionsforTarget页⾯中可以设置Flash和SRAM⼤⼩:我们只在启动⽂件中设置了栈区、堆区的⼤⼩,并未设置全局区的⼤⼩,如果有定义全局变量,则sram先给全局区分配内存,再给栈区分配内存(最后分配)。从下图中可以看出,最后从0x2000aa20开始分配了0x1000⼤⼩的STACK栈空间。mallco.c中定义了⼀个⼤⼩40K的全局数组(未初始化),数组在内存的地址从0x20000020开始,⼤⼩为0xA000,再加上其他的未初始化全局数组就达到了0x2000aa20。⽬前两种内存获取⽅式:1.同庞⼤的全局变量数组来圈住⼀块内存,然后将这个内存拿来进⾏内存管理和分配。2.把编译器未使⽤的RAM部分⽤于做内存分配,也就是除掉RW-data+ZI-data+编译器堆+编译器栈后剩余的RAM内存中的⼀部分或者全部进⾏内存管理和分配。这种情况下需要知道内存剩下部分的⾸地址和内存的尾地址,然后要⽤多少内存,就从⾸地址开始挖,做⼀个链表,把内存获取和释放相关信息链接起来,就能及时的对内存进⾏管理了。⽣长⽅向:堆:向上⽣长栈:向下⽣长数组:向上⽣长定义在栈中的数组仍然是向上⽣长的,局部变量是从⾼地址开始往低地址存。注意:局部变量⽤数组过⼤会导致栈溢出。voidtest(){u32buff[]={0x012345

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论