编程语言(2)

2008-02-23 05:32:10来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

int a,b,c;
a = inWord(0x100); /*读取I/O空间0x100端口的内容存入a变量*/
b = a;
a = inWord (0x100); /*再次读取I/O空间0x100端口的内容存入a变量*/
c = a;

  很可能被编译器优化为:

int a,b,c;
a = inWord(0x100); /*读取I/O空间0x100端口的内容存入a变量*/
b = a;
c = a;

  但是这样的优化结果可能导致错误,假如I/O空间0x100端口的内容在执行第一次读操作后被其他程式写入新值,则其实第2次读操作读出的内容和第一次不同,b和c的值应该不同。在变量a的定义前加上volatile关键字能够防止编译器的类似优化,正确的做法是:

volatile int a;

  volatile变量可能用于如下几种情况:

  (1) 并行设备的硬件寄存器(如:状态寄存器,例中的代码属于此类);

  (2) 一个中断服务子程式中会访问到的非自动变量(也就是全局变量);

  (3) 多线程应用中被几个任务共享的变量。

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

  在背景篇中提到,本文特意选择了一个和CPU字长不一致的存储芯片,就是为了进行本节的讨论,解决CPU字长和存储器位宽不一致的情况。80186的字长为16,而NVRAM的位宽为8,在这种情况下,我们需要为NVRAM提供读写字节、字的接口,如下:

typedef unsigned char BYTE;
typedef unsigned int WORD;
/* 函数功能:读NVRAM中字节
* 参数:wOffset,读取位置相对NVRAM基地址的偏移
* 返回:读取到的字节值
*/
extern BYTE ReadByteNVRAM(WORD wOffset)
{
 LPBYTE lpAddr = (BYTE*)(NVRAM wOffset * 2); /* 为什么偏移要×2? */

 return *lpAddr;
}

/* 函数功能:读NVRAM中字
* 参数:wOffset,读取位置相对NVRAM基地址的偏移
* 返回:读取到的字
*/
extern WORD ReadWordNVRAM(WORD wOffset)
{
 WORD wTmp = 0;
 LPBYTE lpAddr;
 /* 读取高位字节 */
 lpAddr = (BYTE*)(NVRAM wOffset * 2); /* 为什么偏移要×2? */
 wTmp = (*lpAddr)*256;
 /* 读取低位字节 */
 lpAddr = (BYTE*)(NVRAM (wOffset 1) * 2); /* 为什么偏移要×2? */
 wTmp = *lpAddr;
 return wTmp;
}

/* 函数功能:向NVRAM中写一个字节
*参数:wOffset,写入位置相对NVRAM基地址的偏移
* byData,欲写入的字节
*/
extern void WriteByteNVRAM(WORD wOffset, BYTE byData)
{
 …
}

/* 函数功能:向NVRAM中写一个字 */
*参数:wOffset,写入位置相对NVRAM基地址的偏移
* wData,欲写入的字
*/
extern void WriteWordNVRAM(WORD wOffset, WORD wData)
{
 …
}

  子贡问曰:Why偏移要乘以2?

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


图1 CPU和NVRAM地址线连接

  子贡再问:So why 80186的地址线A0不和NVRAM的A0连接?

  子曰:请看《IT论语》之《微机原理篇》,那里面讲述了关于电脑组成的圣人之道。

  总结

  本篇主要讲述了嵌入式系统C编程中内存操作的相关技巧。掌控并深入理解关于数据指针、函数指针、动态申请内存、const及volatile关键字等的相关知识,是个优秀的C语言程式设计师的基本需要。当我们已牢固掌控了上述技巧后,我们就已学会了C语言的99%,因为C语言最精华的内涵皆在内存操作中体现。

  我们之所以在嵌入式系统中使用C语言进行程式设计,99%是因为其强大的内存操作能力!

  假如您爱编程,请您爱C语言;

  假如您爱C语言,请您爱指针;

  假如您爱指针,请您爱指针的指针!




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 如何为嵌入式应用编写优秀的C 代码呢?

下一篇: 嵌入式linux C编程 -