[STC单片机] 求助一条非常简单又非常奇怪的代码

[复制链接]
1632|9
 楼主| spawml 发表于 2017-9-20 22:18 | 显示全部楼层 |阅读模式
unsigned int pulleyt1,pulleyt2;
if((pulleyt1>500)||(pulleyt2>500))
{
   pulleyt1=0;
   pulleyt2=0;
    处理程序
}
pulleyt1和pulleyt2两个变量定义为16位无符号数,在定时器里自加,加到500毫秒进入这个逻辑或代码,奇怪的是经常是256毫秒就进入了,很怪异                                                                                                                                                                         
hxfxt 发表于 2017-9-21 08:33 | 显示全部楼层
只能说明多加的6,单片机在干其他事情,还没来得及处理你上面这段程序
gangdou 发表于 2017-9-21 08:44 | 显示全部楼层
本帖最后由 gangdou 于 2017-9-21 08:56 编辑

51是吧。16位运算不是一条指令完成的,运行到if((pulleyt1>500)||(pulleyt2>500))这里时发生中断就会出问题了,而且肯定是发生在低8位进位时。看看反汇编文件就知道了。  举个解决例子:
while(1){
          。。。
         int temp;
        {
                temp = int_value;        ;这条语句汇编后有好几条语句,期间可能发生中断而使temp!=int_value
        }while(temp!=int_value);                ;这样处理保证下面要处理的int_value正常。
       。。。
        }

评分

参与人数 2威望 +11 收起 理由
spawml + 1 很给力!
xyz549040622 + 10 很给力!

查看全部评分

xyz549040622 发表于 2017-9-21 09:59 | 显示全部楼层
gangdou 发表于 2017-9-21 08:44
51是吧。16位运算不是一条指令完成的,运行到if((pulleyt1>500)||(pulleyt2>500))这里时发生中断就会出问题 ...

这个非常有可能,可是也太巧了,还有一个办法,这个处理放在中断中。或者处理的时候关闭中断。
ningling_21 发表于 2017-9-21 10:14 | 显示全部楼层
楼上正解
gangdou 发表于 2017-9-21 11:05 | 显示全部楼层
xyz549040622 发表于 2017-9-21 09:59
这个非常有可能,可是也太巧了,还有一个办法,这个处理放在中断中。或者处理的时候关闭中断。 ...

不是太巧,程序长时间运行,是一定会的。我同事也碰到过同样的情况。所以8位机都要考虑到这个情况,可以认为是任务同步问题。
zjut_zone 发表于 2017-9-21 13:54 | 显示全部楼层
山东电子小菜鸟 发表于 2017-9-21 17:23 | 显示全部楼层
你这个判断是在中断中的吗
 楼主| spawml 发表于 2017-9-21 21:21 | 显示全部楼层
非常感谢xyz549040622,问题解决了。
判断是在主循环中的
ddllxxrr 发表于 2017-9-22 09:04 | 显示全部楼层
还有第二个变量,因为,它们之间是或的关系,是不是它影响的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

36

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部