CPU 字长与存储器位宽不一致处理

80186 的字长为16,而NVRAM
的位宽为8,在这种情况下,我们需要为NVRAM 提供读写字节、字的接口,如下:

 1 typedef unsigned char BYTE;
 2 typedef unsigned int WORD;
 3 /* 函数功能:读NVRAM 中字节
 4 * 参数:wOffset,读取位置相对NVRAM 基地址的偏移
 5 * 返回:读取到的字节值
 6 */
 7 extern BYTE ReadByteNVRAM(WORD wOffset)
 8 {
 9 LPBYTE lpAddr = (BYTE*)(NVRAM + wOffset * 2); /* 为什么偏移要×2? */
10 return *lpAddr;
11 }
12 /* 函数功能:读NVRAM 中字
13 * 参数:wOffset,读取位置相对NVRAM 基地址的偏移
14 * 返回:读取到的字
15 */
16 extern WORD ReadWordNVRAM(WORD wOffset)
17 {
18 WORD wTmp = 0;
19 LPBYTE lpAddr;
20 /* 读取高位字节 */
21 lpAddr = (BYTE*)(NVRAM + wOffset * 2); /* 为什么偏移要×2? */
22 wTmp += (*lpAddr)*256;
23 /* 读取低位字节 */
24 lpAddr = (BYTE*)(NVRAM + (wOffset +1) * 2); /* 为什么偏移要×2? */
25 wTmp += *lpAddr;
26 return wTmp;
27 }
28 /* 函数功能:向NVRAM 中写一个字节
29 *参数:wOffset,写入位置相对NVRAM 基地址的偏移
30 * byData,欲写入的字节
31 */
32 extern void WriteByteNVRAM(WORD wOffset, BYTE byData)
33 {
34 35 }
36 /* 函数功能:向NVRAM 中写一个字 */
37 *参数:wOffset,写入位置相对NVRAM 基地址的偏移
38 * wData,欲写入的字
39 */
40 extern void WriteWordNVRAM(WORD wOffset, WORD wData)
41 {
42 43 }

子贡问曰:Why 偏移要乘以2?
子曰:请看图1,16 位80186 与8 位NVRAM 之间互连只能以地址线A1 对其A0,CPU
本身的A0 与NVRAM 不连接。因此,NVRAM 的地址只能是偶数地址,故每次以0x10 为
单位前进!


图1 CPU 与NVRAM 地址线连接
子贡再问:So why 80186 的地址线A0 不与NVRAM 的A0 连接?
子曰:请看《IT 论语》之《微机原理篇》,那里面讲述了关于计算机组成的圣人之道。

posted @ 2013-11-20 10:00  Fight_4_ever  阅读(688)  评论(0编辑  收藏  举报