找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么C语言 while(1)每执行一段时间后就重新从main函数最开始的地方重新执行?

  [复制链接]
跳转到指定楼层
楼主
ID:752659 发表于 2021-3-21 09:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include "motor.h"
int S1_flag=0;
float dis;
void main()
{
        EN1=1;
        EN2=1;
        dis=0;
        
        while(1)
        {        
                        if(S1==0)
                        {
                                S1_flag=1;
                        }
                        
                        if(S1_flag==1)
                        {
                                        dis = get_distance();
                                        if(dis<20)
                                        {
                                                        motor_retreat();
                                                        delay(800);
                                                        motor_left();
                                                        delay(100);
                                        }
                                        else
                                        {        
                                                        measure_light();
                                       
                                        }
                }
        }
        
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:814525 发表于 2021-3-21 10:27 | 只看该作者
好好去学一下C语言。while本就是判断循环指令,()内值为真就执行循环,()内值为假就退出循环

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:57657 发表于 2021-3-21 10:56 | 只看该作者
看门狗问题或其他干扰,导致芯片频繁复位。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

地板
ID:440728 发表于 2021-3-21 11:19 | 只看该作者
while(1)
{
.....
}
是死循环,一直重复while里面的内容。

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
ID:230742 发表于 2021-3-21 22:56 | 只看该作者
为什么C语言 while(1)每执行一段时间后就重新从main函数最开始的地方重新执行?
我按照我的知识给你重新理解一下这个问题。
有while(1){}就一直循环括号里的内容。如果没有这一句,他也会一直循环main函数里的内容。
单片机内部从有时钟信号开始就按照系统设计好的方式运行。从main开始运行。运行到程序结束,下一个时钟到来就又从main开始运行。这是在保证系统程序区都是空白的情况下。不排除由于外界因素的干扰。
所以要稳定还是要写while(1){}保证程序在可控的范围内运行。
请参考微机原理与接口类底层的书籍。
回复

使用道具 举报

6#
ID:894154 发表于 2021-3-22 08:14 | 只看该作者
定时器  中断 看门狗  都可以从主函数跳出来
回复

使用道具 举报

7#
ID:592807 发表于 2021-3-22 08:27 | 只看该作者
ANT1987 发表于 2021-3-22 08:14
定时器  中断 看门狗  都可以从主函数跳出来

也可能是断电复位
回复

使用道具 举报

8#
ID:752974 发表于 2021-3-22 08:32 | 只看该作者
板凳说的对,这是个死循环,不会无缘无故跳出来的。
回复

使用道具 举报

9#
ID:373843 发表于 2021-3-22 08:48 | 只看该作者
肯定是单片机复位了,考虑一下电机的问题,电机驱动的电流
回复

使用道具 举报

10#
ID:231674 发表于 2021-3-22 12:28 | 只看该作者
单片机复位了 可能是看门狗复位
回复

使用道具 举报

11#
ID:844772 发表于 2021-3-22 12:53 | 只看该作者
我觉得就是单片机复位了,而且是控制电机的,如果电源没有分开,就是很容易让单片机复位的。
回复

使用道具 举报

12#
ID:687403 发表于 2022-5-11 14:02 | 只看该作者
楼主这个问题解决了吗?
回复

使用道具 举报

13#
ID:883242 发表于 2022-5-11 17:39 | 只看该作者
啤酒瓶子老大 发表于 2021-3-21 22:56
为什么C语言 while(1)每执行一段时间后就重新从main函数最开始的地方重新执行?
我按照我的知识给你重新 ...

错,没有while(1)的话,main函数执行到最后,必然会死机。
回复

使用道具 举报

14#
ID:1025765 发表于 2022-5-11 17:53 | 只看该作者
while是先判断表达式的值是否满足要求,在执行语句。
回复

使用道具 举报

15#
ID:824490 发表于 2022-5-11 18:00 | 只看该作者
Hephaestus 发表于 2022-5-11 17:39
错,没有while(1)的话,main函数执行到最后,必然会死机。

当PC指针到了最后,不会返回到0?,比如4K的ROM,PC指针到了0X0FFF,再进一步进到0x1000,因为4K最高地址是0xFFF ,所以PC溢出,自动归0?
回复

使用道具 举报

16#
ID:883242 发表于 2022-5-11 18:15 | 只看该作者
名字不是重点 发表于 2022-5-11 18:00
当PC指针到了最后,不会返回到0?,比如4K的ROM,PC指针到了0X0FFF,再进一步进到0x1000,因为4K最高地址 ...

别做梦了。
回复

使用道具 举报

17#
ID:824490 发表于 2022-5-11 23:40 | 只看该作者

如果是这样,那么就是一个BUG,谨慎表示怀疑。
回复

使用道具 举报

18#
ID:824490 发表于 2022-5-11 23:59 | 只看该作者
本帖最后由 名字不是重点 于 2022-5-12 00:01 编辑

我的理解是,在main中的加入while(1){},是为了让PC在可控的范围内做死循环,如果不加while(1){},则在main()的最后,PC继续+1,则跑出main()的范围,此时的PC将不可控,就是所谓的程序跑飞了。但此时MCU并没有死机,死机与跑飞是两码事,拿人来比喻,死机就是人凉了,跑飞只是精神病发作,还可以抢救一下的(有时还会飞回来)。

呼唤大神来指点一下!

回复

使用道具 举报

19#
ID:824490 发表于 2022-5-12 00:35 | 只看该作者
本帖最后由 名字不是重点 于 2022-5-12 00:38 编辑

#include <reg51.h>
sbit led=P2^1;
void main()
{
  //   while(1)
   {
       led=!led;   //此处断点。
   }
  }

以上这段代码测试过,设完断点后,F5运行,程序还是会在断点处停下。说明单片机没死!只是跑飞了。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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