|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
單片機(jī)程序必須是個(gè)死循環(huán)嗎?汗。。。。 |
| 作者:wxwang 欄目:單片機(jī) |
以前沒注意這個(gè)問題,今天突然發(fā)現(xiàn)單片機(jī)程序必須是個(gè)死循環(huán)!! 是這樣的,我在程序初始化完成后,只有一個(gè)打印語句(通過串口)。但我發(fā)現(xiàn)程序不停的打印,開始我以為是單片機(jī)異常,復(fù)位引起的。但一直查不出啥原因,后來我在打印完后加了一個(gè)while(1)死循環(huán),這才只打印一次;后來問同事,他說必須是死循環(huán)。 大家說:是這樣嗎? |
| 2樓: | >>參與討論 |
| 作者: tonyhawksp 于 2006/12/25 16:17:00 發(fā)布:
可能吧,我也不知 ....貌失不加while(1)的話,單片機(jī)就會(huì)執(zhí)行完后再重新從main開始執(zhí)行 |
|
| 3樓: | >>參與討論 |
| 作者: maychang 于 2006/12/25 17:50:00 發(fā)布:
單片機(jī)程序必須是個(gè)死循環(huán)嗎? 當(dāng)然了。循環(huán)可能大可能小,但一定有一個(gè)。 |
|
| 4樓: | >>參與討論 |
| 作者: lyjian 于 2006/12/25 18:04:00 發(fā)布:
我也汗!這么基礎(chǔ)的事情都不知道! |
|
| 5樓: | >>參與討論 |
| 作者: zhusonglinw 于 2006/12/25 18:47:00 發(fā)布:
沒有死循環(huán)能工作那就是真正的智能了! |
|
| 6樓: | >>參與討論 |
| 作者: hq_y 于 2006/12/25 18:57:00 發(fā)布:
主程序也就是后臺(tái)程序就是一個(gè)大循環(huán) |
|
| 7樓: | >>參與討論 |
| 作者: NE5532 于 2006/12/25 18:58:00 發(fā)布:
不加循環(huán)的叫人腦 |
|
| 8樓: | >>參與討論 |
| 作者: IC1008 于 2006/12/25 19:12:00 發(fā)布:
人腦是經(jīng)常跑飛的 所以才有不能專心做一樣事情 |
|
| 9樓: | >>參與討論 |
| 作者: wangkj 于 2006/12/25 19:43:00 發(fā)布:
人腦也是不停的循環(huán) 那叫做新陳代謝。 停了的話,上帝就見到你了。 |
|
| 10樓: | >>參與討論 |
| 作者: IC1008 于 2006/12/25 19:48:00 發(fā)布:
那是身體在循環(huán) |
|
| 11樓: | >>參與討論 |
| 作者: 5880527 于 2006/12/25 20:26:00 發(fā)布:
haha 灌水啦 |
|
| 12樓: | >>參與討論 |
| 作者: lypd96 于 2006/12/26 8:29:00 發(fā)布:
RE: 哈,不循環(huán)大不了從頭執(zhí)行 |
|
| 13樓: | >>參與討論 |
| 作者: popmu 于 2006/12/26 8:43:00 發(fā)布:
暈咋撤到人腦:) |
|
| 14樓: | >>參與討論 |
| 作者: yewuyi 于 2006/12/26 9:14:00 發(fā)布:
daoda^ |
|
| 15樓: | >>參與討論 |
| 作者: keil_ 于 2006/12/26 9:14:00 發(fā)布:
RE 在程序加一條調(diào)試語句即可:如while(1);或其它 |
|
| 16樓: | >>參與討論 |
| 作者: kcl123 于 2006/12/26 9:37:00 發(fā)布:
心臟如果停止了,MCU還能工作嗎? |
|
| 17樓: | >>參與討論 |
| 作者: tqdyx 于 2006/12/26 13:16:00 發(fā)布:
有一種東西叫睡眠 |
|
| 18樓: | >>參與討論 |
| 作者: fushaobing 于 2006/12/26 14:39:00 發(fā)布:
誰說單片機(jī)的程序必須是死循環(huán)???? “是這樣的,我在程序初始化完成后,只有一個(gè)打印語句(通過串口)。但我發(fā)現(xiàn)程序不停的打印,開始我以為是單片機(jī)異常,復(fù)位引起的。但一直查不出啥原因,后來我在打印完后加了一個(gè)while(1)死循環(huán),這才只打印一次;后來問同事,他說必須是死循環(huán)! ----------------------------------------------------- 你的程序一定是這樣寫的: main { Initialization; while(1) {print;} } 如果改一下: main { Initialization; print; } 它還會(huì)一直打印嗎? 所以說,單片機(jī)的程序不是一定要死循環(huán)。你把它寫成死循環(huán)它就是死循環(huán)。你不把它寫成死循環(huán),它怎么可能是死循環(huán)呢??? |
|
| 19樓: | >>參與討論 |
| 作者: maychang 于 2006/12/26 16:28:00 發(fā)布:
樓上:請(qǐng)好好想想,想通了,再發(fā)一帖 |
|
| 20樓: | >>參與討論 |
| 作者: fushaobing 于 2006/12/26 16:51:00 發(fā)布:
想不通 樓主可以把程序貼出來看看嗎? |
|
| 21樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2006/12/26 16:56:00 發(fā)布:
18、20樓的問下: main { Initialization; print; } 這個(gè)print之后執(zhí)行什么代碼? |
|
| 22樓: | >>參與討論 |
| 作者: maxking 于 2006/12/26 17:04:00 發(fā)布:
RE: 如果沒有死循環(huán),執(zhí)行完畢后他會(huì)自動(dòng)跳到其他地方,是不固定的。 |
|
| 23樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2006/12/26 17:08:00 發(fā)布:
對(duì),后面都不是正常代碼,亂跑。一般結(jié)果會(huì)復(fù)位重新執(zhí)行。 |
|
| 24樓: | >>參與討論 |
| 作者: xwj 于 2006/12/26 17:10:00 發(fā)布:
也不一定 我們就有機(jī)器是沒有死循環(huán)的: 在滿足掉電條件時(shí)掉電, 直到被外部事件觸發(fā)后重新從復(fù)位向量開始運(yùn)行的 這樣做不管從功耗還是可靠性角度而言都是有很大好處的 |
|
| 25樓: | >>參與討論 |
| 作者: fushaobing 于 2006/12/26 17:18:00 發(fā)布:
請(qǐng)問樓主用的是什么單片機(jī)? 這個(gè)問題是不是跟單片機(jī)的型號(hào)有關(guān)? |
|
| 26樓: | >>參與討論 |
| 作者: lyjian 于 2006/12/26 17:58:00 發(fā)布:
樓上的真逗! 到現(xiàn)在還不知道大家在說什么。 |
|
| 27樓: | >>參與討論 |
| 作者: BugKing 于 2006/12/26 20:25:00 發(fā)布:
看反匯編出來的 看一下 反匯編出來的 就知道了 匯編還是比較清楚的 |
|
| 28樓: | >>參與討論 |
| 作者: 王紫豪 于 2006/12/27 5:23:00 發(fā)布:
同意26樓的,哈 |
|
| 29樓: | >>參與討論 |
| 作者: hotpower 于 2006/12/27 6:20:00 發(fā)布:
main()也是任務(wù)的一種特例,故需死循環(huán),但也可例外 有的編譯器認(rèn)為main()是個(gè)普通的函數(shù),但返回做了加工,直接又回到了main()入口. 不過應(yīng)該養(yǎng)成習(xí)慣. |
|
| 30樓: | >>參與討論 |
| 作者: zhufp 于 2006/12/27 9:35:00 發(fā)布:
習(xí)慣了計(jì)算機(jī)軟件的人都認(rèn)為死循環(huán)不可理解.哎! |
|
| 31樓: | >>參與討論 |
| 作者: hq_y 于 2006/12/27 9:44:00 發(fā)布:
呵呵死循環(huán)~~~~~~~~~~~~~~~~~~ 小小mcu還能干啥?網(wǎng)游?飛天? 給個(gè)死循環(huán)跑跑算啦~~~~~~~~ 就這點(diǎn)智商還是工程師賦予的 趕上一個(gè)蹩腳的工程師還要不斷的被狗咬,mcu的悲哀~~~~~~~~ * - 本貼最后修改時(shí)間:2006-12-27 9:45:03 修改者:hq_y |
|
| 32樓: | >>參與討論 |
| 作者: fushaobing 于 2006/12/27 10:06:00 發(fā)布:
26樓,就你聰明? 也許本人表達(dá)不恰當(dāng),對(duì)于“這個(gè)問題是不是跟單片機(jī)的型號(hào)有關(guān)?”,我的本意是,不同的單片機(jī)用不同的編譯器,不同的編譯器對(duì)main{}函數(shù)的處理也可能不一樣。存在2能可能: 1.在main{}返回時(shí)強(qiáng)制回到main{}的入口; 2.在main{}返回時(shí)執(zhí)行“RET”指令,這時(shí)它跳到哪里就跟堆棧有關(guān)。 樓主碰到的應(yīng)該是第二種情況,在執(zhí)行“RET”指令時(shí),由于堆棧沒有被使用,內(nèi)容是0000H,于是相當(dāng)于復(fù)位了。 |
|
| 33樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2006/12/27 10:23:00 發(fā)布:
不可能再會(huì)到main開始 運(yùn)行狀態(tài)不可能再次進(jìn)行初始化工作,除非..... |
|
| 34樓: | >>參與討論 |
| 作者: HWM 于 2006/12/27 10:35:00 發(fā)布:
任何一個(gè)實(shí)用的程序都起碼包括一個(gè)“無限”循環(huán)。 |
|
| 35樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2006/12/27 10:38:00 發(fā)布:
WINDOW、LINUX中都包含著這樣的無限循環(huán) |
|
| 36樓: | >>參與討論 |
| 作者: zhiwei 于 2006/12/27 13:06:00 發(fā)布:
跟編譯器有關(guān) 一般嵌入式方面C編譯器都是調(diào)用mian,系統(tǒng)會(huì)定義一個(gè)返回點(diǎn),萬一mian執(zhí)行完畢后就會(huì)進(jìn)入一個(gè)真的死循環(huán)。我用ICC AVR一段代碼給大家參考一下: 002A D012 RCALL _main//調(diào)用mian _exit: 002B CFFF RJMP _exit//返回后進(jìn)入一個(gè)死循環(huán)。 如果開了看門狗的話系統(tǒng)就會(huì)復(fù)位! |
|
| 37樓: | >>參與討論 |
| 作者: zusen 于 2006/12/27 16:59:00 發(fā)布:
如果不循環(huán),你的單片程序執(zhí)行完后就會(huì)執(zhí)行一條不確定的命令 也就是說,執(zhí)行了這條不確定的命令后,單片機(jī)狀態(tài)是無法確定,那么整個(gè)系統(tǒng)就會(huì)蹦饋,會(huì)產(chǎn)生嚴(yán)重的后果 |
|
| 38樓: | >>參與討論 |
| 作者: IceAge 于 2006/12/28 0:02:00 發(fā)布:
一定是一個(gè)死循環(huán) 很簡單的道理:因?yàn)槌绦蛉萘坑邢,而?zhí)行時(shí)間無限. 認(rèn)為程序不是死循環(huán),就像認(rèn)為大地是平的一樣,只是因?yàn)槟阏镜牟粔蚋?br> |
|
| 39樓: | >>參與討論 |
| 作者: HWM 于 2006/12/28 8:43:00 發(fā)布:
“無限”循環(huán)不等于“死”循環(huán)! 除非所有的操作都在“中斷”中實(shí)現(xiàn),否則的話“死”循環(huán)在實(shí)用的程序中是不能使用的。一般我們只是把所謂的“死”循環(huán)作為“測(cè)試”程序的一個(gè)“停止”點(diǎn)而已。 在實(shí)用的程序中,我們采用的是“無限”循環(huán),其循環(huán)體是非空的。 |
|
| 40樓: | >>參與討論 |
| 作者: qqq2000 于 2006/12/28 9:31:00 發(fā)布:
可以不是死循環(huán) 啟動(dòng)-操作-切斷自己的電源或者進(jìn)入sleep就可以不是死循環(huán)。 現(xiàn)在的傾向,都是不走死循環(huán)這條老路,太耗電。 |
|
| 41樓: | >>參與討論 |
| 作者: xwj 于 2006/12/28 9:40:00 發(fā)布:
呵呵,只有qqq2000 一個(gè)人的想法和我接近 其他的。。。 思想都被固化了... |
|
| 42樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2006/12/28 9:43:00 發(fā)布:
40、41不能這么做 SLEEP是放在循環(huán)中的,不能脫離循環(huán)。否則致命錯(cuò)誤會(huì)發(fā)生的。 會(huì)發(fā)生什么?.................................... |
|
| 43樓: | >>參與討論 |
| 作者: HWM 于 2006/12/28 10:02:00 發(fā)布:
40,41:SLEEP?看來是醒不來了。 |
|
| 44樓: | >>參與討論 |
| 作者: hq_y 于 2006/12/28 10:08:00 發(fā)布:
SLEEP還是在循環(huán)中~~~~~~~~~~~~ 然后依靠外部中斷或者定時(shí)器中斷喚醒 然后起來干活 然后再回到sleep .... 設(shè)計(jì)低功耗系統(tǒng)比較有用 可能對(duì)抗干擾也有一些好處~~~~~~~~~~ |
|
| 45樓: | >>參與討論 |
| 作者: 程序匠人 于 2006/12/28 10:24:00 發(fā)布:
打多數(shù)情況下可以是一個(gè)死循環(huán),偶然也可以是多個(gè)循環(huán) 打多數(shù)情況下可以是一個(gè)死循環(huán),偶然也可以是多個(gè)循環(huán)。 每個(gè)循環(huán)體相當(dāng)于一個(gè)穩(wěn)定狀態(tài),當(dāng)特定條件觸發(fā)時(shí),遷躍到另一個(gè)循環(huán)體中去。有點(diǎn)類似于狀態(tài)機(jī)的概念。 |
|
| 46樓: | >>參與討論 |
| 作者: fushaobing 于 2006/12/28 10:24:00 發(fā)布:
SLEEP還是在循環(huán)中 否則,醒來以后就再也睡不著了。 但對(duì)于“掉電模式”,好象不是死循環(huán)。 |
|
| 47樓: | >>參與討論 |
| 作者: xwj 于 2006/12/28 10:37:00 發(fā)布:
呵呵,說你們思維僵化還不信 除了SLEEP還有PowerDown, 最主要的還是要有SoftReset 并不是每個(gè)系統(tǒng)都必須毫不停歇的工作的,很多都有空閑的時(shí)候 所以也不必每次都要從上一個(gè)點(diǎn)繼續(xù)的, 既然能夠掉電,自然是所有的活都干完了(這是必須的特定條件) 在沒事干時(shí)關(guān)機(jī)自然可以排除一切的意外 只要有事時(shí)能夠足夠快的激活響應(yīng)即可 而下一次事件的觸發(fā),我們完全可以看成是一個(gè)全新的開始 更是可以排除某些未知BUG的累計(jì)影響(比如內(nèi)存漏洞、碎片) 誰的系統(tǒng)都不敢說絕對(duì)沒有BUG,而且對(duì)于存在的BUG編程者是看不到的 |
|
| 48樓: | >>參與討論 |
| 作者: xwj 于 2006/12/28 10:49:00 發(fā)布:
就好比所長說的I2C操作前先發(fā)9個(gè)1 既然之前的狀態(tài)可能是錯(cuò)誤的,那我們?yōu)槭裁匆又e(cuò)誤后面繼續(xù)呢? 我先把它恢復(fù)到可控的正確狀態(tài),再從頭開始豈不更好? 當(dāng)然,必須得有足夠時(shí)能間毫不影響的做完這些才行,如果是完全持續(xù)的系統(tǒng),那當(dāng)然得先保證正常得工作 |
|
| 49樓: | >>參與討論 |
| 作者: qqq2000 于 2006/12/28 11:23:00 發(fā)布:
很多時(shí)候可以是外部啟動(dòng)的 搞一個(gè)啟動(dòng)電路或者喚醒電路就是了——很多時(shí)候就是一個(gè)按鈕加去抖。 按下去,就啟動(dòng),干完活,就自己關(guān)斷了。再按再啟動(dòng)。這也是很常用的設(shè)計(jì)。還有外部喚醒,也很常用,對(duì)于有掉電模式的單片機(jī),完全可以這么干,不搞循環(huán)等待。 |
|
| 50樓: | >>參與討論 |
| 作者: qqq2000 于 2006/12/28 11:29:00 發(fā)布:
另外,有些特別的設(shè)計(jì),會(huì)采用大數(shù)有限循環(huán) 以前給別人兼職做軟件就有做這樣的事情,目的是保證產(chǎn)品到使用期限一定會(huì)完蛋。 |
|
| 51樓: | >>參與討論 |
| 作者: qqq2000 于 2006/12/28 11:40:00 發(fā)布:
其實(shí)想想,說一定要有死循環(huán)也沒錯(cuò)的 很多工業(yè)上單片機(jī)控制不能用死循環(huán),做完了事情一定要關(guān)機(jī),不然單片機(jī)跑飛會(huì)出很嚴(yán)重的問題。通常辦完事之后發(fā)命令切斷自己的電源,延時(shí)幾秒等待關(guān)機(jī),延時(shí)幾秒沒有關(guān)掉就報(bào)警,要求手動(dòng)關(guān)機(jī)——當(dāng)然等待手動(dòng)關(guān)機(jī)的部分,一般還是有個(gè)死跳。 |
|
| 52樓: | >>參與討論 |
| 作者: hotpower 于 2006/12/28 17:56:00 發(fā)布:
不能喚醒的SLEEP本身就是一個(gè)不動(dòng)的"死循環(huán)" |
|
| 53樓: | >>參與討論 |
| 作者: IceAge 于 2006/12/28 21:51:00 發(fā)布:
一定是個(gè)死循環(huán) 無論用什么樣的方式,只要你不把死循環(huán)定義為僅僅是狹窄的 while(1) 或者認(rèn)為無限選環(huán)不是死循環(huán)。 我以前說過,我的mcu結(jié)構(gòu)基本上是中斷喚醒 idle 主程序。從大處看,這也是一種無限的循環(huán):死循環(huán)。 無論程序有多少分支或者多少入口,都是在有限數(shù)量的循環(huán)中死循環(huán)。 |
|
| 54樓: | >>參與討論 |
| 作者: hotpower 于 2006/12/28 21:53:00 發(fā)布:
哈哈~~~我最喜歡IceAge的灌溉~~~ |
|
| 55樓: | >>參與討論 |
| 作者: xwj 于 2006/12/29 8:26:00 發(fā)布:
哈哈,建議IceAge也當(dāng)一回尿童 給樓上灌溉灌溉! |
|
| 56樓: | >>參與討論 |
| 作者: mikesullen 于 2006/12/29 14:11:00 發(fā)布:
18樓可以報(bào)考飛行員了。。。 |
|
| 57樓: | >>參與討論 |
| 作者: fushaobing 于 2006/12/29 14:20:00 發(fā)布:
樓上什么意思?請(qǐng)賜教! |
|
| 58樓: | >>參與討論 |
| 作者: bp596385 于 2006/12/29 22:03:00 發(fā)布:
暈了,亂侃呀 |
|
| 59樓: | >>參與討論 |
| 作者: gwnpeter 于 2006/12/30 8:53:00 發(fā)布:
18樓的,很多編譯器對(duì)你的進(jìn)行編譯之后還是會(huì)循環(huán)顯示的 另外有一些就不是,廢話...................... |
|
| 60樓: | >>參與討論 |
| 作者: AIRWILL 于 2006/12/30 12:58:00 發(fā)布:
好熱鬧啊 我咋感覺, 什么都是死循環(huán). 即使人生也是"死"循環(huán), 地球運(yùn)動(dòng)也是個(gè)"死"循環(huán), 宇宙也是個(gè)"死"循環(huán). |
|
| 61樓: | >>參與討論 |
| 作者: xuetian110 于 2006/12/30 14:16:00 發(fā)布:
暈!暈!暈!小弟也來講幾句. 存屬個(gè)人看法: 你的程序一定是這樣寫的: main { Initialization; while(1) {print;} } 這個(gè)程序首先上電初始化,然后進(jìn)入死循環(huán),一直打印下去.print;他自己在while(1)里面循環(huán); 如果改一下: main { Initialization; print; } 這個(gè)程序,執(zhí)行結(jié)果也是個(gè)死循環(huán),只不過多了個(gè)初始化程序,先是Initialization;然后print;他們?cè)谥鞒绦騧ain里面循環(huán); 樓上們的UNDERSTAND??????????? |
|
| 62樓: | >>參與討論 |
| 作者: sharks 于 2006/12/30 14:48:00 發(fā)布:
樓上的,結(jié)論只能說對(duì)了一大半。 |
|
| 63樓: | >>參與討論 |
| 作者: jerrylay 于 2006/12/31 9:08:00 發(fā)布:
應(yīng)該不一定要死循環(huán)吧 在完成任務(wù)以后,你決定讓單片機(jī)干什么,用一個(gè)while循環(huán)可以,進(jìn)入低功耗模式也可以 |
|
| 64樓: | >>參與討論 |
| 作者: hotpower 于 2006/12/31 9:14:00 發(fā)布:
從宏觀上看低功耗模式也在虛擬循環(huán)的內(nèi)部~~~ |
|
| 65樓: | >>參與討論 |
| 作者: fpga2006 于 2006/12/31 14:39:00 發(fā)布:
都是死循環(huán)吧 不循環(huán)工作一遍就拉到了 那不是一次性的單片機(jī)了 |
|
| 66樓: | >>參與討論 |
| 作者: gangqun 于 2006/12/31 16:06:00 發(fā)布:
進(jìn)入Main()以后就不應(yīng)該跳出來 |
|
| 67樓: | >>參與討論 |
| 作者: nlgz 于 2006/12/31 17:41:00 發(fā)布:
看不懂啦 18樓的 看不懂啦 18樓寫的 沒有循環(huán)啊? 難道 我們寫了若干年程序都錯(cuò)了 |
|
| 68樓: | >>參與討論 |
| 作者: nlgz 于 2006/12/31 17:49:00 發(fā)布:
如果程序指針不受控制的話最終也是一種死循環(huán)啊 如果程序指針不受控制的話最終也是一種死循環(huán)啊 更何況從程序控制的角度看 我們應(yīng)用程序 一定要控制它的出口在預(yù)期范圍內(nèi) 實(shí)際也是一種死循環(huán)啊(只不過可能有多個(gè)分支任務(wù)參與). |
|
| 69樓: | >>參與討論 |
| 作者: NE5532 于 2007/1/1 9:23:00 發(fā)布:
再說兩句 main不一定是退出后再回來 有的單片機(jī)自動(dòng)在main后面加死循環(huán) 例如 匯編啟動(dòng)函數(shù) boot: ......省略部分 rjmp _c_start_up void c_start_up (void) { main(void); for(;;); //自動(dòng)加入死循環(huán) } void main (void) { //這才是你的函數(shù) } 另外搞PC軟件,不理解死循環(huán)的,是因?yàn)槟愕暮瘮?shù)返回后把CPU交給了操作系統(tǒng)(windows),他自己就是死循環(huán)。 |
|
| 70樓: | >>參與討論 |
| 作者: fushaobing 于 2007/1/2 16:04:00 發(fā)布:
很抱歉! 對(duì)于“18樓”的回貼,是本人理解錯(cuò)誤。 ;================================================================= fushaobing 發(fā)表于 2006-12-26 14:39 侃單片機(jī) ←返回版面 18樓: 誰說單片機(jī)的程序必須是死循環(huán)???? “是這樣的,我在程序初始化完成后,只有一個(gè)打印語句(通過串口)。但我發(fā)現(xiàn)程序不停的打印,開始我以為是單片機(jī)異常,復(fù)位引起的。但一直查不出啥原因,后來我在打印完后加了一個(gè)while(1)死循環(huán),這才只打印一次;后來問同事,他說必須是死循環(huán)! ----------------------------------------------------- 你的程序一定是這樣寫的: main { Initialization; while(1) {print;} } 如果改一下: main { Initialization; print; } 它還會(huì)一直打印嗎? 所以說,單片機(jī)的程序不是一定要死循環(huán)。你把它寫成死循環(huán)它就是死循環(huán)。你不把它寫成死循環(huán),它怎么可能是死循環(huán)呢??? ;================================================================== 我后來跟同事討論后,得到的結(jié)論如下: ;================================================================ fushaobing 發(fā)表于 2006-12-27 10:06 侃單片機(jī) ←返回版面 32樓: 26樓,就你聰明? 也許本人表達(dá)不恰當(dāng),對(duì)于“這個(gè)問題是不是跟單片機(jī)的型號(hào)有關(guān)?”,我的本意是,不同的單片機(jī)用不同的編譯器,不同的編譯器對(duì)main{}函數(shù)的處理也可能不一樣。存在2能可能: 1.在main{}返回時(shí)強(qiáng)制回到main{}的入口; 2.在main{}返回時(shí)執(zhí)行“RET”指令,這時(shí)它跳到哪里就跟堆棧有關(guān)。 樓主碰到的應(yīng)該是第二種情況,在執(zhí)行“RET”指令時(shí),由于堆棧沒有被使用,內(nèi)容是0000H,于是相當(dāng)于復(fù)位了。 ;================================================================= |
|
| 71樓: | >>參與討論 |
| 作者: xhuboy 于 2007/1/2 16:10:00 發(fā)布:
暈 整個(gè)主程序當(dāng)然得是一個(gè)死循環(huán)啦. 是不是玩多了電腦程序,不知道51了 |
|
| 72樓: | >>參與討論 |
| 作者: 5880527 于 2007/1/2 17:13:00 發(fā)布:
C8051F好象可以不要的 我覺得主程序是死循環(huán)的說法沒錯(cuò),但有C8051F就好象可以不要死循環(huán),把內(nèi)外部的振蕩都禁止就可以了,它就死那里了,但不知道這樣做有什么用 |
|
| 73樓: | >>參與討論 |
| 作者: conwh 于 2007/1/2 17:17:00 發(fā)布:
口水帖也這么紅?人生也是一個(gè)循環(huán),這還有疑問? |
|
| 74樓: | >>參與討論 |
| 作者: 5880527 于 2007/1/2 22:05:00 發(fā)布:
呵呵 人生的循環(huán)次數(shù)和單片機(jī)一樣,也有使用壽命的,到時(shí)候就再也不能RET了,復(fù)位電路也起不了作用了 |
|
| 75樓: | >>參與討論 |
| 作者: mxinfa 于 2007/1/3 9:52:00 發(fā)布:
應(yīng)該是死循環(huán)的 在PC機(jī)上寫程序?yàn)槭裁礇]有死循環(huán)?那是因?yàn)槌绦驁?zhí)行完了之后操作系統(tǒng)給接收了,而操作系統(tǒng)本身就是一個(gè)更大的死循環(huán)而已 在單片機(jī)上沒有操作系統(tǒng)你程序執(zhí)行完了去哪里?就這么簡單 同意樓上的忘了幾樓的一句話,無限循環(huán)不等于死循環(huán) |
|
| 76樓: | >>參與討論 |
| 作者: mikesullen 于 2007/1/3 14:25:00 發(fā)布:
什么叫循環(huán)?? 主要是大家對(duì)概念的理解不同,再爭也沒有意義。。。。 C語言層面和匯編層面對(duì)循環(huán)去理解也是不同的。。 但如果從MCU內(nèi)部結(jié)構(gòu)上去講,就會(huì)統(tǒng)一些,程序的執(zhí)行會(huì)伴隨著PC指針的變化,PC指針的變化一般是在程序空間內(nèi),這個(gè)程序空間有可能是用戶寫的代碼區(qū),也可能是空白區(qū),對(duì)于一個(gè)MCU而言,這個(gè)空間是有限的,在有限的空間內(nèi)PC指針只能是一種循環(huán)。。。 sleep只是MCU的一種狀態(tài),此時(shí)的PC指針不動(dòng),但sleep被喚醒后,程序還是要繼續(xù)跑的,PC指針還是要在程序空間內(nèi)的。。 reset可以理解為一種特別的中斷,它產(chǎn)生之后的程序也是要繼續(xù)跑的,PC指針也是要在程序空間內(nèi)的。。 至于樓上所說的切斷自己的電源,如果是MCU內(nèi)部的電源,那也只是一種暫態(tài),暫態(tài)只是整個(gè)循環(huán)過程的一個(gè)節(jié)點(diǎn)。如果是MCU外部的電源,那已經(jīng)脫離MCU層面了,而是一個(gè)小的系統(tǒng)了。。。那就扯的更遠(yuǎn)了。。 關(guān)鍵是理解內(nèi)在,活學(xué)活用。。。 |
|
| 77樓: | >>參與討論 |
| 作者: suud 于 2007/1/4 13:58:00 發(fā)布:
20樓,估計(jì)你是誤解了樓主的意思 * - 本貼最后修改時(shí)間:2007-1-4 14:00:02 修改者:suud |
|
| 78樓: | >>參與討論 |
| 作者: 被磁化的鐵 于 2007/1/4 20:26:00 發(fā)布:
_ 放一個(gè)死循環(huán)纏著大循環(huán)就好了. 在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 * - 本貼最后修改時(shí)間:2007-1-4 21:37:27 修改者:被磁化的鐵 |
|
| 79樓: | >>參與討論 |
| 作者: aekin 于 2007/1/4 21:05:00 發(fā)布:
好像有種無窮不循環(huán)小數(shù)。 |
|
| 80樓: | >>參與討論 |
| 作者: tqdyx 于 2007/1/4 21:56:00 發(fā)布:
76樓正解 有些事真的很無聊 |
|
| 81樓: | >>參與討論 |
| 作者: heroying 于 2007/1/5 10:13:00 發(fā)布:
循環(huán)是后臺(tái) 循環(huán)是后臺(tái),就和地球繞太陽循環(huán)不惜的轉(zhuǎn)沒區(qū)別。我們還是照樣生活,循環(huán)是一定的,有大有小,大到你感覺不到而已! |
|
| 82樓: | >>參與討論 |
| 作者: blackson 于 2007/1/9 16:29:00 發(fā)布:
我也有點(diǎn)想不通這類問題啊 應(yīng)該是: 你把程序設(shè)置為死循環(huán)時(shí),它就是死循環(huán),會(huì)不停的打印. 你把程序設(shè)置為順序執(zhí)行,沒有死循環(huán)時(shí),就打印一次,不再打印. 從單片機(jī)的工作上可以認(rèn)為必須設(shè)置為死循環(huán),才能不停的工作,檢測(cè)某些狀態(tài)什么的,但是從原理上來說,不考慮實(shí)際工作的話,我認(rèn)為,單片機(jī)不一定非要設(shè)置為死循環(huán),可以就打印那么一次嘛,對(duì)嗎? |
|
| 83樓: | >>參與討論 |
| 作者: 戰(zhàn)地記者 于 2007/1/9 21:42:00 發(fā)布:
不解啊 這循環(huán) 一頭的霧水 |
|
| 84樓: | >>參與討論 |
| 作者: hq_y 于 2007/1/9 21:45:00 發(fā)布:
不一定非要設(shè)置為死循環(huán),實(shí)際上也是在原地踏步 然后在中斷中處理所有的事情! 但是不是所有的程序都是可以這樣編寫的; |
|
| 85樓: | >>參與討論 |
| 作者: leezongfan 于 2007/1/11 23:08:00 發(fā)布:
18樓的為什么還想不明白呢。 |
|
| 86樓: | >>參與討論 |
| 作者: bootload 于 2007/1/11 23:17:00 發(fā)布:
呵呵,不是死循環(huán)就不是一個(gè)系統(tǒng) 這個(gè),我大學(xué)三年級(jí)就明白,哈哈 |
|
| 87樓: | >>參與討論 |
| 作者: 木子 于 2009/12/15 16:48:55 發(fā)布:
菜鳥真多,唉,還什么死不死的 |
|
|
|
| 免費(fèi)注冊(cè)為維庫電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |