深入分析存储器的位宽及与C的关系
来源:互联网 发布:淘宝后台填写宝贝 编辑:程序博客网 时间:2024/05/18 00:13
一、硬件参数
1、CPU:s3c44b0x
字长32位;以字节为单位编址;数据处理支持三种数据类型:字节(8位)、半字(16位)、字(32位);存储方式有大小端之分;25根地址线。
2、存储器
Ⅰ Flash ROM: SST39VF1601
数据位宽为16位(16根数据线);20根地址线;2M(1M*16bit)。
Ⅱ SDRAM: HY57V641620HG
数据位宽为16位(16根数据线);12根地址线(行地址选择线有12根,列地址选择线有8根(12根的低8根)),2根bank选择线,总共有22根有效地址线;8M(4bank*1M*16bit)。
3、
CPU编址:以字节(8bit)为单位
存储器编址:以其位宽为单位,也就是说每个存储器地址下的数据位数为位宽。如
8K*12bit的存储器中的12就是存储器的位宽,指每个存储器地址下数据的位数。
这个12与地址线的多少无关,8K就是指有8K个不同的地址8K=8*1024=2^? 2的多少次方等于8*1024就有多少根地址线,8=2^3, 1024=2^10, 那么8K=2^13 ,存储器地址线就为13根。
二、存储器容量、位宽及其地址线根数三者之间的关系
1、存储容量计量单位的换算
1M(MB,mbyte)=2^10K(KB,kbyte)=2^20B(byte);
1Mb(Mbit)=2^10Kb(kbit)=2^20b(bit);
1字(Word)=2半字(half word)=4字节(B,byte)=4×8位(b,bit)。
2、关系的确立
以上面的SST39VF1601为例,
存储容量2M=16Mbit=16*2^20bit,
地址线寻址范围:2^20*16bit(地址线根数20,位宽16)。
以上面的HY57V641620HG为例,
存储容量8M=8*8Mbit=64*2^20bit,
地址线寻址范围:2^22*16bit=64*2^20bit(地址线根数22,位宽16)。
总结:
存储器位宽表示每个地址下有多少位数据,与它的数据线根数相等;
存储器的地址线根数(N)决定了它的地址编号范围(2^N);
存储器的位宽与它的地址线根数是没有联系的;
而存储器容量是位宽与2^N的乘积,此处单位为bit。
三、CPU的寻址
CPU编址:每个cpu地址编码中存放一个8位数据
CPU的字长为N
最大寻址范围为2^N
四、存储器位宽与CPU和存储器地址线连接方式之间的联系
1、详情可参见文章《外设位宽为8、16、32时,CPU与外设之间地址线的连接方法》。
CPU地址编号(每个地址存放8位数据)
存储器地址编号(每个地址存放16位数据)
00000(8位数据)
00001(8位数据)
00000(16位数据)
00010
00011
00001
00100
00101
00010
00110
00111
00011
01000
01001
00100
上表是CPU地址与存储器地址对应关系。
2、此步是在硬件层面实现的,软件层面不必再做考虑。
五、数据类型及其在内存中的存储形式
1、整型数据
类型
符号表示
内存中占用的位数
数值范围
无符号 基本整型
unsigned [int]
16(2字节)
-2^15 – (2^15-1)
有符号 基本整型
[signed] int
16(2字节)
0 – (2^16-1)
无符号 短整型
unsigned short [int]
16(2字节)
-2^15 – (2^15-1)
有符号 短整型
[signed] short [int]
16(2字节)
0 – (2^16-1)
无符号 长整型
unsigned long [int]
32(4字节)
-2^31 – (2^31-1)
有符号 长整型
[signed] long [int]
32(4字节)
0 – (2^32-1)
注:有符号整型数据的最高位为符号位。[]内的是可要可不要的
2、实型数据
类型
符号表示
内存中占用位数
有效位数
数值范围
单精度型
float
32(4字节)
6-7
-3.4*10^(-38)-3.4*10^38
双精度型
double
64(8字节)
15-16
-1.7*10^(-308)-1.7*10^308
长双精度型
long double
64(8字节)
18-19
-1.2*10^(-4932)-1.2*10^4932
3、字符型数据
类型
符号表示
内存中占用位数
数值范围
无符号字符型
unsigned char
8(1字节)
0 - 255
有符号字符型
signed char
8(1字节)
-128 - 127
注:字符型数据和整型数据是通用的,但是应注意字符型数据只占用一个字节,它只能存放0 – 255范围内的整型数据。
六、底层编程实现CPU对存储器进行不同类型数据的读写操作
#define INT32U unsigned int // 16位无符号基本整型
#define INT16U unsigned short //16位无符号短整型
#define S32 int // 16位有符号基本整型
#define S16 short int // 16位无符号短整型
#define U8 unsigned char //8位无符号字符型
#define S8 char //8位有符号字符型,
1、接下来的这两个宏是对SST39VF1601 进行16位无符号短整型读写操作:
#define Writeflash(addr,dat) *((volatile INT16U *)(addr<<1))=(INT16U)dat
#define Readflash(addr) (*((volatile INT16U *)(addr<<1)))
解析:
addr<<1的主要目的就是使cpu的地址编号变化能跟上每存储一个单元数据地址编号的变化的步伐。这里的addr是CPU的地址编号,与存储器的地址编号无关。
第一个16位数据占据了CPU的两个地址编号00000和00001,因为CPU的每个地址编号只能存放8位的数据。第二个16位数据占据00010和00011两个CPU地址编号。
CPU地址编号左移1位目的是同步每存储一个单元数据所引起的CPU地址编号变化和CPU地址编号实际的变化,使CPU地址编号跨越1个编号正常进入下一个16位数据。
若不左移1位,当addr是00001时将取出00001和00010这两个CPU地址编号处的16位数据,这与前面数据所占得CPU的地址编号是不一致的。
2、接下来这两个宏是对HY57V641620HG进行8位字符型数据的读写操作:
#define WriteSdram(address,data) *((volatile U8 *)(address))=(U8)data
#define ReadSdram(address) *((volatile U8 *)(address))
解析:
第一个8位数据占据了CPU地址编号00000, 第二个8位数据占据了CPU地址编号00001。因此这里每8位数据占据的地址编号只有一个,CPU地址编号就不必如前面读写操作对address左移1位以适应每存储一个单元数据地址编号变化的步伐。
3、总结:
这里的左移与存储器和CPU地址线的错开一位接法方式是没有联系的,千万不要将两者混淆了。前者是在软件层面上实现的,后者是在硬件层面地址自动实现转换的。左移操作的起因:CPU每个地址编号只能存放8位数据,而对存储器存取数据类型占用字节数超过一个字节(8位数据)。
- 深入分析存储器的位宽及与C的关系
- 存储器容量、位宽及其地址线根数三者之间的关系
- 深入分析有关存储器的疑问
- 深入分析RFID与NFC的关系
- 深入分析kobject与sysfs的关系
- 深入分析RFID与NFC两种技术的关系
- 深入源码分析Map与List的关系
- 第四节:C64+ DSP 的CPU及存储器体系中存储器关系
- 位与字节的关系
- ARM与不同位宽存储器的地址线错位接口
- 深入理解计算机系统学习笔记(三)之C语言常见的与存储器(内存)有关的错误
- 位“异或”运算在变量交换中的应用及与位“或”的逻辑关系
- 电脑内存与操作系统32位和64位的关系及两者区别
- C的联合体(测试数据存储的大小端模式) 位段(位段与位的对应关系)
- c程序中常见的与存储器有关的错误
- C程序中常见的与存储器有关的错误
- C/C++中常见的与存储器有关的错误
- C程序中常见的与存储器有关的错误
- Mixer编程
- C#启动窗体的制作—基于线程技术实现
- 外设位宽为8、16、32时,CPU与外设之间地址线的连接方法
- android中使用GestureDetector.OnGestureListener对触屏事件进行分析的使用后感
- C/C++/C#/Java程序员的Ruby第二天
- 深入分析存储器的位宽及与C的关系
- 因为sudo apt-get install oss4-dkms oss4-base oss4-gtk ,造成找不到音效卡
- Nor Flash中的一些术语
- nginx subrequest的实现解析
- 再发一些有关SOP封装的文章……
- Th major functions of Pthread
- Flex动态添加组件例子 Flex如何动态添加组件
- POI3.5_HSSF_和XSSF_Excel操作快速入门
- CAP 理论