历史上的今天
返回首页

历史上的今天

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

正在发生

2020年01月16日 | STM32内存与堆栈

2020-01-16 来源:eefocus

内存基本构成

①  可编程内存在基本上分为这样的几大部分:静态存储区、堆区和栈区。他们的功能不同,对他们使用方式也就不同。

②  静态存储区:内存在程序编译的时候就已经分配好了,这块内存在程序的整个运行期间都存在。它主要存放静态变量、全局变量和常量。

③  栈区:在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率高,但是分配的内存容量有限。栈空间用于局部变量、函数调用、函数的参数等。

④  堆区:亦称动态内存分配。程序在运行的时候用malloc或new申请任意大小的内存,程序员自己负责在适当的时候用free或delete释放内存,动态内存的生存期可以由我们决定,如果我们不释放内存,程序将在最后才释放动态内存。但是,良好的编程习惯是:如果某动态内存不在使用,需要将其释放掉,否则,我们认为发生了内存泄漏现象。(从内存区域的起始地址开始分配给各个全局变量和静态变量:0x200000004)

 

按照这个说法,在startup_stm32f10x_hd文件里面设置了:

Heap_Size     EQU  0x00000000

 

也就是没有任何动态内除分配。

这样,内存=静态存储区+栈区

不存在堆!!!!!

因为没有用malloc来动态分配内存,所以提到的一切堆区,其实就是静态内存区。

 

另外,经过测试,确实是这样。

STM32的内存分配,应该分为两种情况:

1、使用了系统的malloc;

2、未使用系统的malloc。

 

第一种情况(使用malloc)

STM32的内存分配规律:从0x20000000开始依次为:静态存储区+堆区+栈区;

 

第二种情况(不使用malloc)

STM32的内存分配规律:从0x20000000开始依次为:静态存储区+栈区;

 

第二种情况不存在堆区

所以,一般对于开发板历程,实际上,没有所谓的堆区的概念,而仅仅是:静态存储区+栈区。无论哪种情况,所有的全局变量,包括静态变量之类的,全部存储在静态存储区。紧跟静态存储区之后的,是堆区(如没使用到malloc,则没有该区),之后是栈区。

此博文借鉴了原子哥的,发表此篇以此记录

 

补充知识:C语言

(1)栈区(stack):由编译器自动分配和释放,存放函数的参数值、局部变量的值等,其操作方式类似于数据结构中的栈。(切记不要在函数里面放N多局部变量,尤其是大数组)

(2)堆区(heap):一般由程序员分配和释放,若程序员不释放,程序结束时可能由操作系统回收,分配的方式类似于数据结构中的链表。

(3)全局区(静态区)(static):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量在一块区域;未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。

(4)文字常量区:常量字符串就是存放在这里的;

(5)程序代码区(ROM):存放函数体的二进制代码。

(6)堆是向上增长,栈是向下增长。

 

//STM32查找栈增长方向,结果保存在stack_dir里面
//0,向下增长;1,向上增长.
staticu8 stack_dir;

//查找栈增长方向,结果保存在stack_dir里面.
voidfind_stack_direction(void)
{
   static u8 *addr=NULL; //用于存放第一个dummy的地址。
   u8dummy;              //用于获取栈地址 
   if(addr==NULL)    //第一次进入
   {                          
       addr=&dummy;     //保存dummy的地址
       find_stack_direction ();  //递归 
   }else               //第二次进入 
 {  
       if(&dummy>addr)stack_dir=1; //第二次dummy的地址大于第一次dummy,那么说明栈增长方向是向上的. 
       else stack_dir=0;          //第二次dummy的地址小于第一次dummy,那么说明栈增长方向是向下的.  
 }

一般CPU的栈增长方向都是向下的

 

大端模式:低位字节存在高地址上,高位字节存在低地址上 
小端模式:高位字节存在高地址上,低位字节存在低地址上

//CPU到底是大端还是小端,可以通过如下代码测试:
//CPU大小端
//0,小端模式;1,大端模式.
static u8 cpu_endian;

//获取CPU大小端模式,结果保存在cpu_endian里面
void find_cpu_endian(void)

 int x=1;
 if(*(char*)&x==1)cpu_endian=0; //小端模式 
 else cpu_endian=1;    //大端模式  
}
//以上测试,在STM32上,你会得到cpu_endian=0,也就是小端模式.

推荐阅读

史海拾趣

格瑞宝(GP)公司的发展小趣事

格瑞宝公司成立于2014年8月,总部选址于上海张江高科园,这里是中国科技创新的重要基地之一。公司从创立之初就明确了以自主研发、销售服务为主体的半导体公司发展路径。这一决策不仅为格瑞宝提供了丰富的科技资源和人才支持,也为其后续快速发展奠定了坚实基础。在总部的带领下,格瑞宝逐步建立起完善的产品研发、设计、测试和销售体系。

德崧电子(D-SWITCH)公司的发展小趣事

在电子开关行业,防水性能一直是重要的技术指标。德崧电子(D-SWITCH)公司在成立初期就意识到了这一点,并投入大量资源进行研发。经过数年的努力,公司成功研发出了具有TUV IP67/IP68防水等级认证的防水型开关。这一突破性的技术不仅解决了市场上防水开关性能不稳定的问题,还大大提高了产品的可靠性和使用寿命。凭借这一技术优势,德崧电子在市场上迅速崭露头角,赢得了客户的广泛认可。

富瀚(Fullhan)公司的发展小趣事
设计紧凑合理,安装简便快捷;同时提供清晰的故障指示和便捷的维护接口,方便用户进行日常维护和故障排除。
Custom Components Inc公司的发展小趣事

随着全球环保意识的不断提高,电子行业对绿色环保和可持续发展的要求也日益严格。CCI积极响应这一趋势,将绿色环保理念融入公司的战略规划和日常运营中。

公司不仅采用了环保材料和绿色生产工艺来降低产品对环境的影响,还通过优化生产流程和资源利用等方式降低能耗和排放。此外,CCI还积极参与行业环保组织和公益活动,推动整个行业向更加绿色、环保的方向发展。

胜利(VICTOR)公司的发展小趣事

随着产品的不断升级和市场的扩大,胜利公司开始将目光投向国际市场。1980年代,VICTOR品牌成功进入欧美市场,凭借优质的产品和合理的价格,迅速赢得了消费者的认可。公司还积极参加国际赛事,通过赞助等方式提升品牌知名度。

Good Will Instrument Co., Ltd.公司的发展小趣事

随着产品的不断升级和市场的扩大,胜利公司开始将目光投向国际市场。1980年代,VICTOR品牌成功进入欧美市场,凭借优质的产品和合理的价格,迅速赢得了消费者的认可。公司还积极参加国际赛事,通过赞助等方式提升品牌知名度。

问答坊 | AI 解惑

小型太阳能收音机

太阳能是取之不尽,用之不竭的能源。将太阳能(或其它光能)直接转换为电能的器件,被称为太阳能电池。随着人们节能和环保意识的不断增强,太阳能电池正以能源丰富、无污染、寿命长、使用维护简便和性能可靠等优点,而越来越受到人们的喜爱。动手制 ...…

查看全部问答>

单片机英文文献及翻译,3000字左右 急需 谢谢

谁有单片机相关英文文献及翻译,3000字左右 急需 谢谢  我的邮箱 [email=liuzhe520520@163]liuzhe520520@163[/email].com…

查看全部问答>

当前手机监控怎么样了?

圈里的朋友,不知道当前手机监控做到什么程度了? 是用一般的摄像机支持手机浏览的网络视频服务器, 还是直接用网络摄像机好些?…

查看全部问答>

【求助】单片机直接读写SIM卡,遇到困难

我现在用STC的单片机(基本上兼容51)在做一个直接操作SIM卡的项目。用的是KEIL编程环境。 如果哪位高手有单片机直接读写SIM卡的程序,希望能提供一下,非常感谢。 现在进展的情况: SIM卡上电复位后,似乎是能读到返回值了,返回值的第一个字节 ...…

查看全部问答>

请问在ce6平台下怎么测试短信和电话程序呢?

在WM6下,仿真器可以与Cellular Emulator配合使用测试电话和短信,但wince6在仿真器环境下该怎么弄呢?…

查看全部问答>

SN75LVDS84/DS90CF363B

有用过这两款芯片的朋友吗?我现在用它来把5:6:5格式的显示信号转换成差分信号送给LCD显示,可是这块芯片的输入数据引脚有18根,就是说一般接收6:6:6的数据格式的显示数据,我把剩下的两根引脚留了下来,有谁知道这两根引脚应该怎么处理吗?另 ...…

查看全部问答>

安装VS2005补丁出现错误

错误如下; please wait while windows configures microsoft visual studio 2005 Professional Edition -ENUV 牛人们指点下 …

查看全部问答>

新手怎么入门

我想学习单片机,但要从什么学起,单机的种类是不是很多。…

查看全部问答>

移植5.0至6.0的USBFN所遇到的问题

重操旧业,移植5.0BSP至6.0,还是比较顺利的 不过的USBFN驱动上一直过不去,Client是用serialusbfn.dll, 大家帮我看看我的打印信息,看看能不能看出问题所在 +USB FUNCTION Driver TCCxxxUSBFn!UfnPdd_Init: Using IO Base b0010000 TCCxxxUSB ...…

查看全部问答>

好习惯,要坚持!

良好设计习惯:        1.  输入输出数据都要寄存器缓冲!        2。使用中间寄存器进行数据过渡;        3。使用全同步设计!…

查看全部问答>