前些天调试一个蜂鸣器,该蜂鸣器是用方波驱动,由于硬件工程师将其接在一个普通IO上,只能用IO模拟一个方波来测试
板子上跑的是WINCE5的系统,众所周知,在WINCE5中是可以在AP中直接访问物理地址的,于是我用EVC写了一个小的测试代码
调用Test_Beep函数时输入不同的freq即可产生不同频率的波形,但是编译下载程序到平台上测试,发现蜂鸣器根本不响,更改了N个freq值也不行。遂拿了一台示波器测试IO,发现输出的频率根本不随freq变化,检查寄存器值是正确的,很令人费解。后来用DEBUG版本编译下载,居然可以!!后与同事讨论,DEBUG版和RELEASE版对代码优化等级不同,感觉问题是出在Loop函数上,于是尝试将Loop函数修改成:
void Loop(volatile UINT32 time)
{
while(time);
}
再次编译下载执行,就可以了!^^
究其原因,是编译器认为Loop函数只是个空循环,当作无用代码直接优化掉了!!
通过这次问题的排除,又加深了对volatile修饰符的认识,哟西~~,呵呵