打印
[STC单片机]

求助一条非常简单又非常奇怪的代码

[复制链接]
1153|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))这里时发生中断就会出问题 ...

这个非常有可能,可是也太巧了,还有一个办法,这个处理放在中断中。或者处理的时候关闭中断。

使用特权

评论回复
5
ningling_21| | 2017-9-21 10:14 | 只看该作者
楼上正解

使用特权

评论回复
6
gangdou| | 2017-9-21 11:05 | 只看该作者
xyz549040622 发表于 2017-9-21 09:59
这个非常有可能,可是也太巧了,还有一个办法,这个处理放在中断中。或者处理的时候关闭中断。 ...

不是太巧,程序长时间运行,是一定会的。我同事也碰到过同样的情况。所以8位机都要考虑到这个情况,可以认为是任务同步问题。

使用特权

评论回复
7
zjut_zone| | 2017-9-21 13:54 | 只看该作者
Mark

使用特权

评论回复
8
山东电子小菜鸟| | 2017-9-21 17:23 | 只看该作者
你这个判断是在中断中的吗

使用特权

评论回复
9
spawml|  楼主 | 2017-9-21 21:21 | 只看该作者
非常感谢xyz549040622,问题解决了。
判断是在主循环中的

使用特权

评论回复
10
ddllxxrr| | 2017-9-22 09:04 | 只看该作者
还有第二个变量,因为,它们之间是或的关系,是不是它影响的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

36

帖子

0

粉丝