历史上的今天
返回首页

历史上的今天

今天是:2025年04月16日(星期三)

正在发生

2019年04月16日 | stm32之堆栈

2019-04-16 来源:eefocus

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 )


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

推荐阅读

史海拾趣

Crowd Supply公司的发展小趣事

Crowd Supply的创立源于几位麻省理工大学的毕业生对于硬件创新的热情与追求。他们意识到,许多优秀的硬件项目因缺乏资金和市场渠道而无法实现商业化。于是,他们决定创建一个平台,专门服务于这些创新项目,帮助它们从原型设计走向市场。这就是Crowd Supply的初心,也是其使命所在——将原创、有用、受人尊敬的硬件带入生活。

德索五金(dosinconn)公司的发展小趣事
佰宏(BHFUSE)公司的发展小趣事

随着国内市场的稳定发展,佰宏公司开始积极拓展海外市场。他们的产品被多个海外电商平台上架,受到了国际客户的青睐。这一举措不仅提升了公司的国际化水平,也为公司的长期发展注入了新的动力。

BOCA公司的发展小趣事

BOCA公司最初是一家小型电子元件制造商,面临着激烈的市场竞争。然而,公司始终坚持研发创新,投入大量资源于新技术的研究。终于,在一次偶然的实验中,BOCA的研发团队成功开发出了一种新型的半导体材料,这种材料在性能上远超当时的行业标准。这一技术突破让BOCA迅速在行业中崭露头角,订单量激增,公司规模迅速扩大。

Gilway Technical Lamp公司的发展小趣事
观察压缩机是否有明显损坏或异常现象,如漏油、烧焦等。
BOWEI公司的发展小趣事
如果确认压缩机损坏且无法修复,需要更换新的压缩机。在更换过程中,需要注意选择与冰箱型号相匹配的压缩机,并确保正确安装和连接。

问答坊 | AI 解惑

消除手机中的耳机爆破音和TDMA噪声

随着音乐手机概念的风行,手机不再是一个简单的通话工具,人们越来越关心手机的音乐播放音效,这给手机音频设计也带来了越来越多的压力。本文概述手机模拟音频设计中经常会遇到的耳机爆破音、TDMA噪声产生的机理,并介绍通过选择合适的耳机驱动器来 ...…

查看全部问答>

数码管段位计算程序

网上找的数码管段位计算程序。对初学者可能有帮助,高手勿扰…

查看全部问答>

mif文件生成小工具,自己再往下找的,大家看下啊

可以看频谱,可以生成四种基本波形,和自己手绘波形…

查看全部问答>

RF&MW课件

RF&MW课件浙大的包含微波咯类的设计课件…

查看全部问答>

proteus仿真问题

因为还在等器件所以想用proteus做下仿真 但发现有的器件找不到      有地方可以下元器件库么…

查看全部问答>

我们的简易搜索接收机

本帖最后由 paulhyde 于 2014-9-15 09:23 编辑 看看吧 还可以  …

查看全部问答>

LINUX-2.6.30移植到MINI2440

之前弄了很久的LINUX-2.6.31版本的,但是还是弄不出来,老是有很多的错误的,就是怎么也加载不了文件系统,所有我干脆就放弃了,来弄点底版本的,2.6.30版本。 很多书基本上都是这样写的 1.修改顶层Makefile文件    直接将Makefile文 ...…

查看全部问答>

X射线对人体有何损害作用?应采用什么防护措施?

1)生物体接收X射线照射时,产生生物效应,破坏正常的组织细胞,产生生物损伤。 2) 主要从以下几个方面加强防护: ①加强固有防护设施;②缩短X射线照射时间;③加大与X射线源的距离;④尽可能应用各种屏蔽。 详细分析: X射线与物质相互作用时产生 ...…

查看全部问答>

焊接功夫的重要性

本次DIY,焊接功夫不过关,很难调试成功啊。从sht21到oled,焊接都是第一步。…

查看全部问答>

STM32的IAP应用问题

有人做过STM32 的IAP吗 我用CAN接口做了IAP 有两个程序区 8000000-8002000是BOOT区,写入的启动代码,引导应用程序写入的。 8002000-结尾是应用区,APP程序区 现在的问题是进行APP程序后,不响应中断 如果不用中断程序,在APP工作一切正 ...…

查看全部问答>