datasheet

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

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

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

推荐阅读

ARM - STM32 使用11.0592MHz晶振

这里探究了以下stm32 外部时钟的用法。这里用的是stm32f103rbt6,usart2,外部晶振11.0592Mhz。先看时钟树吧这是上图的配置:void RCC_Init(void){ ErrorStatus      HSEStartUpStatus; RCC_DeInit(); RCC_HSEConfig(RCC_HSE_ON);   //设置外部高速晶振(HSE) HSEStartUpStatus = RCC_WaitForHSEStartUp(); //等待HSE起振 if(HSEStartUpStatus == SUCCESS) //SUCCESS:HSE
发表于 2019-05-14
ARM - STM32 使用11.0592MHz晶振

STM32F0项目进阶之实时时钟DS1307

写在前面的话:STM32F0项目进阶系列是硬件系统工程师星克曼以项目进阶的方式写出的入门教程,以项目开发为蓝底,快速学习进入实战。STM32 I2C总线在上一讲 STM32F0项目进阶之I2C 中已经讲过了,已经将标准库抽象成hal_i2c.c和hal_i2c.h了,下面的就是适配不同的芯片了,这次我们适配一下DS1307。芯片手册如下:www.maximintegrated.com/en/DS1307.pdf电路配置 引脚图如下:   引脚描述如下: 电路配置如下: BCD格式 注意:时间和日期的格式均是BCD格式的。上电工作 上电即可以工作
发表于 2019-05-14
STM32F0项目进阶之实时时钟DS1307

STM32原子哥的故事

提到广州星翼电子,STM32圈中的人可能会觉得陌生,但是提到正点原子和《原子教你玩stm32》,所有接触过STM32或者Arm MCU的爱好者几乎都知道。近日广州星翼电子技术总监原子哥作为意法半导体战略合作伙伴,和意法半导体中国区微控制器事业部市场及应用总监曹锦东共同接受了媒体采访。正点原子的故事就此展开。正点原子的介绍原子哥本名刘军,是正点原子(广州星翼电子)的技术总监。从公司简介中我们可以看到,广州市星翼电子是一家从事嵌入式开发平台、IOT物联网、四轴飞行器、仪器仪表和企业服务等软硬件研发、销售一体化的国家高新技术企业。公司成立于2012年,是国内知名度极高的嵌入式开发平台供应商,产品远销东南亚欧美各国,国内数百家高校实验室
发表于 2019-05-14
STM32原子哥的故事

意法半导体stm32系列芯片的省电原因

stm32所有寄存器都需要时钟才能配置,寄存器是由D触发器组成的,只有送来了时钟,触发器才能被改写值。任何MCU的任何外设都需要有时钟,8051也是如此;STM32为了让用户更好地掌握功耗,对每个外设的时钟都设置了开关,让用户可以精确地控制,关闭不需要的设备,达到节省供电的目的。51单片机不用配置IO时钟,只是因为默认使用同一个时钟,这样是方便,但是这样的话功耗就降低不了。例如,某个功能不需要,但是它还是一直运行。STM32需要配置时钟,就可以把不需要那些功能的功耗去掉。当你想关闭某个IO的时候,关闭它想对应的时钟使能就是了,不过在51里面,在使用IO的时候是没有设置IO的时钟的,还有在STM32中,有外部和内部时钟之分,关于时钟
发表于 2019-05-14

STM32启动文件初探之startup_stm32f10x_hd.s(Reset_Handler函数)

该文件主要实现目的:设置初始SP设置初始PC=Reset_Handler设置向量表入口地址,并初始化向量表调用SystemInit,把系统时钟配制成72M,SystemInit在库文件system_stm32f10.c定义调转到标号_main,最终来到C程序文件; Reset handlerReset_Handler   PROC                EXPORT  Reset_Handler             [WEAK] 
发表于 2019-05-14

STM32F4之串口(三)

实现STM32开发板向计算机传送数据就需要准备好STM32开发板和上位接收程序。上位机部分使用QT开发,版本为5.8.0STM32部分使用STM32F429芯片,开发环境为uVision V5.24.2.0上位机效果为:代码如下:mainwindow.h文件:#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <QDebug>#include <QtSerialPort/QSerialPort>#include <QtSerialPort/QSerialPortInfo>namespace Ui
发表于 2019-05-13
STM32F4之串口(三)

小广播

何立民专栏

单片机及嵌入式宝典

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

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