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

本文介绍了MCU芯片中的ROM与RAM作用,并详细解释了程序运行时数据与代码如何加载到RAM的不同区域,包括全局初始化数据区、Bss区、栈与堆的分配与管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值