博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mdk编译时的内存分析
阅读量:5224 次
发布时间:2019-06-14

本文共 1197 字,大约阅读时间需要 3 分钟。

内存四区(代码区,全局区,栈区,堆区)

Code:即代码域,它指的是编译器生成的机器指令,这些内容被存储到ROM区。

RO-data:Read Only data,即只读数据域,它指程序中用到的只读数据,这些数据被存储在ROM区,因而程序不能修改其内容。例如C语言中const关键字定义的变量就是典型的RO-data。
RW-data:Read Write data,即可读写数据域,它指初始化为 “ 非0值 ” 的可读写数据,程序刚运行时,这些数据具有非0的初始值,且运行的时候它们会常驻在RAM区,因而应用程序可以修改其内容。例如C语言中使用定义的全局变量,且定义时赋予“非0值”给该变量进行初始化。
ZI-data:Zero Initialie data,即0初始化数据,它指初始化为“0值”的可读写数据域,它与RW-data的区别是程序刚运行时这些数据初始值全都为0,而后续运行过程与RW-data的性质一样,它们也常驻在RAM区,因而应用程序可以更改其内容。例如C语言中使用定义的全局变量,且定义时赋予“0值”给该变量进行初始化(若定义该变量时没有赋予初始值,编译器会把它当ZI-data来对待,初始化为0);
ZI-data的栈空间(Stack)及堆空间(Heap):在C语言中,函数内部定义的局部变量属于栈空间,进入函数的时候从向栈空间申请内存给局部变量,退出时释放局部变量,归还内存空间。而使用malloc动态分配的变量属于堆空间。在程序中的栈空间和堆空间都是属于ZI-data区域的,这些空间都会被初始值化为0值。编译器给出的ZI-data占用的空间值中包含了堆栈的大小(经实际测试,若程序中完全没有使用malloc动态申请堆空间,编译器会优化,不把堆空间计算在内)。
static无论是全局变量还是局部变量都存储在全局/静态区域,在编译期就为其分配内存,在程序结束时释放,

如果需要查看具体的内存可以查看编译出来的.map文件

里面有详细的内存信息

STM32F103re的内存地址
RAW = RW Data  + ZI Data
内置64K字节的静态SRAM。它可以以字节、半字(16位)或全字(32位)访问。
起始地址 0x2000 0000
终点地址 0x2000 ffff    
ROM = Code + RO Data + RW Data
高达512K字节闪存存储器结构:大容量产品主存储块最大为64K×64位,每个存储块划分为256个2K字节的页。
页0 0x0800 0000 - 0x0800 07FF 2K
页1 0x0800 0800 - 0x0800 0FFF 2K
    … … …
    … … …
页255 0x0807 F800 - 0x0807 FFFF 2K

转载于:https://www.cnblogs.com/wlstm/p/11010578.html

你可能感兴趣的文章
HDU 4292 Food 最大流
查看>>
【转】技术普及帖:你刚才在淘宝上买了一件东西
查看>>
C++网络库
查看>>
Xcode6 LaunchImage尺寸
查看>>
2018-2019-1 20165322 实验三 实时系统
查看>>
JavaBean简介和要求
查看>>
spring事务不会进行回滚的情况
查看>>
【运维】CPU负载
查看>>
do break的妙用
查看>>
团队-爬取豆瓣电影Top250-项目总结
查看>>
Linux入门(二)Shell基本命令
查看>>
Win7开发NIOS 编译问题(转帖)
查看>>
css height
查看>>
仿制视频播放滚动条效果(加左右控制按钮)
查看>>
对择业的几点思考:重走青春路?难!
查看>>
本地视频播放-ios
查看>>
Java堆分析
查看>>
vue2.0开发时导入组件时出错
查看>>
设计模式系列一——数据库常用模式(2009-12-31)
查看>>
鸡啄米vc++2010系列29(树形控件Tree Control 上)
查看>>