1、首先来看:栈(STACK)的问题
函数的局部变量,都是存放在”栈”里面,栈的英文是:STACK.
所以,如果一个函数的局部变量过多,程序崩溃是很容易的事情,这时候,一般你会进入到hardfault….
对于栈区,一般栈顶,也就是MSP,在程序刚运行的时候,指向程序所占用内存的最高地址
图中,MSP就是:0X2000 0940.
程序运行后,MSP就是从这个地址开始,往下给函数的局部变量分配地址.
这里的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的示例里,<堆>就是这么一个东西,代码说<你在>就在,<你不在>就不在.申请了堆后,只要谁(任何位置的代码)知道这个位置是可以用的,谁都可以用(具有进程内存保护的平台除外),即使申请空间的变量<挂了>,这个空间也一直存在,直到有代码把它<销毁>掉.
上一篇:STM32 堆和栈的学习
下一篇:stm32 栈溢出 错误
推荐阅读最新更新时间:2024-11-06 16:01
设计资源 培训 开发板 精华推荐
- 最小ESP32版
- LTC3632EDD 高效 15V、4mA 稳压器的典型应用电路
- AM1/4S-1205SH30Z 5V 0.25 瓦 DC-DC 转换器的典型应用
- AP3503F 340kHz、3A 同步 DC-DC 降压转换器的典型应用
- LDK120C33R 3.3V低压降稳压器典型应用(可调版)电路
- VFD荧光屏12位5x7模块
- ADR431A 2.5 Vout 超低噪声 XFET 电压基准的典型应用,具有灌电流和拉电流能力
- FEB184-001,低成本绿色模式 PWM 控制器电池充电器 10W
- LTC3129-1 的典型应用 - 具有 1.3 uA 静态电流的 15V、200mA 同步降压-升压型 DC/DC 转换器
- 基础训练营——基础FE1.1S一拖四集线器 copy
- 最后一周报名,STM32中国峰会暨粉丝狂欢节,5月12-13日深圳
- 【新年乐分享】EEWORLD优秀主题/回复第18期来啦~~
- EEworld版主招新啦!欢迎加入我们的队伍
- 【评论有礼】大话CC2650,从资料到例程、从应用到生态全方位讲解!
- 荣耀三月 我是原创我最牛!(恩智浦全程赞助)
- 有奖调研:英飞凌技术文档用户体验大调查
- 直播已结束|安世新一代高效的氮化镓(GaN)电源设计方案
- 10秒钟调查!TI 产品封装你来左右!!!
- 答题赢好礼:利用GAN技术应对电源适配器设计挑战
- “玄铁杯”第三届RISC-V应用创新大赛—国产高性能RISC-V Linux开发板LicheePi 4A报名专场,万元奖金,邀您奔赴开源设计盛宴