642|0

60

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

详解单片机的内存分配(看完茅塞顿开!)-道合顺大数据infinigo [复制链接]

对于初学者而言,对单片机的内存分配往往最让人头疼,很多人学了单片机几年都不知道单片机内部的内存使用情况是如何分配的。要了解 ROM(flash)、RAM(sram)启动,首先 需要对链接器 Linker 如何分配内存有一定的了解。

通常,对于栈生长方向向下的单片机,其内存一般模型是:

 

一个进程运行时,所占用的内存,可以分为如下几个部分:

1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量的值等。

2、堆区(heap):一般由程序员分配释放,若程序员不释放,程序结束时可能由OS释放。

3、全局变量、静态变量:初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系统自动释放。

4、文字常量:常量字符串就是放在这里的。这些数据是只读的,分配在RO-data(只读数据存储区),则被包含在flash中,程序结束后由系统自动释放

5、程序代码(code):存放函数体的二进制代码。

同时,单片机内存被分为flash(rom)和sram(ram),flash里面的数据掉电可保存,sram中的数据掉电就丢失,sram的执行速度要快于flash,flash容量大于sram。

上方的最低内存地址,最高地址,都是在flash和sram中

我们正常下载程序都是下载存储进flash里面,这也是为什么断电可保存的原因。

单片机的程序存储分为code(代码存储区)、RO-data(只读数据存储区)、RW-data(读写数据存储区) 和 ZI-data(零初始化数据区)

  • Flash 存储 code和RO-data
  • Sram 存储 RW-data 和ZI-data

 

在使用MDK编译时可以看到

 

Code为程序代码部分 = 程序代码区(code)

RO-data 表示 程序定义的常量 = 文字常量区

RW-data 表示 已初始化的全局变量 = 栈区(stack)堆区(heap)全局区(静态区)(static)

ZI-data 表示 未初始化的全局变量。

 

此帖出自信息发布论坛
点赞 关注
 
 

回复
举报
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/6 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表