RAM:
首先RAM是我们常人理解的运行内存。存储在这里面的内容断电以后就没了,再次上点以后就要重新开始了。不同的关键字修饰它可能就会不太一样。
常用的static变量,全局变量,局部变量这些都是再RAM内,但是RAM可以分为三个区域。堆、栈、静态存储区;
1、堆 由程序员自动分配(malloc)以及释放,这里的释放很关键,一定要在使用完成后释放内存(free)!!!
2、栈 编译器自动分配的,局部变量,函数的一些形参都会存储在这个区域
3、静态存储区:这里存放的就是初始化的全局变量和static修饰的变量,这里注意只要是static修饰的变量都是存放在静态存储区的。
ROM/FLASH:
关于ROM和flash,flash是ROM的一种;
所有的常量,只读变量,还有代码都是存储在flash的。
SRAM(Static Random-Access Memory):静态随机存储器,所谓的“静态”,是指这种存储器只要保持通电,里面储存的数据就可以恒常保持。
DRAM(Dynamic Random Access Memory):动态随机存储器,每隔一段时间,要刷新充电一次,否则内部的数据即会消失。
SDRAM (synchronous dynamic random-access memory):同步动态随机存取内存,是有一个同步接口的动态随机存取内存(DRAM)。通常DRAM是有一个异步接口的,这样它可以随时响应控制输入的变化。
NAND闪存(NANDFLASH)是一种比硬盘驱动器更好的存储设备,是一种非易失性存储技术,即断电后仍能保存数据,经常用来存储运行的代码。
NorFlash:简单来说与sdram与Nand的中间品,它能像sdram一样直接读,但是又得像nand一样编程擦写。因此程序可以直接在nor里跑,速度要比sdram慢一些,往nor里写数据必须先擦除,因为nor的每一位只能由1变为0。NORFLASH支持字节操作,而SDRAM是以单个sector操作的。
FMC(Flexible Memory Controller): 译为可变存储控制器。它可以用于驱动包括SRAM、SDRAM、NOR FLASH以及NAND FLSAH类型的存储器。
FSMC控制器(Flexible Static Memory Controller):译为可变静态存储控制器,所以它们不能驱动SDRAM这样的动态存储器,因为驱动SDRAM时需要定时刷新.
程序内存的分配:
Program Size 包含以下几个部分:
1)Code:代码段,存放程序的代码部分;(存在flash中)
2)RO-data:只读数据段,存放程序中定义的常量,只读属性,比如const 修饰;(存在flash中)
3)RW-data:读写数据段,存放初始化为非 0 值的全局变量;(保存在flash中,运行时搬运到RAM中)
4)ZI-data:0 数据段,存放未初始化的全局变量及初始化为 0 的变量;(存在RAM中)
Program RAM Size :RW-data + ZI-data
Program Flash Size :Code + RO-data + RW-data。
其中动态内存堆为未使用的 RAM 空间,应用程序申请和释放的内存块都来自该空间。
列子:
#include <rtthread.h>
const static rt_uint32_t sensor_enable = 0x000000FE; /* 属于常量,放在flash的RO段*/
rt_uint32_t sensor_value;/*属于全局未初始化变量,放在RAM中的 ZI段*/
rt_bool_t sensor_inited = RT_FALSE;/*属于全局初始化变量,放在RAM中的 RW段*/
void sensor_init()/* 函数地址,局部变量 放在栈中*/
{
int status; /* 局部变量放在栈中*/
/* ... */
}