STM32内存管理以及堆和栈的理解
来源:互联网 发布:手机性价比 知乎 编辑:程序博客网 时间:2024/06/18 09:53
今天仔细读了一下内存管理的代码,然后还有看了堆栈的相关知识,把以前不太明白的一些东西想通了,写下来,方便以后查看,也想大家看了能指出哪里不对,然后修改。
首先,先看一下stm32的存储器结构。
Flash,SRAM寄存器和输入输出端口被组织在同一个4GB的线性地址空间内。可访问的存储器空间被分成8个主要块,每个块为512MB。
FLASH存储下载的程序。
SRAM是存储运行程序中的数据。
所以,只要你不外扩存储器,写完的程序中的所有东西也就会出现在这两个存储器中。
这是一个前提!
堆栈的认知
1.
这个我产生过混淆,导致了很多逻辑上的混乱。首先要说明的是单片机是一种集成电路芯片,集成CPU、RAM、ROM、多种I/O口和中断系统、定时器/计数器等功能。CPU中包括了各种总线电路,计算电路,逻辑电路,还有各种寄存器。Stm32有通用寄存器R0‐R15
2.
在编程中很多时候会提到堆栈这个东西,准确的说这个就是RAM中的一个区域。我们先来了解几个说明:
(1)
(2)
C语言上分为栈、堆、bss、data、code段。具体每个段具体是存储什么数据的,直接百度吧。重点分析一下STM32以及在MDK里面段的划分。
MDK下Code,RO-data,RW-data,ZI-data这几个段:
Code是存储程序代码的。
RO-data是存储const常量和指令。
RW-data是存储初始化值不为0的全局变量。
ZI-data是存储未初始化的全局变量或初始化值为0的全局变量。
Flash=Code + RO Data + RW Data;
RAM= RW-data+ZI-data;
这个是MDK编译之后能够得到的每个段的大小,也就能得到占用相应的FLASH和RAM的大小,但是还有两个数据段也会占用RAM,但是是在程序运行的时候,才会占用,那就是堆和栈。在stm32的启动文件.s文件里面,就有堆栈的设置,其实这个堆栈的内存占用就是在上面RAM分配给RW-data+ZI-data之后的地址开始分配的。
堆:是编译器调用动态内存分配的内存区域。
栈:是程序运行的时候局部变量的地方,所以局部变量用数组太大了都有可能造成栈溢出。
堆栈的大小在编译器编译之后是不知道的,只有运行的时候才知道,所以需要注意一点,就是别造成堆栈溢出了。。。不然就等着hardfault找你吧。
3.
嵌入式系统的堆栈,不管是用什么方法来得到内存,感觉他的方式都和编程中的堆差不多。目前我知道两种获得内存情况:
(1)用庞大的全局变量数组来圈住一块内存,然后将这个内存拿来进行内存管理和分配。这种情况下,堆栈占用的内存就是上面说的:如果没有初始化数组,或者数组的初始化值为0,堆栈就是占用的RAM的ZI-data部分;如果数组初始化值不为0,堆栈就占用的RAM的RW-data部分。这种方式的好处是容易从逻辑上知道数据的来由和去向。
(2)就是把编译器没有用掉的RAM部分拿来做内存分配,也就是除掉RW-data+ZI-data+编译器堆+编译器栈后剩下的RAM内存中的一部分或者全部进行内存管理和分配。这样的情况下就只需要知道内存剩下部分的首地址和内存的尾地址,然后要用多少内存,就用首地址开始挖,做一个链表,把内存获取和释放相关信息链接起来,就能及时的对内存进行管理了。内存管理的算法多种多样,不详说,这样的情况下:OS的内存分配和自身局部变量或者全局变量不冲突,之前我就在这上面纠结了很久,以为函数里面的变量也是从系统的动态内存中得来的。这种方式感觉更加能够明白自己地址的开始和结束。
这两种方法我感觉没有谁更高明,因为只是一个内存的获取方式,高明的在于内存的管理和分配。- STM32内存管理以及堆和栈的理解
- STM32内存管理以及堆和栈的理解
- String 的个人理解以及在栈堆的内存以及Stringbuilder和Stringbuffer
- ios 对堆内存和栈的理解以及 Instruments内存现象解析
- STM32堆(stack)和栈(heap)的理解
- STM32堆和栈(Heap & Stack)的资料理解
- STM32堆和栈(Heap & Stack)的资料理解
- STM32堆和栈(Heap & Stack)的资料理解
- Java内存管理的堆和栈
- java中栈内存和堆内存的简单理解
- 内存管理和堆
- java中堆和栈的比较以及理解
- 堆内存与栈内存的理解
- Java的内存机制(堆和栈)简单理解
- C++ 堆和栈的区别 内存分配方式理解
- 浅谈内存分配方式以及堆和栈的区别
- 浅谈内存分配方式以及堆和栈的区别
- Java中的内存分配以及栈和堆的区别
- Python菜鸟--字符串
- VS2013编写和调用动态链接库
- 查看LINUX进程内存占用情况 top pmap ps
- Mac升级到macOS Sierra 10.12后SVN管理软件Conerstone破解版安装后提示“已损坏”问题
- ECCV A Discriminative Feature Learning Approach for Deep Face Recognition
- STM32内存管理以及堆和栈的理解
- 问题记录
- Windows学习总结(7)——学会CMD命令提示符的重要性
- 服务器的多域名配置
- iOS JSONKit配置
- 多线程的创建和使用
- CryptoJS aes加密,需key 和偏移量 iv
- iOS开发中的这些权限,你搞懂了吗?
- cocos2d-x CheckBox添加侦听