首页 | 新闻 | 交流 | 问吧 | 文档 | 手册 | 下载 | 博客

编译器和局部变量惹的祸:驱动开发中读片选的问题

作者:  时间: 2011-06-12

WINCE6.0, FIFO驱动程序采集AD数据。

FIFO驱动的IST中等待FIFO的半满中断(下降沿触发),等待成功后读取FIFO数据。

在进入IST后,由于FIFO已经开始采数,此时的FIFO是全满的,不会产生下降沿触发的半满中断,因此实现需要清掉FIFO里面的数据,C++代码如下:

void CFifoDevice::Clear()
{

unsigned shrot stmp;
 for(int k=0; k<5; k++)
 {
  for(int i = 0; i < FULL_FIFO_WORDS; i++)
  {
  stmp= (*(unsigned short*)m_virtFIFO);//m_virtFIFO是待读取的虚拟地址
  }
 }
}

测试发现,上述代码无法清掉FIFO数据,如果改成下面的代码:

unsigned shrot stmp;

void CFifoDevice::Clear()
{

 for(int k=0; k<5; k++)
{
  for(int i = 0; i < FULL_FIFO_WORDS; i++)
  {
  stmp= (*(unsigned short*)m_virtFIFO);//m_virtFIFO是待读取的虚拟地址
  }
}

}

工作就正常了!

个人猜测,在前一段代码,使用了stmp这个局部变量;编译器发现这个stmp并没有被使用,因此编译时就去掉了这个赋值操作,从而就没有执行实际的赋值操作。对于普通的C++应用程序,这不是问题;但对于驱动程序,这却是致命的!

而后一段代码,由于stmp是全局变量,虽然stmp却是没有被使用,但编译器不会做优化,因此赋值操作正常执行。