标题: CCS3.3下28XXDSP代码编译问题 [打印本页]

作者: liuyy    时间: 2015-1-13 00:15
标题: CCS3.3下28XXDSP代码编译问题
CCS3.3下28XXDSP代码编译问题
    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后可以正常跳出。                                                                                             

作者: 小_天_王    时间: 2015-4-28 19:18
你好,我也出现这个问题,但我的是中断进不去,用了你的方法也不太行,请问还有其他的方法没有
作者: 小_天_王    时间: 2015-4-28 19:25
我是通过在中断中改变值,然后在主函数中判断该值来执行相应程序




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1