本篇文章主要介绍处理器中存储器:ROM和RAM以及数据在内存中的存储顺序:大/小端(Little/Big Endian)。
只读存储器(ROM)
ROM(Read Only Memory)用来存储和保存数据。ROM数据不能随意更新,但是在任何时候都可以读取。即使是断电,ROM也能够保留数据。此内存主要用来放置使用者所开发之程序,eg. Bios,boot,而其性质乃属于不常更动或永不变动之资料,微控制器之动作便是依据储存于此区之程序指令运作。
ROM有很多种,例如PROM,EPROM,EEPROM,具体可百度。
随机存取存储器(RAM)
RAM(Read-Write Memory)亦称为读/写内存,是与CPU直接交换数据的内部存储器,也叫内存。它可以随时读写,而且速度很快,通常作为操作系统或其他正在运行中的程序的临时数据存储媒介, 当电源关闭时RAM不能保留数据。
RAM 可以进一步分为静态RAM(SRAM)和动态内存(DRAM)两大类。静态RAM(Static RAM/SRAM):SRAM速度非常快,不需要刷新电路即能保存数据,是目前读写最快的存储设备了,但是集成度较低,多用于CPU的一级缓存,二级缓存(L1/L2 Cache);动态RAM(Dynamic RAM/DRAM),DRAM保留数据的时间很短(需要内存刷新电路,每隔一段时间,刷新充电一次,否则数据会消失),速度也比SRAM慢,不过它还是比任何的ROM都要快.
若其地址总线位32位,则RAM大小为2^32bits。
大/小端模式
存储器中对数据的存储是以字节(Byte)为基本单位的,因此,字(Word)和半字(Half-Word)在存储器中就有两种次序,分别称为:大端模式(Big Endian)和小端模式(Little Endian)。
大段模式:低地址存放高字节数据。
小端模式:低地址存放低字节数据。
例如一个 int 型变量中存放一个数值是 0x12345678的数据:
大端模式:
小端模式:
一般地,ARM处理器均默认为小端模式。
知道了大小端模式的概念,怎样用C语言写段代码判断一个CPU是大端模式还是小端模式应当如何做呢 ?要用C语言实现就要用到联合体(union)。联合体union中的存放顺序是所有成员都从低地址开始存放,利用该特性可获得处理器对内存采用Little Endian还是Big Endian模式的读写。
采用union来判断,具体代码如下:
int CheckEndian(void){union check{int word;char half;} Endian;Endian.Word=1;if(1 == Endian.half)return Little_Endian;else return Big_Endian;
}
另外关于共用体与结构体:
结构体和共用体的区别在于结构体的各个成员会占用不同的内存,互相之间没有影响;而共用体的所有成员占用同一段内存,修改一个成员会影响其余所有成员。
结构体占用的内存大于等于所有成员占用的内存的总和(成员之间可能会存在缝隙),共用体占用的内存等于最长的成员占用的内存。共用体使用了内存覆盖技术,同一时刻只能保存一个成员的值,如果对新的成员赋值,就会把原来成员的值覆盖掉。