历史上的今天
返回首页

历史上的今天

今天是:2025年01月12日(星期日)

2020年01月12日 | STM32堆和栈(Heap & Stack)及SRAM存储使用

2020-01-12 来源:eefocus

编译一个程序,出现下面的信息:

明明程序没有什么内容,为什么变量大小就有RW+ZI=52+1836=1888字节大小了呢,就已经使用了1888字节的SRAM空间。让我们打开map文件:

可以看到每个文件所使用的SRAM大小,比如delay文件使用了4个字节,地址从0x20000014到0x20000017。其中可以看到HEAP和STACK占了大头,分别占了0x00000200和0x00000400的空间。STACK的起始地址是0x20000360,大小是0x00000400,那么最后的地址是0x20000760,刚好等于1888=0x760字节。于是我们就知道SRAM空间用来存放了什么东西了:1、各个文件中声明和定义的全局变量、静态数据和常量;2、HEAP区;3、STACK区。


堆区(heap):一般由程序员使用malloc或new来进行分配,在适当的时候用free或delete来进行释放。若程序员不释放,程序结束时可能由操作系统回收。分配方式类似于数据结构中的链表。


栈区(stack):由编译器自动分配和释放,程序员不做干涉。存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。程序的中断,函数的形式参数传递等都需要STACK来实现。


注意:

1、堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道,所以需要注意一点,就是别造成堆栈溢出了,不然就会发生hardfault错误。


2、所有在处理的函数,包括函数嵌套,递归,等等,都是从这个“栈”里面,来分配的。所以,如果栈大小为2K,一个函数的局部变量过多,比如在函数里面定义一个u8 buf[512],这一下就占了1/4的栈大小了,再在其他函数里面来搞两下,程序崩溃是很容易的事情,这时候,一般你会进入到hardfault….这是初学者非常容易犯的一个错误.切记不要在函数里面放N多局部变量,尤其有大数组的时候!


3、STM32的栈,是向下生长的。事实上,一般CPU的栈增长方向,都是向下的。而堆的生长方向,都是向上的。堆和栈,只是他们各自的起始地址和增长方向不同,他们没有一个固定的界限,所以一旦堆栈冲突,系统就到了崩溃的时候了。


4、程序中的常量,如果没加const也会编译到SRAM里,加了const会被编译到flash中。

附上SRAM中的数据存放情况图:

推荐阅读

史海拾趣

Ememory Technology Inc公司的发展小趣事

eMemory自1989年成立以来,始终致力于半导体硅智财(IP)的研发与创新。公司凭借其独特的可编程非挥发性内存(NVM)技术,如NeoFuse和NeoPUF,迅速在半导体IP领域崭露头角。eMemory不仅将这些技术应用于自家的芯片产品中,还通过IP授权的方式,与全球众多芯片设计厂商建立了紧密的合作关系,推动了整个电子行业的发展。

ABB Group公司的发展小趣事

在2022年,eMemory宣布加入英特尔晶圆代工服务加速器(Intel Foundry Services Accelerator)计划。这一合作标志着eMemory的技术得到了国际半导体巨头的认可。通过这一计划,eMemory为使用英特尔晶圆代工服务的客户提供全球领先的安全IP解决方案,进一步提升了其产品在全球市场的竞争力。

Genesis Microchip公司的发展小趣事

在20世纪中期,GI作为一家新兴的电子设备制造商,以其对新兴技术的敏锐洞察力和创新精神而崭露头角。公司创始人意识到半导体技术的巨大潜力,决定投入大量资源进行研发。通过不懈努力,GI成功推出了多款基于半导体技术的创新产品,如早期的晶体管收音机和电视机,这些产品不仅在当时市场上引起了轰动,也为公司后续的快速发展奠定了坚实基础。这一阶段的成功,标志着GI在电子行业技术创新的道路上迈出了坚实的一步。

光磊(GL)公司的发展小趣事

在20世纪中期,GI作为一家新兴的电子设备制造商,以其对新兴技术的敏锐洞察力和创新精神而崭露头角。公司创始人意识到半导体技术的巨大潜力,决定投入大量资源进行研发。通过不懈努力,GI成功推出了多款基于半导体技术的创新产品,如早期的晶体管收音机和电视机,这些产品不仅在当时市场上引起了轰动,也为公司后续的快速发展奠定了坚实基础。这一阶段的成功,标志着GI在电子行业技术创新的道路上迈出了坚实的一步。

正泰公司的发展小趣事

为了在全球市场上保持领先地位,正泰建立了北美、欧洲、亚太等三大全球研发中心,并与清华大学、上海交大等国内外知名院校、机构展开合作,探索“产学研”融合模式。通过整合全球创新资源,正泰在智能电网、新能源电车充电设施等前沿领域取得了一系列创新进展。这种全球研发体系的建立,不仅提升了公司的研发能力,也增强了公司的市场竞争力。

Dalian Dlicap Corporation公司的发展小趣事

为了满足市场不断增长的需求,达利凯普在大连市金普新区投资建设了高端电子元器件产业化项目。该项目总用地面积4万平方米,总建筑面积5.6万平方米。项目建成后,将实现年产射频微波瓷介电容器30亿只的产能规模,进一步巩固了公司在行业内的领先地位。同时,该项目的实施也为当地经济发展注入了新的活力。

问答坊 | AI 解惑

一次小教训

大家都知道,场输出电路的升压电容有问题会损坏场块,因此,每次碰到场块烧毁时,我总是把升压电容一块换掉。但是,今天接修了一台康佳F5428D却因偷懒而白百烧掉了一块场块。该机用LA7688作中放,LA7837作输出,故障现象是一条水平亮线,查场块烧毁 ...…

查看全部问答>

Max232 串口电平转换芯片资料

Max232 串口电平转换芯片资料…

查看全部问答>

ipad怎么样,有谁购买了,我想入手一个...

呵呵 大家觉得如何? 最近看到评论有正、有负 还是比较稀罕苹果的东东的…

查看全部问答>

给大坛子的小建议

我看了咱们坛子里有不少讲如何学习单片机的,讲的很详细,很不错。 但是 我搜了半天想看看一个比较系统的讲PCB设计电路板制作的居然没有?!不知是我没找到还是....我的想法很简单,最好做个系列教程---就讲一个简单的51学习板怎么制的。我觉的这 ...…

查看全部问答>

dm9000a 丢包问题

x86架构,VxWorks系统,dm9000a包长为100时,100W包不丢包,包长为1470时,3W丢大约100包左右。 可以怎么来改善?…

查看全部问答>

vhdl process的问题

小弟现要把一段Verilog的程序转成vhdl,用的是X-hdl软件, always@(negedge clock or posedge reset) begin         if(reset) cnt = 5)                       & ...…

查看全部问答>

该做嵌入式还是游戏平台?

小弟做了一年的Vc开发 现在刚进入一家公司做嵌入式开发 本来很有兴趣,但是没有人教,全是自己看,看了一个月大概明白了,但是感觉离开发还有一定的距离。另外有一家公司是做游戏平台的,类似浩方平台那种,刚刚创办,上手应该很快的,现在犹豫不 ...…

查看全部问答>

关于阻容降压

想请教一下各位,阻容降压的电路和参数怎么选啊?谢谢…

查看全部问答>

请问IFG1中的 OFIFG(晶体出错中断标志)可不可以软件清0???????

请问IFG1中的 OFIFG(晶体出错中断标志)可不可以软件清0??????? do { IFG1 &= ~OFIFG; // 清除OSCFault标志 } while ((IFG1 & OFIFG) == OFIFG); // 如果OSCFault =1 //等待OSC ...…

查看全部问答>

【国赛专贴】MSP430讨论贴

大家有多少人在国赛中使用MSP430呢?遇到问题,就开贴提出来吧!众坛友们再线讨论,帮你排忧解难!还等什么呢?把你纠结的地方提出了吧!…

查看全部问答>