24469|30

6366

帖子

4917

TA的资源

版主

楼主
 

关于单片机主程序中while(1)循环的作用的验证 [复制链接]

起因:最近在学习proteus,在最开始编写仿真实例的源程序文件时,为了省事,就没有在主程序中加入while(1)这个无限循环(或者成为死循环)。但是在进行仿真延时的时候,无意间发现程序走到最后并不会停下来,而是会去干一些别的没有让它做的事情。于是决定对此稍作研究。

行动:于是开始验证之旅,编写了一个简单的程序,程序功能是:在主程序开始后,通过对P0口赋予不同的值,实现P0口上的8个LED从低位到高位顺序点亮,点亮第8位LED以后,结束程序。但是后面没有加while(1)这个空循环。

然后在proteus中创建一个基于本程序的电路仿真文件,启动仿真。观察运行结果。

结果是:8个LED从低位依次被点亮,点亮到第8个LED时,此时程序已经结束。按理说程序最后的结果应该是一直保持第8个LED被点亮的状态。但是恰恰相反,在第8位LED被点亮后,接下来,第一位LED被点亮了,然后其余的LED也被顺序点亮了。接下来这8位LED就一直处于循环点亮的状态,呵呵,相当于流水灯的效果了。
接着在程序最后加上while(1)这个无限循环,LED从第一位开始被依次点亮,到第8个LED被点亮后,就不再发生变化了。


结论:如果主程序中没有while(1)这个无限循环,程序走到最后会再次从头开始执行。
          如果主程序有while(1)这个无限循环,程序走到最后会一直在这个死循环中运行,不会出现再从头执行的情况。


记得在有些资料中看过这样一句话:据未经验证的说法,在51单片机的C语言程序中,如果主程序中没有while(1)这个无限循环,程序将会从头再次执行

分析:1、有可能是软件仿真存在的缺陷,实际的单片机系统中不会出现这样的情况;
              2、这种情况是真实存在的,跟采用软仿无关。

佐证:由于手头没有51学习板,所以拿来一块AVR学习板验证,验证结果是:程序走到最后以后,没有出现从头执行的情况

讨论:大家来说说,我在软仿中出现的这种情况是软仿这个软件的问题,还是本身就会有这样的问题。


附:我的程序和软仿的电路图
//51单片机主程序中while(1)无限循环(死循环)效果演示
#include
void delay(void)
{
  unsigned char i,j;
for(i = 0;i < 252;i++)
  for(j = 0;j < 252;j++);
}
void main(void)
{
  P0 = 0xfe;   //实现依次点亮P0口的8个LED
delay();
delay();
P0 = 0xfd;
delay();
delay();
P0 = 0xfb;
delay();
delay();
P0 = 0xf7;
delay();
delay();
P0 = 0xef;
delay();
delay();
P0 = 0xdf;
delay();
delay();
P0 = 0xbf;
delay();
delay();
P0 = 0x7f;
delay();
delay();
/*
while(1)
{
  }
  */
}


此帖出自单片机论坛

最新回复

今天我也产生了这个疑问,百度一下,找到这个帖子了,哈哈~ 不加while(1);在许多情况下是会重复执行的。我今天的这个程序是鲜活的例证=。=  详情 回复 发表于 2012-6-13 17:16
点赞 关注
 

回复
举报

2955

帖子

0

TA的资源

纯净的硅(初级)

沙发
 
我觉得应该是软件仿真的问题,实践中不会这么走的
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
个人签名不断地学习,才会有创新!
淘宝小店:手机、qq点卡、游戏点卡自动充值 http://shop63727265.taobao.com/
 

回复

464

帖子

0

TA的资源

五彩晶圆(高级)

板凳
 
确实啊,没有while 程序,程序执行一遍就exit了
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
个人签名气力
 
 

回复

2771

帖子

0

TA的资源

裸片初长成(中级)

4
 
是不是你修改了原程序,忘记编译了
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

6366

帖子

4917

TA的资源

版主

5
 
原帖由 jxb01033016 于 2010-1-28 08:16 发表
是不是你修改了原程序,忘记编译了


呵呵,不是忘记编译了

而是我特意来验证这个问题。我用的是上面粘贴的程序。在加while(1)和不加while(1)的时候,程序执行结果完全不同。

我的目的就是验证那个while(1)的作用。
此帖出自单片机论坛
 
 
 

回复

157

帖子

0

TA的资源

纯净的硅(初级)

6
 

回复 楼主 tiankai001 的帖子

曾在51上做过测试,如果程序不是superloop,跑了一遍后就复位重新开始了。
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

255

帖子

0

TA的资源

五彩晶圆(初级)

7
 
lz 探索的精神 值得大家学习
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
个人签名每天进步一点点
 
 

回复

31

帖子

0

TA的资源

一粒金砂(中级)

8
 
没试过 觉得写程序要有良好的习惯,有始有终
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

9
 
呵呵,你遇到了典型的编译器优化问题。你应该在WHILE中加入空指令
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

1759

帖子

0

TA的资源

裸片初长成(高级)

10
 
程序在while(1)执行了死循环,一直在这里运行,不会运行到其他地方了。因而不会执行上面的程序。如果将上面的程序放在while(1)里面运行,就可以了。
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
个人签名南京璞晓电子   www.cpx0.com需要
msn:njlianjian@hotmail.com
 
 

回复
redstone9910 该用户已被删除
11
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

277

帖子

0

TA的资源

五彩晶圆(中级)

12
 
我的猜测,不知道对不对。
在51中,空的程序存储器内容为0xff,没有加结束语句的话,执行到最后,继续执行0XFF,好象是个什么返回语句吧。返回后,执行的结果就难说了。但你加上“流水灯”之后,这段程序有可能会被完整的运行下去,所以就是你看到的这个现象了。
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

97

帖子

0

TA的资源

纯净的硅(初级)

13
 
没重头执行是在正常的,如果重头执行了,那说明出了问题,你那里的循环语句不是被注释掉了吗?还会执行?主函数,没有循环体,不可能重头执行!
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

986

帖子

0

TA的资源

五彩晶圆(初级)

14
 

回复 楼主 tiankai001 的帖子

增加while(1)确保程序在while语句循等待。
不加while(1)程序要调用exit()函数,exit()在不同编译器实现方法也不同,运行结果不确定。
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
个人签名电子工程师技术交流QQ群:12425841,专注于自动控制、数字电源等
 
 

回复

394

帖子

0

TA的资源

一粒金砂(高级)

15
 
程序的执行得看PC指向的空间的内容,无论是51还是arm==,控制器系列,都有一个地址计数器,实行累加操作,51的为8位机字节累加每次地址增1,复位为pc=0000h,堆栈RAM指针sp=07H,按51的中断向量空间地址分配来看,pc=0000h为复位后的程序入口。也就是只要你的pc指针的内容为00,就会发生复位情况,这也就是大内高手们发明的在空白区填充00,可以起到看门狗的疗效的原理。
至于楼主出现复位的情况,个人觉得是一种偶然,要不就是编译器优化啦,程序怎么跑是由你代码执行完毕pc的下个地址的内容决定的,当你没有代码去填充程序存储器,这个区间的数据是全00,FF或是随机的得自己去看看具体的手册,因为这个区间的数据的不确定导致你代码的执行也不确定。
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

2130

帖子

0

TA的资源

五彩晶圆(中级)

16
 
有些51芯片有指针清零,有的没有,有的会跳转,没有的不会跳转。你看下编译产生的汇编代码就知道了
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

196

帖子

0

TA的资源

五彩晶圆(中级)

17
 
个人认为应该是执行完一遍就停止运行了
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

56

帖子

0

TA的资源

一粒金砂(高级)

18
 
手头正好有块实验板,STC11F32XE,keil编译环境,lz的程序,下载后,运行现象与仿真相同,相当于流水灯的效果。
然后将keil自动生成的汇编语言文件,加入到工程中,下载后,运行则8个LED从低位依次被点亮,点亮到第8个LED时,此时程序已经结束。
有点小惊喜啊,呵呵,看来汇编语言还是比较牛叉啊
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
 
 

回复

1781

帖子

0

TA的资源

五彩晶圆(中级)

19
 
原则上来讲,如果程序中没有加结尾的话,程序计数器会继续累加,从而执行正常程序后面的ROM空间里面的指令,不过一般这个指令都是0XFF,这就要看这条指令的含义了,如果是空的话就会一直执行到最后,直到程序计数器溢出,只是不知道程序计数器发生溢出是一个什么状态,有可能回到复位状态值,也有可能直接就让单片机死在这里不工作,这个就要看单片机的具体设计了。
此帖出自单片机论坛

赞赏

1

查看全部赞赏

 
个人签名只有求知欲,没有求偶欲的人是植物,只有求偶欲,没有求知欲的人叫动物,既没求知欲,又没求偶欲的人是矿物。
 
 

回复

18

帖子

0

TA的资源

一粒金砂(中级)

20
 
无语!
此帖出自单片机论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表