
关于堆和栈,你真的了解吗? 大家可能会以为我今天准备跟你们聊的是数据结构偏软件层面的堆跟栈,不过由于这方面内容涉及较多,偏软件层面的堆和栈我会在后期文章中着重讲解,所以今天给大家带来的主角是硬件层面的堆和栈!
基本介绍
在嵌入式和单片机开发领域中,堆和栈是非常重要的基础知识,但对于许多开发者来说,对这方面的概念还是非常的模糊,甚至基本没了解过。
- 栈:基本上可以理解为,函数的局部变量都是存放在栈里面的。
- 堆:程序中全局、静态变量,以及内存管理所用的内存,都属于堆区。
增长方向
- 一般在CPU中,栈增长方向是向下的,而堆的生长方向是向上的。
- 所有的内存分为:堆+栈。
- 他们各自的起始地址和增长方向不同,都没有一个固定的界限,所以一旦堆栈冲突,系统就到了崩溃的地步了!
大小端模式
- CPU中的堆栈地址,调试打印输出时,看到的地址字节倒序了,其实这是大小端地址存储的原因。

- 举个例子,STM32属于的是小端模式;
在STM32代码中定义一个变量为 u32 temp = 0x12345678,我们可以用unsigned char buf[4]来表示temp,如下右图为STM32的变量存储内容。
其他注意
-
内存=静态存储区+栈区。
-
如果使用了malloc来进行动态分配内存的话,内存=静态存储+栈区+堆区。
-
RO-data表示 程序定义的常量。 RW-data表示 已初始化的全局变量。 ZI-data表示 未初始化的全局变量
陈皮仔技术专栏:
CSDN:blog.csdn.net/Mr_Lester
简书:www.jianshu.com/u/2c67d6b3b…
掘金:juejin.cn/user/384354…
知乎:www.zhihu.com/people/chen…
关注 "陈皮仔" 公众号,回复关键字"皮友java教程",即可获得无价之宝--->java教程,从此青铜到王者不是梦!
