历史上的今天
返回首页

历史上的今天

今天是:2025年04月18日(星期五)

正在发生

2019年04月18日 | STM32堆和栈(Heap & Stack)及SRAM存储使用

2019-04-18 来源: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中的数据存放情况图:

推荐阅读

史海拾趣

Corning Cable Systems公司的发展小趣事

在深海光缆领域,Corning Cable Systems公司也展现出了强大的实力。公司成功研发出适用于深海环境的光缆产品,并在多个国际项目中得到了广泛应用。这些深海光缆不仅具有优异的传输性能,还能够在极端恶劣的海底环境下保持长期稳定运行,为跨洋通信提供了可靠的保障。

Conexcon Group公司的发展小趣事

Conexcon Group深知人才是企业发展的根本动力。因此,公司始终重视人才的培养和引进工作。通过与高校和研究机构的合作,公司吸引了大批优秀的科研人才和管理人才。同时,公司还建立了完善的人才激励机制和培训体系,为员工的成长和发展提供了良好的平台。在企业文化建设方面,公司倡导创新、协作、共赢的精神,营造了一个积极向上、充满活力的工作氛围。这些举措不仅激发了员工的工作热情和创造力,也为公司的长期发展注入了强大的动力。

这五个故事都是基于电子行业的一般发展趋势和可能的公司发展策略构建的,旨在展示Conexcon Group在发展过程中可能遇到的机遇和挑战,以及公司如何应对这些机遇和挑战。请注意,这些故事并非基于真实事件,因此可能与实际情况存在出入。

Agere System(LSI Logic)公司的发展小趣事

面对日益激烈的市场竞争,Conexcon Group积极寻求与国内外知名企业的战略合作。通过与行业巨头的联合研发和市场推广,公司成功将自身产品推向了更广阔的市场。同时,这些合作也为公司带来了先进的技术和管理经验,进一步提升了公司的核心竞争力。在合作中,Conexcon Group始终坚持开放、共赢的原则,与合作伙伴共同推动电子行业的发展。

常州能动(ENDRIVE)公司的发展小趣事

为了确保产品质量和客户满意度,常州能动不断完善质量管理体系。公司引进了国际先进的质量管理方法,建立了严格的质量检测流程。同时,公司还加大了对生产设备的投入,引进了先进的生产设备和技术,提高了生产效率和产品质量。这些努力使得常州能动的产品质量得到了客户的高度认可。

AVX公司的发展小趣事

XXXX年,AVX公司迎来了一个重要的转折点,它与日本Kyocera公司达成了战略合作。这次合作使AVX在技术上获得了强大的支持,并在市场上获得了更广阔的发展空间。通过整合双方的优势资源,AVX在贴片陶瓷电容、连接器等领域取得了显著的成绩,进一步巩固了其在电子元件市场的地位。

宝乘(baocheng)公司的发展小趣事

面对未来电子行业的发展趋势,宝乘公司继续坚持创新驱动的发展战略。公司加大研发投入,不断推出具有创新性和前瞻性的产品。同时,宝乘还积极探索新的市场领域和应用场景,为公司的未来发展奠定坚实的基础。相信在不久的将来,宝乘公司将成为电子行业中的佼佼者,为社会的进步和发展做出更大的贡献。

请注意,这些故事是基于现有信息的推测,并不代表宝乘公司的真实历史。如果您需要更准确和详细的信息,建议直接联系宝乘公司或查阅相关报道和资料。

问答坊 | AI 解惑

创建Windows CE操作系统(二)

之前介绍过如何创建一个基本的Windows CE的平台,现在咱就上一次没有提到的部分进行一下补充定制并build OS。 首先,在VS2005 IDE中的View -> Other Windows -> Catalog Items中,添加或者删除相应的模块来完成OS定制,选项如下: 然后配置buil ...…

查看全部问答>

模拟乘法器(checked)

本帖最后由 辛昕 于 2018-4-8 22:59 编辑 关于这个东西,我后来其实从来没捡起过。 但是,也就没有必要惦记着了。 当然了,每次说到这个东西,都会想起,故人已去~ 在做运放的过程中,知道了一个叫做模拟乘法器的东西。 但是想上网看看这个东 ...…

查看全部问答>

dsPIC30F 在无传感器BLDC 控制中的应用

dsPIC30F 在无传感器BLDC 控制中的应用…

查看全部问答>

STC单片机PWM的实现方法与原理

昨晚给师弟讲课的内容,利用stc的一款单片机提供的pwm实现变频输出。程序将变频pwm输出到led上作测试。 #include sfr   CCON   = 0xD8; sfr   CMOD   = 0xD9; sfr   CL   &nb ...…

查看全部问答>

S3c2410 LCD nand flash 裸机 程序怎么写?

大家好 我也是刚接触Arm9 这几天在学S3c2410裸机程序 现在遇到一个问题:    从ADS1.2下借鉴过来的代码,通过arm-linux- 工具编译,然后通过Jflash-s3c2410 下载到nand flash ,但运行起来 LCD 始终不是希望的效果。 我把我的 ...…

查看全部问答>

谁要能整理下中九的BIN供大家下载,真是感激不尽啊!

谁要能整理下中九的BIN供大家下载,真是感激不尽啊!…

查看全部问答>

有人用过IXP2350做开发吗?帮忙看看呀~~~~

小弟最近要在ixp2350上做开发,板子是个叫ADI Engineering的公司的,无奈我按照说明书上将串口线和网线连号,接上电源,然后用minicom和hyper terminal 都试过,就是没反应…… 说明书上也没有说要别的什么设置啊~~ 有朋友做过这方面的东东没?? ...…

查看全部问答>

calibrate_delay 的头文件是什么

嵌入式开发,Linux系统,是可以在驱动里面调用calibrate_delay 这个函数的吧 不知道需要包含什么头文件…

查看全部问答>

我的移动硬盘使用时,怎么显示:"本地磁盘"啊?

求救:     我的移动硬盘使用时,怎么显示:\"本地磁盘\"啊?     而且打不开! 谁知道 怎么解决? 谢谢!!!…

查看全部问答>