找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3429|回复: 2
打印 上一主题 下一主题
收起左侧

CCS3.3下28XXDSP代码编译问题

[复制链接]
跳转到指定楼层
楼主
ID:72008 发表于 2015-1-13 00:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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后可以正常跳出。                                                                                             
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:78358 发表于 2015-4-28 19:18 | 只看该作者
你好,我也出现这个问题,但我的是中断进不去,用了你的方法也不太行,请问还有其他的方法没有
回复

使用道具 举报

板凳
ID:78358 发表于 2015-4-28 19:25 | 只看该作者
我是通过在中断中改变值,然后在主函数中判断该值来执行相应程序
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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