RAM之程序运行时数据和代码加载
来源:互联网 发布:淘宝虚拟试衣在哪 编辑:程序博客网 时间:2024/05/16 06:27
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之程序运行时数据和代码加载
- 谈程序在RAM,FLASH 和外部RAM中运行的速度
- LINUX 64位下运行32位程序加载和读取大数据段共享内存
- F2812 DSP程序运行在片内RAM和FLASH的区别
- gdb调试程序之查看运行时数据
- DSP程序Flash程序下载到RAM中运行
- cpu运行时程序是在flash中还是在RAM呢?
- cpu运行时程序是在flash中还是在RAM呢?
- cpu运行时程序是在flash中还是在RAM呢?【转】
- cpu运行时程序是在flash中还是在RAM,各自的区别?
- 加载地址和运行地址关系,程序如何由加载地址跳入运行地址运行
- VS2010调试“正试图在 OS 加载程序锁内执行托管代码”和运行出现R6034问题解决
- 程序的内存分布+ROM和RAM
- STM32-查看程序占用ROM和RAM
- 把程序从ROM中拷贝到RAM中运行模块的设计【ARM指令和Thumb指令的区分】
- 为什么RAM能运行比自身大的程序
- F2812程序从Flash搬到RAM中运行
- stm32f4 RAM中运行程序 读保护设置 - tofixer
- Android设计模式之代理模式 Proxy
- Samba服务器的安装及Crontab调度命令的使用
- OpenGL with PyOpenGL Python and PyGame p.4-Moving the player automatically towards the cube
- android.mk编译apk在64位机器内运行so库报错
- Cannot reload AVD list
- RAM之程序运行时数据和代码加载
- 1.ARM基础概念及芯片平台
- 51nod--1242 斐波那契数列第N项 (矩阵乘法优化)
- Poj 2892 Tunnel Warfare
- 反射和晚期绑定
- 基于Face++实现的人脸检测(年龄检测)Android程序
- 归并排序-nlogn
- 如何居中一个浮动元素?
- 机房收费系统遇到的问题(一) datagridview一次性移除多行选中数据,同时删除数据库数据