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 论语》之《微机原理篇》,那里面讲述了关于计算机组成的圣人之道。