stm32之堆栈

2019-04-16来源: eefocus关键字:STM32  堆栈  内存

stm32中的堆栈设置

keil编译完成时存储情况

当编译成功时,会出现: 

BUILD://Program Size: Code=340 RO-data=252 RW-data=0 ZI-data=1632


Code:程序代码部分

RO-data: 程序定义的常量const temp

RW-data:已初始化的全局变量

ZI-data:未初始化的全局变量

片中的:


flash=Code+RO-data+RW-data

RAM=RW-data+ZI-data

通过上面的BUILD可以看出,这个程序已经用了1600多的RAM,为什么会出用到这么多的RAM呢?


在startup_stm32f10x_md.s文件中存在:


Stack_Size   EQU   0x00000400 


Heap_Size    EQU   0x00000200 

1

2

3

这样就明白了吧。


堆和栈的区别,举例

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

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

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

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

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

例:


int a=0;   //全局初始化区

char *p1;   //全局未初始化区

main()

{

    int b;   //栈

    char s[]="abc";   //栈   

    char *p3= "1234567";   //在文字常量区Flash

    static int c =0    //静态初始化区

    p1= (char *)malloc(10);   //堆区

    strcpy(p1,"123456");   //"123456"放在常量区

}

1

2

3

4

5

6

7

8

9

10

11

所以堆与栈的区别:


stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放。

stack的空间有限,heap是很大的自由存储区。

所以:程序在编译期和函数分配内存都是在栈上进行,且程序运行中函数调用时参数的传递也是在栈上进行。


在程序中需要注意的情况

如果使用了HEAP,则必须设置HEAP大小。

如果是STACK,可以设置为0,不影响程序运行。(不管设置多少生成的HEX文件都是一样的,不过会影响调试,需注意)

而一般我们可以通过查看.htm中Maximum Stack Usage = 344 bytes + Unknown(Functions without stacksize, Cycles, Untraceable Function Pointers)来方便确定大小。 

(为安全起见,预留点空间,上例可修改为Stack_Size EQU 0x00000200 )


另外:堆栈溢出,编译不会提示,需要注意。

关键字:STM32  堆栈  内存

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

上一篇:说说STM32的堆栈与内存
下一篇:STM32之程序如何防止堆栈溢出

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

推荐阅读

STM8控制4位LED数码管显示数字

用4位LED显示数字 #define STB_H         GPIOC->ODR |= (uint8_t)(GPIO_PIN_2)#define STB_L         GPIOC->ODR &= (uint8_t)(~GPIO_PIN_2) #define DATA_H         GPIOE->ODR |=(uint8_t)( GPIO_PIN_5)#define DATA_L     
发表于 2019-09-21
STM8控制4位LED数码管显示数字

STM32中stm32f0xx_flash.icf文件的作用详解!

 添加额外的region   比如我要添加另一个名为ROM2的ROM区域,大小是256bytes,起始地址是0x80000.       define region ROM = Mem:[from 0x80000 size 0x100];2.2 教你怎样放置SECTION如果你要把你的只读常量放置在你指定的域而不是编译器默认的位置,你就得按如下操作了:define region CONST_region = Mem:[from 0x100 size 0x100];place in
发表于 2019-09-21
STM32中stm32f0xx_flash.icf文件的作用详解!

STM32 USART串口DMA 接收和发送的源码详解!

硬件平台:STM32F103ZET6; 开发环境:KEIL 4;先说说应用通讯模式,串口终端的工作方式和迪文屏差不多,终端被动接受MCU发的指令,终端会偶尔主动发送一些数据给MCU(像迪文屏的触摸信息上传)。串口DMA发送:发送数据的流程:前台程序中有数据要发送,则需要做如下几件事1.在数据发送缓冲区内放好要发送的数据,说明:此数据缓冲区的首地址必须要在DMA初始化的时候写入到DMA配置中去。2.将数据缓冲区内要发送的数据字节数赋值给发送DMA通道,(串口发送DMA和串口接收DAM不是同一个DMA通道)3.开启DMA,一旦开启,则DMA开始发送数据,说明一下:在KEIL调试好的时候,DMA和调试是不同步的,即不管Keil
发表于 2019-09-21

stm32上电自启动后运行不正常的故障排查分析

最近负责一个项目,用到stm32f4的一款高性能芯片。研发过程中遇到一个很诡异的现象,前前后后折腾了两三天,最后才搞定。由于是新手,经验不足,排故过程很纠结~~现象如下:采用JLINK下载程序后,断电让其上电重新启动,发现有时可以正常运行,有时候无法正常运行,大约每两、三次就有一次无法正常上电启动。2.通过JLINK调试程序,每次均正常运行。太诡异了!发现问题后开始定位原因。首先考虑是BOOT启动出问题了,stm32f4启动方式分三种:User FLash、SystemFlash和EmbeddedSRAM,通过BOOT0和BOOT1管脚配置。程序正常运行时从User FLash启动,如果BOOT0和BOOT1配置不正确,会导致无法
发表于 2019-09-21

STM32的时钟系统RCC详细整理

ate NewState);// 使能或者失能PLL//输入:ENABLE或者DISABLE#if defined (STM32F10X_LD_VL) || defined (STM32F10X_MD_VL) || defined (STM32F10X_HD_VL) || defined (STM32F10X_CL) void RCC_PREDIV1Config(uint32_t RCC_PREDIV1_Source, uint32_t RCC_PREDIV1_Div);//#endif#ifdef  STM32F10X_CL void RCC_PREDIV2Config(uint32
发表于 2019-09-21
STM32的时钟系统RCC详细整理

IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

=2blE__GxI1lmJglihBi5xJQPolza-NMxcZqGThxwysiY80ZOe6hLl5k6mowbTN2j30WsPftFZsBe1pRt8WlCDIT7Ce5EIReo4uGCEyegh7S(IAR 新建 STM32工程)        4,http://blog.sina.com.cn/s/blog_4c8287230100f0jw.html(IAR 新建 STM32工程)        5,http://blog.sina.com.cn/s/blog_4c8287230100eznh.html(IAR使用说明)        6,http://blog.sina.com.cn/s/blog_4c8287230100f2ah.html
发表于 2019-09-21
IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)

小广播

何立民专栏

单片机及嵌入式宝典

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

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