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

作者: qwersde    時間: 2021-3-21 09:03
標題: 為什么C語言 while(1)每執(zhí)行一段時間后就重新從main函數(shù)最開始的地方重新執(zhí)行?
#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();
                                       
                                        }
                }
        }
        
}


作者: 張?zhí)鞄?nbsp;   時間: 2021-3-21 10:27
好好去學一下C語言。while本就是判斷循環(huán)指令,()內(nèi)值為真就執(zhí)行循環(huán),()內(nèi)值為假就退出循環(huán)
作者: npn    時間: 2021-3-21 10:56
看門狗問題或其他干擾,導致芯片頻繁復位。
作者: zyx64140943    時間: 2021-3-21 11:19
while(1)
{
.....
}
是死循環(huán),一直重復while里面的內(nèi)容。
作者: 啤酒瓶子老大    時間: 2021-3-21 22:56
為什么C語言 while(1)每執(zhí)行一段時間后就重新從main函數(shù)最開始的地方重新執(zhí)行?
我按照我的知識給你重新理解一下這個問題。
有while(1){}就一直循環(huán)括號里的內(nèi)容。如果沒有這一句,他也會一直循環(huán)main函數(shù)里的內(nèi)容。
單片機內(nèi)部從有時鐘信號開始就按照系統(tǒng)設(shè)計好的方式運行。從main開始運行。運行到程序結(jié)束,下一個時鐘到來就又從main開始運行。這是在保證系統(tǒng)程序區(qū)都是空白的情況下。不排除由于外界因素的干擾。
所以要穩(wěn)定還是要寫while(1){}保證程序在可控的范圍內(nèi)運行。
請參考微機原理與接口類底層的書籍。
作者: ANT1987    時間: 2021-3-22 08:14
定時器  中斷 看門狗  都可以從主函數(shù)跳出來
作者: 黃youhui    時間: 2021-3-22 08:27
ANT1987 發(fā)表于 2021-3-22 08:14
定時器  中斷 看門狗  都可以從主函數(shù)跳出來

也可能是斷電復位
作者: munuc_w    時間: 2021-3-22 08:32
板凳說的對,這是個死循環(huán),不會無緣無故跳出來的。
作者: Lxiaochuang    時間: 2021-3-22 08:48
肯定是單片機復位了,考慮一下電機的問題,電機驅(qū)動的電流
作者: 紅葉夜夜笙歌    時間: 2021-3-22 12:28
單片機復位了 可能是看門狗復位
作者: glinfei    時間: 2021-3-22 12:53
我覺得就是單片機復位了,而且是控制電機的,如果電源沒有分開,就是很容易讓單片機復位的。
作者: 1023891216    時間: 2022-5-11 14:02
樓主這個問題解決了嗎?

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

錯,沒有while(1)的話,main函數(shù)執(zhí)行到最后,必然會死機。
作者: shxiueqiu    時間: 2022-5-11 17:53
while是先判斷表達式的值是否滿足要求,在執(zhí)行語句。
作者: 名字不是重點    時間: 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?
作者: Hephaestus    時間: 2022-5-11 18:15
名字不是重點 發(fā)表于 2022-5-11 18:00
當PC指針到了最后,不會返回到0?,比如4K的ROM,PC指針到了0X0FFF,再進一步進到0x1000,因為4K最高地址 ...

別做夢了。
作者: 名字不是重點    時間: 2022-5-11 23:40
Hephaestus 發(fā)表于 2022-5-11 18:15
別做夢了。

如果是這樣,那么就是一個BUG,謹慎表示懷疑。
作者: 名字不是重點    時間: 2022-5-11 23:59
本帖最后由 名字不是重點 于 2022-5-12 00:01 編輯

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

呼喚大神來指點一下!


作者: 名字不是重點    時間: 2022-5-12 00:35
本帖最后由 名字不是重點 于 2022-5-12 00:38 編輯

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

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




歡迎光臨 (http://www.torrancerestoration.com/bbs/) Powered by Discuz! X3.1