登录 免费注册 首页 | 行业黑名单 | 帮助
维库电子市场网
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统
驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe

单片机程序必须是个死循环吗?汗。。。。

作者:wxwang 栏目:单片机
单片机程序必须是个死循环吗?汗。。。。
   以前没注意这个问题,今天突然发现单片机程序必须是个死循环!!!
是这样的,我在程序初始化完成后,只有一个打印语句(通过串口)。但我发现程序不停的打印,开始我以为是单片机异常,复位引起的。但一直查不出啥原因,后来我在打印完后加了一个while(1)死循环,这才只打印一次;后来问同事,他说必须是死循环。
  大家说:是这样吗?

2楼: >>参与讨论
tonyhawksp
可能吧,我也不知
....貌失不加while(1)的话,单片机就会执行完后再重新从main开始执行

3楼: >>参与讨论
maychang
单片机程序必须是个死循环吗?
当然了。循环可能大可能小,但一定有一个。

4楼: >>参与讨论
lyjian
我也汗!这么基础的事情都不知道!
 
5楼: >>参与讨论
zhusonglinw
没有死循环能工作那就是真正的智能了!
 
6楼: >>参与讨论
hq_y
主程序也就是后台程序就是一个大循环
 
7楼: >>参与讨论
NE5532
不加循环的叫人脑
 
8楼: >>参与讨论
IC1008
人脑是经常跑飞的
所以才有不能专心做一样事情

9楼: >>参与讨论
wangkj
人脑也是不停的循环
那叫做新陈代谢。
停了的话,上帝就见到你了。

10楼: >>参与讨论
IC1008
那是身体在循环
 
11楼: >>参与讨论
5880527
haha
灌水啦

12楼: >>参与讨论
lypd96
RE:
哈,不循环大不了从头执行

13楼: >>参与讨论
popmu
晕咋撤到人脑:)
 
14楼: >>参与讨论
yewuyi
daoda^
 
15楼: >>参与讨论
keil_
RE
在程序加一条调试语句即可:如while(1);或其它

16楼: >>参与讨论
kcl123
心脏如果停止了,MCU还能工作吗?
 
17楼: >>参与讨论
tqdyx
有一种东西叫睡眠
 
18楼: >>参与讨论
fushaobing
谁说单片机的程序必须是死循环????
“是这样的,我在程序初始化完成后,只有一个打印语句(通过串口)。但我发现程序不停的打印,开始我以为是单片机异常,复位引起的。但一直查不出啥原因,后来我在打印完后加了一个while(1)死循环,这才只打印一次;后来问同事,他说必须是死循环。”
-----------------------------------------------------

你的程序一定是这样写的:
main
{
Initialization;
while(1)
{print;}
}

如果改一下:
main
{
Initialization;
print;
}
它还会一直打印吗?

所以说,单片机的程序不是一定要死循环。你把它写成死循环它就是死循环。你不把它写成死循环,它怎么可能是死循环呢???


19楼: >>参与讨论
maychang
楼上:请好好想想,想通了,再发一帖
 
20楼: >>参与讨论
fushaobing
想不通
楼主可以把程序贴出来看看吗?

21楼: >>参与讨论
农民讲习所
18、20楼的问下:
main
{
Initialization;
print;
}

这个print之后执行什么代码?

22楼: >>参与讨论
maxking
RE:
如果没有死循环,执行完毕后他会自动跳到其他地方,是不固定的。

23楼: >>参与讨论
农民讲习所
对,后面都不是正常代码,乱跑。一般结果会复位重新执行。
 
24楼: >>参与讨论
xwj
也不一定
我们就有机器是没有死循环的:
在满足掉电条件时掉电,
直到被外部事件触发后重新从复位向量开始运行的

这样做不管从功耗还是可靠性角度而言都是有很大好处的

25楼: >>参与讨论
fushaobing
请问楼主用的是什么单片机?
这个问题是不是跟单片机的型号有关?

26楼: >>参与讨论
lyjian
楼上的真逗!
到现在还不知道大家在说什么。

27楼: >>参与讨论
BugKing
看反汇编出来的
看一下 反汇编出来的 就知道了 汇编还是比较清楚的 

28楼: >>参与讨论
王紫豪
同意26楼的,哈
 
29楼: >>参与讨论
hotpower
main()也是任务的一种特例,故需死循环,但也可例外
有的编译器认为main()是个普通的函数,但返回做了加工,直接又回到了main()入口.

不过应该养成习惯.

30楼: >>参与讨论
zhufp
习惯了计算机软件的人都认为死循环不可理解.哎!
 
31楼: >>参与讨论
hq_y
呵呵死循环~~~~~~~~~~~~~~~~~~
小小mcu还能干啥?网游?飞天?
给个死循环跑跑算啦~~~~~~~~
就这点智商还是工程师赋予的
赶上一个蹩脚的工程师还要不断的被狗咬,mcu的悲哀~~~~~~~~

* - 本贴最后修改时间:2006-12-27 9:45:03 修改者:hq_y

32楼: >>参与讨论
fushaobing
26楼,就你聪明?
也许本人表达不恰当,对于“这个问题是不是跟单片机的型号有关?”,我的本意是,不同的单片机用不同的编译器,不同的编译器对main{}函数的处理也可能不一样。存在2能可能:
1.在main{}返回时强制回到main{}的入口;
2.在main{}返回时执行“RET”指令,这时它跳到哪里就跟堆栈有关。

楼主碰到的应该是第二种情况,在执行“RET”指令时,由于堆栈没有被使用,内容是0000H,于是相当于复位了。



33楼: >>参与讨论
农民讲习所
不可能再会到main开始
运行状态不可能再次进行初始化工作,除非.....

34楼: >>参与讨论
HWM
任何一个实用的程序都起码包括一个“无限”循环。
 
35楼: >>参与讨论
农民讲习所
WINDOW、LINUX中都包含着这样的无限循环
 
36楼: >>参与讨论
zhiwei
跟编译器有关
一般嵌入式方面C编译器都是调用mian,系统会定义一个返回点,万一mian执行完毕后就会进入一个真的死循环。我用ICC AVR一段代码给大家参考一下:
    002A D012      RCALL    _main//调用mian
_exit:
    002B CFFF      RJMP    _exit//返回后进入一个死循环。
如果开了看门狗的话系统就会复位!

37楼: >>参与讨论
zusen
如果不循环,你的单片程序执行完后就会执行一条不确定的命令
也就是说,执行了这条不确定的命令后,单片机状态是无法确定,那么整个系统就会蹦馈,会产生严重的后果

38楼: >>参与讨论
IceAge
一定是一个死循环
很简单的道理:因为程序容量有限,而执行时间无限.

认为程序不是死循环,就像认为大地是平的一样,只是因为你站的不够高





39楼: >>参与讨论
HWM
“无限”循环不等于“死”循环!
除非所有的操作都在“中断”中实现,否则的话“死”循环在实用的程序中是不能使用的。一般我们只是把所谓的“死”循环作为“测试”程序的一个“停止”点而已。
在实用的程序中,我们采用的是“无限”循环,其循环体是非空的。


40楼: >>参与讨论
qqq2000
可以不是死循环
启动-操作-切断自己的电源或者进入sleep就可以不是死循环。
现在的倾向,都是不走死循环这条老路,太耗电。

41楼: >>参与讨论
xwj
呵呵,只有qqq2000 一个人的想法和我接近
其他的。。。

思想都被固化了...

42楼: >>参与讨论
农民讲习所
40、41不能这么做
SLEEP是放在循环中的,不能脱离循环。否则致命错误会发生的。

会发生什么?....................................

43楼: >>参与讨论
HWM
40,41:SLEEP?看来是醒不来了。
 
44楼: >>参与讨论
hq_y
SLEEP还是在循环中~~~~~~~~~~~~
然后依靠外部中断或者定时器中断唤醒
然后起来干活
然后再回到sleep
....

设计低功耗系统比较有用

可能对抗干扰也有一些好处~~~~~~~~~~

45楼: >>参与讨论
程序匠人
打多数情况下可以是一个死循环,偶然也可以是多个循环
打多数情况下可以是一个死循环,偶然也可以是多个循环。

每个循环体相当于一个稳定状态,当特定条件触发时,迁跃到另一个循环体中去。有点类似于状态机的概念。

46楼: >>参与讨论
fushaobing
SLEEP还是在循环中
否则,醒来以后就再也睡不着了。
但对于“掉电模式”,好象不是死循环。

47楼: >>参与讨论
xwj
呵呵,说你们思维僵化还不信
除了SLEEP还有PowerDown,
最主要的还是要有SoftReset

并不是每个系统都必须毫不停歇的工作的,很多都有空闲的时候
所以也不必每次都要从上一个点继续的,

既然能够掉电,自然是所有的活都干完了(这是必须的特定条件)
在没事干时关机自然可以排除一切的意外
只要有事时能够足够快的激活响应即可

而下一次事件的触发,我们完全可以看成是一个全新的开始
更是可以排除某些未知BUG的累计影响(比如内存漏洞、碎片)
谁的系统都不敢说绝对没有BUG,而且对于存在的BUG编程者是看不到的



48楼: >>参与讨论
xwj
就好比所长说的I2C操作前先发9个1

既然之前的状态可能是错误的,那我们为什么要接着错误后面继续呢?

我先把它恢复到可控的正确状态,再从头开始岂不更好?

当然,必须得有足够时能间毫不影响的做完这些才行,如果是完全持续的系统,那当然得先保证正常得工作

49楼: >>参与讨论
qqq2000
很多时候可以是外部启动的
搞一个启动电路或者唤醒电路就是了——很多时候就是一个按钮加去抖。
按下去,就启动,干完活,就自己关断了。再按再启动。这也是很常用的设计。还有外部唤醒,也很常用,对于有掉电模式的单片机,完全可以这么干,不搞循环等待。

50楼: >>参与讨论
qqq2000
另外,有些特别的设计,会采用大数有限循环
以前给别人兼职做软件就有做这样的事情,目的是保证产品到使用期限一定会完蛋。

51楼: >>参与讨论
qqq2000
其实想想,说一定要有死循环也没错的
很多工业上单片机控制不能用死循环,做完了事情一定要关机,不然单片机跑飞会出很严重的问题。通常办完事之后发命令切断自己的电源,延时几秒等待关机,延时几秒没有关掉就报警,要求手动关机——当然等待手动关机的部分,一般还是有个死跳。

52楼: >>参与讨论
hotpower
不能唤醒的SLEEP本身就是一个不动的"死循环"
 
53楼: >>参与讨论
IceAge
一定是个死循环
无论用什么样的方式,只要你不把死循环定义为仅仅是狭窄的 while(1) 或者认为无限选环不是死循环。

我以前说过,我的mcu结构基本上是中断唤醒 idle 主程序。从大处看,这也是一种无限的循环:死循环。

无论程序有多少分支或者多少入口,都是在有限数量的循环中死循环。




54楼: >>参与讨论
hotpower
哈哈~~~我最喜欢IceAge的灌溉~~~
 
55楼: >>参与讨论
xwj
哈哈,建议IceAge也当一回尿童
给楼上灌溉灌溉!



56楼: >>参与讨论
mikesullen
18楼可以报考飞行员了。。。
 
57楼: >>参与讨论
fushaobing
楼上什么意思?请赐教!
 
58楼: >>参与讨论
bp596385
晕了,乱侃呀
 
59楼: >>参与讨论
gwnpeter
18楼的,很多编译器对你的进行编译之后还是会循环显示的
另外有一些就不是,废话......................

60楼: >>参与讨论
AIRWILL
好热闹啊
    我咋感觉, 什么都是死循环.

    即使人生也是"死"循环, 地球运动也是个"死"循环, 宇宙也是个"死"循环.

61楼: >>参与讨论
xuetian110
晕!晕!晕!小弟也来讲几句.
存属个人看法:
你的程序一定是这样写的:
main
{
Initialization;
while(1)
{print;}
}
这个程序首先上电初始化,然后进入死循环,一直打印下去.print;他自己在while(1)里面循环;

如果改一下:
main
{
Initialization;
print;
}
这个程序,执行结果也是个死循环,只不过多了个初始化程序,先是Initialization;然后print;他们在主程序main里面循环;
楼上们的UNDERSTAND???????????



62楼: >>参与讨论
sharks
楼上的,结论只能说对了一大半。
  

63楼: >>参与讨论
jerrylay
应该不一定要死循环吧
在完成任务以后,你决定让单片机干什么,用一个while循环可以,进入低功耗模式也可以

64楼: >>参与讨论
hotpower
从宏观上看低功耗模式也在虚拟循环的内部~~~
 
65楼: >>参与讨论
fpga2006
都是死循环吧 不循环工作一遍就拉到了 那不是一次性的单片机了
 
66楼: >>参与讨论
gangqun
进入Main()以后就不应该跳出来
 
67楼: >>参与讨论
nlgz
看不懂啦 18楼的
看不懂啦 18楼写的 没有循环啊?
难道 我们写了若干年程序都错了

68楼: >>参与讨论
nlgz
如果程序指针不受控制的话最终也是一种死循环啊
如果程序指针不受控制的话最终也是一种死循环啊 更何况从程序控制的角度看 我们应用程序 一定要控制它的出口在预期范围内 实际也是一种死循环啊(只不过可能有多个分支任务参与).

69楼: >>参与讨论
NE5532
再说两句
main不一定是退出后再回来

有的单片机自动在main后面加死循环

例如

汇编启动函数

boot:

......省略部分

rjmp _c_start_up

void c_start_up (void)
{
main(void);
for(;;);     //自动加入死循环
}

void main (void)
{
             //这才是你的函数
}

另外搞PC软件,不理解死循环的,是因为你的函数返回后把CPU交给了操作系统(windows),他自己就是死循环。

70楼: >>参与讨论
fushaobing
很抱歉!
对于“18楼”的回贴,是本人理解错误。
;=================================================================
fushaobing 发表于 2006-12-26 14:39 侃单片机 ←返回版面    

18楼: 谁说单片机的程序必须是死循环????

“是这样的,我在程序初始化完成后,只有一个打印语句(通过串口)。但我发现程序不停的打印,开始我以为是单片机异常,复位引起的。但一直查不出啥原因,后来我在打印完后加了一个while(1)死循环,这才只打印一次;后来问同事,他说必须是死循环。”
-----------------------------------------------------

你的程序一定是这样写的:
main
{
Initialization;
while(1)
{print;}
}

如果改一下:
main
{
Initialization;
print;
}
它还会一直打印吗?

所以说,单片机的程序不是一定要死循环。你把它写成死循环它就是死循环。你不把它写成死循环,它怎么可能是死循环呢???
;==================================================================


我后来跟同事讨论后,得到的结论如下:
;================================================================
fushaobing 发表于 2006-12-27 10:06 侃单片机 ←返回版面    

32楼: 26楼,就你聪明?

也许本人表达不恰当,对于“这个问题是不是跟单片机的型号有关?”,我的本意是,不同的单片机用不同的编译器,不同的编译器对main{}函数的处理也可能不一样。存在2能可能:
1.在main{}返回时强制回到main{}的入口;
2.在main{}返回时执行“RET”指令,这时它跳到哪里就跟堆栈有关。

楼主碰到的应该是第二种情况,在执行“RET”指令时,由于堆栈没有被使用,内容是0000H,于是相当于复位了。
;=================================================================


71楼: >>参与讨论
xhuboy

整个主程序当然得是一个死循环啦. 是不是玩多了电脑程序,不知道51了

72楼: >>参与讨论
5880527
C8051F好象可以不要的
我觉得主程序是死循环的说法没错,但有C8051F就好象可以不要死循环,把内外部的振荡都禁止就可以了,它就死那里了,但不知道这样做有什么用

73楼: >>参与讨论
conwh
口水帖也这么红?人生也是一个循环,这还有疑问?
 
74楼: >>参与讨论
5880527
呵呵
人生的循环次数和单片机一样,也有使用寿命的,到时候就再也不能RET了,复位电路也起不了作用了

75楼: >>参与讨论
mxinfa
应该是死循环的
在PC机上写程序为什么没有死循环?那是因为程序执行完了之后操作系统给接收了,而操作系统本身就是一个更大的死循环而已
在单片机上没有操作系统你程序执行完了去哪里?就这么简单
同意楼上的忘了几楼的一句话,无限循环不等于死循环

76楼: >>参与讨论
mikesullen
什么叫循环??
主要是大家对概念的理解不同,再争也没有意义。。。。
C语言层面和汇编层面对循环去理解也是不同的。。
但如果从MCU内部结构上去讲,就会统一些,程序的执行会伴随着PC指针的变化,PC指针的变化一般是在程序空间内,这个程序空间有可能是用户写的代码区,也可能是空白区,对于一个MCU而言,这个空间是有限的,在有限的空间内PC指针只能是一种循环。。。
sleep只是MCU的一种状态,此时的PC指针不动,但sleep被唤醒后,程序还是要继续跑的,PC指针还是要在程序空间内的。。
reset可以理解为一种特别的中断,它产生之后的程序也是要继续跑的,PC指针也是要在程序空间内的。。
至于楼上所说的切断自己的电源,如果是MCU内部的电源,那也只是一种暂态,暂态只是整个循环过程的一个节点。如果是MCU外部的电源,那已经脱离MCU层面了,而是一个小的系统了。。。那就扯的更远了。。

关键是理解内在,活学活用。。。

77楼: >>参与讨论
suud
20楼,估计你是误解了楼主的意思
 

* - 本贴最后修改时间:2007-1-4 14:00:02 修改者:suud

78楼: >>参与讨论
被磁化的铁
_
放一个死循环缠着大循环就好了.


在KEIL编译器里面好像是返回到地址00.

  C:0x0000    020003   LJMP     C:0003
  C:0x0003    787F     MOV      R0,#0x7F
  C:0x0005    E4       CLR      A
  C:0x0006    F6       MOV      @R0,A
  C:0x0007    D8FD     DJNZ     R0,C:0006
  C:0x0009    758107   MOV      SP(0x81),#0x07
  C:0x000C    02000F   LJMP     main(C:000F)
     2: void main(void)
->C:0x000F    22       RET      
  C:0x0010    00       NOP      
  C:0x0011    00       NOP      
  C:0x0012    00       NOP      
  C:0x0013    00       NOP      
  C:0x0014    00       NOP      

* - 本贴最后修改时间:2007-1-4 21:37:27 修改者:被磁化的铁

79楼: >>参与讨论
aekin
好像有种无穷不循环小数。
 
80楼: >>参与讨论
tqdyx
76楼正解
有些事真的很无聊

81楼: >>参与讨论
heroying
循环是后台
循环是后台,就和地球绕太阳循环不惜的转没区别。我们还是照样生活,循环是一定的,有大有小,大到你感觉不到而已!

82楼: >>参与讨论
blackson
我也有点想不通这类问题啊
应该是:
    你把程序设置为死循环时,它就是死循环,会不停的打印.
    你把程序设置为顺序执行,没有死循环时,就打印一次,不再打印.
从单片机的工作上可以认为必须设置为死循环,才能不停的工作,检测某些状态什么的,但是从原理上来说,不考虑实际工作的话,我认为,单片机不一定非要设置为死循环,可以就打印那么一次嘛,对吗?

83楼: >>参与讨论
战地记者
不解啊 这循环  一头的雾水
 
84楼: >>参与讨论
hq_y
不一定非要设置为死循环,实际上也是在原地踏步
然后在中断中处理所有的事情!
但是不是所有的程序都是可以这样编写的;

85楼: >>参与讨论
leezongfan
18楼的为什么还想不明白呢。
 
86楼: >>参与讨论
bootload
呵呵,不是死循环就不是一个系统
这个,我大学三年级就明白,哈哈

87楼: >>参与讨论
木子
菜鸟真多,唉,还什么死不死的
参与讨论
昵称:
讨论内容:
 
 
相关帖子
某一时刻让16个数码管同时亮用什么驱动呢
请教大家了
我读写AT45DB041B的BUFFER1出现怪问题。
按键去抖
大家帮忙分析我的项目的可行性
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入


Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号