RAM之程序运行时数据和代码加载

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和栈之间,用来动态分配内存,这段区域由程序员管理,程序员利用操作系统提供的分配和释放函数使用堆区的内存。如果程序员在堆上分配了一段内存,却没有释放,一般退出时会被操作系统释放。但是这不并不是一个好的习惯,因为栈区的空间不是无限的,过多的分配会导致堆内存溢出、程序异常甚至崩溃。

RAM之程序运行时数据和代码加载_第1张图片

你可能感兴趣的:(数据结构)