文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>编译器和局部变量惹的祸:驱动开发中读片选的问题

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

时间:2011-06-12  来源:keeppoised

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却是没有被使用,但编译器不会做优化,因此赋值操作正常执行。

相关阅读 更多 +
排行榜 更多 +
耶小兔子2

耶小兔子2

休闲益智 下载
nba2k20豪华版

nba2k20豪华版

体育竞技 下载
画线征服火柴人安卓版

画线征服火柴人安卓版

动作格斗 下载