找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3589|回復: 18
打印 上一主題 下一主題
收起左側

為什么C語言 while(1)每執(zhí)行一段時間后就重新從main函數(shù)最開始的地方重新執(zhí)行?

  [復制鏈接]
跳轉到指定樓層
樓主
ID:752659 發(fā)表于 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空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:814525 發(fā)表于 2021-3-21 10:27 | 只看該作者
好好去學一下C語言。while本就是判斷循環(huán)指令,()內值為真就執(zhí)行循環(huán),()內值為假就退出循環(huán)

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

板凳
ID:57657 發(fā)表于 2021-3-21 10:56 | 只看該作者
看門狗問題或其他干擾,導致芯片頻繁復位。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

地板
ID:440728 發(fā)表于 2021-3-21 11:19 | 只看該作者
while(1)
{
.....
}
是死循環(huán),一直重復while里面的內容。

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復

使用道具 舉報

5#
ID:230742 發(fā)表于 2021-3-21 22:56 | 只看該作者
為什么C語言 while(1)每執(zhí)行一段時間后就重新從main函數(shù)最開始的地方重新執(zhí)行?
我按照我的知識給你重新理解一下這個問題。
有while(1){}就一直循環(huán)括號里的內容。如果沒有這一句,他也會一直循環(huán)main函數(shù)里的內容。
單片機內部從有時鐘信號開始就按照系統(tǒng)設計好的方式運行。從main開始運行。運行到程序結束,下一個時鐘到來就又從main開始運行。這是在保證系統(tǒng)程序區(qū)都是空白的情況下。不排除由于外界因素的干擾。
所以要穩(wěn)定還是要寫while(1){}保證程序在可控的范圍內運行。
請參考微機原理與接口類底層的書籍。
回復

使用道具 舉報

6#
ID:894154 發(fā)表于 2021-3-22 08:14 | 只看該作者
定時器  中斷 看門狗  都可以從主函數(shù)跳出來
回復

使用道具 舉報

7#
ID:592807 發(fā)表于 2021-3-22 08:27 | 只看該作者
ANT1987 發(fā)表于 2021-3-22 08:14
定時器  中斷 看門狗  都可以從主函數(shù)跳出來

也可能是斷電復位
回復

使用道具 舉報

8#
ID:752974 發(fā)表于 2021-3-22 08:32 | 只看該作者
板凳說的對,這是個死循環(huán),不會無緣無故跳出來的。
回復

使用道具 舉報

9#
ID:373843 發(fā)表于 2021-3-22 08:48 | 只看該作者
肯定是單片機復位了,考慮一下電機的問題,電機驅動的電流
回復

使用道具 舉報

10#
ID:231674 發(fā)表于 2021-3-22 12:28 | 只看該作者
單片機復位了 可能是看門狗復位
回復

使用道具 舉報

11#
ID:844772 發(fā)表于 2021-3-22 12:53 | 只看該作者
我覺得就是單片機復位了,而且是控制電機的,如果電源沒有分開,就是很容易讓單片機復位的。
回復

使用道具 舉報

12#
ID:687403 發(fā)表于 2022-5-11 14:02 | 只看該作者
樓主這個問題解決了嗎?
回復

使用道具 舉報

13#
ID:883242 發(fā)表于 2022-5-11 17:39 | 只看該作者
啤酒瓶子老大 發(fā)表于 2021-3-21 22:56
為什么C語言 while(1)每執(zhí)行一段時間后就重新從main函數(shù)最開始的地方重新執(zhí)行?
我按照我的知識給你重新 ...

錯,沒有while(1)的話,main函數(shù)執(zhí)行到最后,必然會死機。
回復

使用道具 舉報

14#
ID:1025765 發(fā)表于 2022-5-11 17:53 | 只看該作者
while是先判斷表達式的值是否滿足要求,在執(zhí)行語句。
回復

使用道具 舉報

15#
ID:824490 發(fā)表于 2022-5-11 18:00 | 只看該作者
Hephaestus 發(fā)表于 2022-5-11 17:39
錯,沒有while(1)的話,main函數(shù)執(zhí)行到最后,必然會死機。

當PC指針到了最后,不會返回到0?,比如4K的ROM,PC指針到了0X0FFF,再進一步進到0x1000,因為4K最高地址是0xFFF ,所以PC溢出,自動歸0?
回復

使用道具 舉報

16#
ID:883242 發(fā)表于 2022-5-11 18:15 | 只看該作者
名字不是重點 發(fā)表于 2022-5-11 18:00
當PC指針到了最后,不會返回到0?,比如4K的ROM,PC指針到了0X0FFF,再進一步進到0x1000,因為4K最高地址 ...

別做夢了。
回復

使用道具 舉報

17#
ID:824490 發(fā)表于 2022-5-11 23:40 | 只看該作者

如果是這樣,那么就是一個BUG,謹慎表示懷疑。
回復

使用道具 舉報

18#
ID:824490 發(fā)表于 2022-5-11 23:59 | 只看該作者
本帖最后由 名字不是重點 于 2022-5-12 00:01 編輯

我的理解是,在main中的加入while(1){},是為了讓PC在可控的范圍內做死循環(huán),如果不加while(1){},則在main()的最后,PC繼續(xù)+1,則跑出main()的范圍,此時的PC將不可控,就是所謂的程序跑飛了。但此時MCU并沒有死機,死機與跑飛是兩碼事,拿人來比喻,死機就是人涼了,跑飛只是精神病發(fā)作,還可以搶救一下的(有時還會飛回來)。

呼喚大神來指點一下!

回復

使用道具 舉報

19#
ID:824490 發(fā)表于 2022-5-12 00:35 | 只看該作者
本帖最后由 名字不是重點 于 2022-5-12 00:38 編輯

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

以上這段代碼測試過,設完斷點后,F(xiàn)5運行,程序還是會在斷點處停下。說明單片機沒死!只是跑飛了。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表