STM32堆栈空间大小设置

2019-06-14来源: eefocus关键字:STM32  堆栈空间  大小设置

1. 设置堆栈空间大小

在使用STM32编程时,一般情况下我们不会关注堆栈空间的大小,因为在STM32的启动文件中,已经帮我们预先设置好了堆栈空间的大小。如下图所示的启动代码中,Stack栈的大小为:0x400(1024Byte),Heap堆的大小为:0x200(512Byte)。


这也是为什么一个基础的工程编译后,RAM的空间也占用了1.6K左右的原因,因为堆栈的空间均分配在RAM中,可在编译的map文件中查看RAM资源占用的情况。


若工程中使用的局部变量较多,定义的数据长度较大时,若不调整栈的空间大小,则会导致程序出现栈溢出,程序运行结果与预期的不符或程序跑飞。这时我们就需要手动的调整栈的大小。


当工程中使用了malloc动态分配内存空间时,这时分配的空间就为堆的空间。所以若默认的堆空间大小不满足工程需求时,就需要手动调整堆空间的大小。


STM32有两种调节堆栈空间大小的方式:


1. 直接在启动文件中修改堆栈空间的大小,如图1所示的位置;


2. 打开启动文件,点击下方Configuration Wizard,可在Option的设置框中设置堆栈空间的大小。


2. 相关理论补充

bss段:

    bss段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。

    bss是英文Block Started by Symbol的简称。

    bss段属于静态内存分配。


data段:

    数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。

    数据段属于静态内存分配。


text段:

    代码段(code segment/text segment)通常是指用来存放程序执行代码的一块内存区域。

    这部分区域的大小在程序运行前就已经确定,并且内存区域通常属于只读(某些架构也允许代码段为可写,即允许修改程序)。

    在代码段中,也有可能包含一些只读的常数变量,例如字符串常量等。

 

堆(heap):

    堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。

    当进程调用malloc等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);

    当利用free等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。


查阅网上的资料,理解堆和栈的区别: 


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

堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。 

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

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

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

注意:堆和栈,一般堆是由低地址往上(高地址)增长,栈是由高地址向下(低地址)增长。都是连续的,C语言不提供内存保护机制类似的功能,如果一直堆一直增长,栈一直申请,然后就会导致栈溢出,程序崩溃。

关键字:STM32  堆栈空间  大小设置

编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic464676.html
本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:STM32F030R8-Nucleo使用PA2、PA3 UART2不能使用的问题
下一篇:STM32CubeMX工程闪退问题

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

集性能、紧凑、灵活、能效于一身,ST8引脚STM32微控制器问市

意法半导体8引脚STM32微控制器(MCU)现已上市,紧凑、经济的封装让简单的嵌入式开发项目也能利用32位MCU的性能和灵活性。 新推出的四款STM32G0 微控制器是8引脚经济性和32位性能的完美组合,在市场绝无仅有,基于59 DMIPS的 64MHzArm®Cortex®-M0 + CPU,片上高达8KB的RAM和32KB闪存,高性能外设包括2.5Msps ADC、高分辨率定时器和高速SPI接口。灵活的I/O引脚映射和MCU内部功能,让设计人员轻松升级终端产品功能,不会牺牲电路板空间或物料清单成本。高稳定内部振荡器,在宽温度和宽压范围内精度达到±1%,为开发者节省了外部时钟元件。 
发表于 2019-09-20
集性能、紧凑、灵活、能效于一身,ST8引脚STM32微控制器问市

6.STM32外设函数分类

发表于 2019-09-20
6.STM32外设函数分类

小广播

何立民专栏

单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved