历史上的今天
返回首页

历史上的今天

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

正在发生

2020年01月15日 | STM32 堆和栈的学习(二)

2020-01-15 来源:eefocus

1、首先来看:栈(STACK)的问题

函数的局部变量,都是存放在”栈”里面,栈的英文是:STACK.

所以,如果一个函数的局部变量过多,程序崩溃是很容易的事情,这时候,一般你会进入到hardfault….


对于栈区,一般栈顶,也就是MSP,在程序刚运行的时候,指向程序所占用内存的最高地址 
STM32使用KEIL仿真左侧列表

图中,MSP就是:0X2000 0940. 


程序运行后,MSP就是从这个地址开始,往下给函数的局部变量分配地址.

STM32使用KEIL编译下方列表

这里的Code,RO-data,RW-data,ZI-data分别代表如下:

Code为程序代码部分 
RO-data 表示 程序定义的常量const temp; 
RW-data 表示 已初始化的局部变量 
ZI-data 表示 未初始化的局部变量

Code, RO-data,RW-data …………flash 
RW-data, ZIdata……………….RAM


(常类型是指使用类型修饰符const说明的类型,常类型的变量或对象的值是不能被更新的)

STM32的栈,是向下生长的.事实上,一般CPU的栈增长方向,都是向下的。


2、再来说说,堆(HEAP)的问题

全局变量,静态变量,以及内存管理所用的内存,都是属于”堆”区,英文名:“HEAP”。

与栈区不同,堆区则从内存区域的起始地址,开始分配给各个全局变量和静态变量。堆的生长方向,都是向上的。在程序里面,所有的内存分为:堆+栈。

3、STM32大小端问题

STM32采用小端模式(我们常用的X86结构是小端模式,而KEIL C51则为大端模式。很多的ARM,DSP都为小端模式)


大端模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中。从高(大)字节做糖葫芦串。 


小端模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中。从低(小)字节做糖葫芦串。


4、全局变量、局部变量、动态变量、静态变量

全局静态变量:不管是否调用,它都在那里。一般在函数的外部定义,定义变量一般使用static关键字,并且在对应的 .h 文件添加关键字extra 。


局部静态变量:和全局静态变量类似,只是它定义的时候是被包含在函数内的,只在函数内部作为变量,而且是唯一的,而且使用关键字static。


局部动态变量:一般定义在函数内部,程序进入函数内,为局部变量申请内存,当函数执行完,内存被释放。然后局部变量也被释放。


全局动态变量:存在吗?全局可见但又可以踢掉的奇葩吗?抱歉,这句话对<全局>是个误解.<全局>的意思是变量本身没有编译器指定的生命周期,也就是<作用域>,但还有代码指定的生命周期.在LZ的示例里,<堆>就是这么一个东西,代码说<你在>就在,<你不在>就不在.申请了堆后,只要谁(任何位置的代码)知道这个位置是可以用的,谁都可以用(具有进程内存保护的平台除外),即使申请空间的变量<挂了>,这个空间也一直存在,直到有代码把它<销毁>掉.

推荐阅读

史海拾趣

Hmc Inc公司的发展小趣事

另一家名为“Innovative Memory Solutions”的公司,在2008年就开始布局HMC技术的研发。经过数年的潜心研究,该公司终于在2012年推出了首款商用HMC产品。这款产品的问世,不仅解决了传统DRAM带宽受限的问题,还显著降低了系统延迟。Innovative Memory Solutions通过积极的市场推广和与OEM厂商的合作,成功将HMC技术应用于高性能计算、数据中心等领域,实现了从研发到市场的成功跨越。

台湾唯圣(GW)公司的发展小趣事
电路设计应遵循相关的行业标准和安全规范,确保各元器件的选型、布局和连接方式合理可靠。
星海公司的发展小趣事

星海钢琴始终注重技术创新和品质提升。从引进国外先进技术到自主研发,星海钢琴在钢琴设计和制造方面取得了显著成果。公司特聘德国钢琴制造大师劳瑟·切尔先生为公司顾问,不断提升产品的工艺水平和音质表现。同时,星海钢琴还通过了ISO9001国际质量管理体系认证,确保每一架钢琴都符合高标准的质量要求。

Golledge Electronics公司的发展小趣事

星海钢琴始终注重技术创新和品质提升。从引进国外先进技术到自主研发,星海钢琴在钢琴设计和制造方面取得了显著成果。公司特聘德国钢琴制造大师劳瑟·切尔先生为公司顾问,不断提升产品的工艺水平和音质表现。同时,星海钢琴还通过了ISO9001国际质量管理体系认证,确保每一架钢琴都符合高标准的质量要求。

迦美信芯(CanaanTek)公司的发展小趣事

在导航芯片领域,迦美信芯也取得了显著成就。由公司董事长兼CTO倪文海主导开发的兼容“GPS+北斗导航”的射频芯片,被国内主要基带厂商广泛采用,占据了北斗细分市场60%的份额。这一成就不仅彰显了迦美信芯在导航芯片领域的强大实力,也为其在物联网和汽车电子等领域的应用奠定了坚实基础。

Heimann Optoelectronics Gmbh公司的发展小趣事

进入2015年后,随着物联网、5G等新兴技术的兴起,光电子器件的市场需求呈现出爆发式增长。Hei Inc Optoelectronic Division敏锐地捕捉到了这一市场趋势,及时调整产品策略,加大了对低功耗、小型化光电子模块的研发力度。公司推出的新一代光电子模块不仅满足了市场对于高效能、低能耗的需求,还凭借其优异的性价比迅速占领了市场份额。这一举措不仅推动了公司的快速增长,还进一步巩固了其在光电子领域的市场地位。

问答坊 | AI 解惑

如何延长基站电源蓄电池寿命

对于没有交流电的站点,柴油发电机很难保证(油价上涨和不能及时加油)供电,需要采取新的供电方案,可考虑采用太阳能供电系统。   2.减少蓄电池过放并及时补充   在电源供电方案规划期,需要根据负载电流,结合蓄电池的放电曲线配置比较合适的 ...…

查看全部问答>

2450 usb 2.0 device 如何修改为 host???

如上。 2440 只要修改寄存器就可以了,2450 似乎要自己写驱动。 请教各位大侠。…

查看全部问答>

3G模块短信发送问题

使用的3G模块为华为的EM730WCDMA模块,自己改了个短信发送程序,通过对串口发送AT指令实现,运行结果如下: ~ $ ./send the sms is sending........ AAT+CMGS=? OK ATE1 OK AT+CSQ +CSQ: 22,99 OK AT+CMGF=0 OK AT+CMGS=41 > 0891685 ...…

查看全部问答>

我用EVC编写PDA程序 现在想获得触摸屏的移动方向

就是用手指在触摸屏上移动 能获得手指移动的方向 向上 向下 ==…

查看全部问答>

MFC如何将输入的数控专用代码转成数控线段?

要做一个开放式数控的工程,MFC获取了一段数控专用的指令,请教如何将这段代码转换成数控的线段?小弟刚涉及这个,有很多地方不懂,请各位指教了!…

查看全部问答>

最牛的无线数传资料

无线数传模组: a.通用数传模组    WAP200B、EM200D、GW200B,最大100mW,64个频道,传输距离800米左右,内置前向纠错,最高速度19200(接口可达115200); b.高灵敏度数传模组   WAP200C、GW200KB,最大20mW,64个频道,传 ...…

查看全部问答>

28335 的外部中断

28335是不是把外部中断引脚去掉了,或者说没有外部中断引脚,有的话是哪个引脚…

查看全部问答>

811无法烧写和调试

各位好。我现在有一块811的评估板。里面只有1快板和一根USB,请问是IT给东西给少了。还是USB就可以用作烧写程序和仿真?但是我在keil里面设置好了以后(根据论坛帖子进行设计的),开始调试的时候就报错。程序我用的是IT提供的光盘里面的应该没有问 ...…

查看全部问答>