STM32 堆和栈的学习(二)

来源:互联网 发布:java基础项目 编辑:程序博客网 时间:2024/06/09 19:50

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的示例里,<堆>就是这么一个东西,代码说<你在>就在,<你不在>就不在.申请了堆后,只要谁(任何位置的代码)知道这个位置是可以用的,谁都可以用(具有进程内存保护的平台除外),即使申请空间的变量<挂了>,这个空间也一直存在,直到有代码把它<销毁>掉.

0 1
原创粉丝点击