编译器和局部变量惹的祸:驱动开发中读片选的问题
时间: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却是没有被使用,但编译器不会做优化,因此赋值操作正常执行。