RAM之程序运行时数据和代码加载
2016-03-15 19:40
176 查看
RAM之程序运行时数据和代码加载
一般MCU芯片都会有这么两个东西:ROM和RAM。ROM为程序存储器(除了第一次烧程序向里面写数据,之后只能读,不能写),而RAM为数据存储器(掉电数据清零)。ROM用来存放程序,也就是程序bin文件,每次我们写完代码,编译的时候都会生成一个hex文件,这个文件经过烧录器写入MCU的ROM时,会将hex文件转为bin文件,再存入ROM。而此时还未向RAM 写入任何数据。
那么RAM是什么时候写入数据呢?程序上电运行时,MCU会把程序从ROM加载到RAM 中,RAM专门分配了一个区域用来存放代码段。而程序运行时各种数据类型在RAM中的分配如下:
① 全局初始化数据区:用来存放被初始化的全局变量、静态变量(包括全局和局部静态变量),以及常量(例如字符串)。
② Bss区(未初始化数据区):存放全局未初始化变量。Bss存放的数据在开始执行之前被内核初始化为0或者空指针(NULL)。
③ 栈:栈是一个由编译器分配释放的区域,用来存放函数的参数、局部变量等。当调用函数时,被调用函数的参数和返回值被存储到当前程序的栈区,之后调用函数再为自身的自动变量和临时变量在栈区上分配空间。当函数调用返回时,在栈区内的参数返回值、自动变量和临时变量等会被释放。这就是为什么C语言函数参数如果不是指针的话,被修改的参数结果用户无法得到的原因。
④ 堆:一般位于BSS和栈之间,用来动态分配内存,这段区域由程序员管理,程序员利用操作系统提供的分配和释放函数使用堆区的内存。如果程序员在堆上分配了一段内存,却没有释放,一般退出时会被操作系统释放。但是这不并不是一个好的习惯,因为栈区的空间不是无限的,过多的分配会导致堆内存溢出、程序异常甚至崩溃。
一般MCU芯片都会有这么两个东西:ROM和RAM。ROM为程序存储器(除了第一次烧程序向里面写数据,之后只能读,不能写),而RAM为数据存储器(掉电数据清零)。ROM用来存放程序,也就是程序bin文件,每次我们写完代码,编译的时候都会生成一个hex文件,这个文件经过烧录器写入MCU的ROM时,会将hex文件转为bin文件,再存入ROM。而此时还未向RAM 写入任何数据。
那么RAM是什么时候写入数据呢?程序上电运行时,MCU会把程序从ROM加载到RAM 中,RAM专门分配了一个区域用来存放代码段。而程序运行时各种数据类型在RAM中的分配如下:
① 全局初始化数据区:用来存放被初始化的全局变量、静态变量(包括全局和局部静态变量),以及常量(例如字符串)。
② Bss区(未初始化数据区):存放全局未初始化变量。Bss存放的数据在开始执行之前被内核初始化为0或者空指针(NULL)。
③ 栈:栈是一个由编译器分配释放的区域,用来存放函数的参数、局部变量等。当调用函数时,被调用函数的参数和返回值被存储到当前程序的栈区,之后调用函数再为自身的自动变量和临时变量在栈区上分配空间。当函数调用返回时,在栈区内的参数返回值、自动变量和临时变量等会被释放。这就是为什么C语言函数参数如果不是指针的话,被修改的参数结果用户无法得到的原因。
④ 堆:一般位于BSS和栈之间,用来动态分配内存,这段区域由程序员管理,程序员利用操作系统提供的分配和释放函数使用堆区的内存。如果程序员在堆上分配了一段内存,却没有释放,一般退出时会被操作系统释放。但是这不并不是一个好的习惯,因为栈区的空间不是无限的,过多的分配会导致堆内存溢出、程序异常甚至崩溃。
相关文章推荐
- Python正则表达式,re模块
- OpenGL with PyOpenGL Python and PyGame p.4-Moving the player automatically towards the cube
- Python——编写函数装饰器
- spring工作机制及为什么要用?
- OC语言—— add 与set 的区别
- 注册Github
- springmvc /struts2工作机制
- 网易2016年研发工程师编程题(1)
- 【转】java.util.ResourceBundle使用详解
- 机器学习实战-第四章贝叶斯分类-代码理解-读书笔记
- 【转】java.util.ResourceBundle使用详解
- python execfile()和locals()函数
- Java Gradle入门指南之简介、安装与任务管理
- 0001--open jdk源码下载
- ContentProvider
- java中static中的作用详解
- java基本数据类型
- Java字符流读写数据的两种方式
- 简明python教程 --C++程序员的视角(九):函数式编程、特殊类方法、测试及其他
- 简明python教程 --C++程序员的视角(八):标准库