DelayMs(Uint16 t)是利用2812定时器进行延时的函数,定时中断每1ms对全局变量timedelay进行减1处理(为0则不减)。当timedelay由t变为0则跳出函数返回。但程序总是停到这个循环里无法跳出。
原函数为:
void DelayMs(Uint16 t)
{
timedelay = t;
while (timedelay != 0) {
}
}
下面是编译结果:
因为timedelay在中断中更改后AL会随中断的返回而进行出栈,所以在比较判断的时候AL的值是不变的,因此函数会陷入死循环。
下图看到timedelay对应的RAM中数据已经为0。
利用 for(timedelay = t; timedelay > 0;){} 也是相同的编译结果。甚至在while(1)中嵌入if (timedelay == 0) ... 也是相同的编译结果。对AL的值不重加裁。
这应当是CCS3.3中28XX DSP编译器的问题,在使用的时候需注意。
可以在while语句的判断条件中加一个额外无用的条件来强迫AL进行一次操作,这样再判断timedelay的时候就会对AL进行重新加载。
如改为
void DelayMs(Uint16 t)
{
timedelay = t;
while (dmtimeren.bit15 == 1 && timedelay != 0) {
}
}
编译结果如下:
可见每次比较前都通过MOV AL,@10对AL进行了更新,当timedelay降到0后可以正常跳出。
|