请选择 进入手机版 | 继续访问电脑版

EDABOSS电子论坛

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 963|回复: 0

[咨询求助] CCS3.3下28XXDSP代码编译问题

[复制链接]

24

主题

1

回帖

243

E币

技术员

Rank: 2

积分
49
发表于 2017-4-19 15:50:22 | 显示全部楼层 |阅读模式
CCS3.3下28XXDSP代码编译问题
    DelayMs(Uint16 t)是利用2812定时器进行延时的函数,定时中断每1ms对全局变量timedelay进行减1处理(为0则不减)。当timedelay由t变为0则跳出函数返回。但程序总是停到这个循环里无法跳出。
    原函数为:
void DelayMs(Uint16 t)
{
timedelay = t;
while (timedelay != 0) {
}
}
    下面是编译结果:
511216291557747.jpg

    因为timedelay在中断中更改后AL会随中断的返回而进行出栈,所以在比较判断的时候AL的值是不变的,因此函数会陷入死循环。
    下图看到timedelay对应的RAM中数据已经为0。
511216301554231.jpg




    利用 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) {
}
}
    编译结果如下:
511216311520754.jpg


    可见每次比较前都通过MOV AL,@10对AL进行了更新,当timedelay降到0后可以正常跳出。
积分规则
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|EDABOSS电子论坛

GMT+8, 2024-4-16 22:33 , Processed in 0.060528 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表