新聞中心

EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 單片機(jī)C語(yǔ)言中while(1)的問(wèn)題

單片機(jī)C語(yǔ)言中while(1)的問(wèn)題

作者: 時(shí)間:2016-11-30 來(lái)源:網(wǎng)絡(luò) 收藏
  單片機(jī)C語(yǔ)言的主程序,通常要用一個(gè)while(1)語(yǔ)句來(lái)讓程序進(jìn)入一個(gè)無(wú)限循環(huán),目的是為了讓程序一直保持在我們需要運(yùn)行的情況下。
  雖然這種做法毋庸置疑,在網(wǎng)上還是有不少朋友有疑問(wèn),如果程序不加while(1)會(huì)出現(xiàn)什么情況,對(duì)于這種好學(xué)精神,還是值得贊揚(yáng)的,做學(xué)問(wèn)就需要有追根問(wèn)底的精神。
  首先,大家要理解一件事情,我們編寫的C語(yǔ)言程序,最終下載到單片機(jī)當(dāng)中去,在我們單片機(jī)的程序存儲(chǔ)空間FLASH當(dāng)中存儲(chǔ)的全部是2進(jìn)制數(shù)字代碼。比如0x00,0x01,一直到0xff。而我們編寫的C代碼,依靠的是編譯軟件,比如keil軟件,首先將C語(yǔ)言編譯成為匯編語(yǔ)言,最終匯編語(yǔ)言變成2進(jìn)制代碼,也就是我們的HEX文件當(dāng)中的數(shù)據(jù),下載到單片機(jī)當(dāng)中去。
  因此,查找這個(gè)問(wèn)題,首先從源頭來(lái)找,首先是C語(yǔ)言,然后,我們?cè)倏匆幌萝浖o我們編譯的匯編語(yǔ)言是什么樣子。用KEIL軟件編寫一個(gè)程序,然后simulator的方式進(jìn)行仿真,進(jìn)入仿真環(huán)境后,在View窗口下有個(gè)Disassembly window,打開(kāi),里邊就會(huì)出現(xiàn)剛才我們的C語(yǔ)言所對(duì)應(yīng)的匯編語(yǔ)言了(KEIL軟件會(huì)自動(dòng)將C編譯成匯編),找到里邊的主函數(shù),找到你最后一行的程序所對(duì)應(yīng)的匯編,找到后,會(huì)發(fā)現(xiàn)在最后一行程序結(jié)束后,KEIL這個(gè)軟件還會(huì)自動(dòng)給加入幾行匯編代碼,這幾行代碼就是(1)MOV R0, #0x7F;(2)CLR A; (3)MOV @R0, A; (4) DJNZ R0, (3); (5)MOV SP, #0x0C;(6) LJMP main;這幾條語(yǔ)句,前4條,是將我們單片機(jī)的內(nèi)存的前128個(gè)地址清零,第5條,是定義堆棧,第6條,是將程序重新跳轉(zhuǎn)到main函數(shù)的首行進(jìn)行執(zhí)行。
  從這里我們可以看出,最終下載到單片機(jī)運(yùn)行的程序包含兩部分,一部分是我們編寫的程序代碼,另外一部分是編譯器自動(dòng)生成的代碼,因此,用KEIL軟件編寫的程序在沒(méi)有while(1)的情況下運(yùn)行到最后一行,會(huì)自動(dòng)跳轉(zhuǎn)到main函數(shù)第一行運(yùn)行。
  本著嚴(yán)謹(jǐn)?shù)膽B(tài)度,筆者又查找PIC單片機(jī)的編譯開(kāi)發(fā)環(huán)境MAPLAB IDE,找到其中的匯編程序,在Disassembly window匯編程序中沒(méi)有發(fā)現(xiàn)跳轉(zhuǎn)到主函數(shù)的語(yǔ)句或者是復(fù)位語(yǔ)句。筆者不甘心,于是繼續(xù)查找,打開(kāi)了Promgram Memory,這也是最終下載到單片機(jī)當(dāng)中的程序,通過(guò)仔細(xì)查看筆者在其后邊,發(fā)現(xiàn)了在main函數(shù)的最后,有一條“reset”語(yǔ)句,這是一條PIC單片機(jī)的復(fù)位語(yǔ)句,也就是說(shuō)PIC單片機(jī)在進(jìn)行程序編譯的過(guò)程中,如果沒(méi)有while(1)語(yǔ)句,最后則會(huì)直接執(zhí)行復(fù)位,這MAPLAB隱藏的可夠深的。
  我在論壇上看到一個(gè)發(fā)帖者提出他下載進(jìn)AVR單片機(jī)的沒(méi)有while(1)的程序,但是單片機(jī)卻沒(méi)有復(fù)位,這點(diǎn)我沒(méi)有再去驗(yàn)證,因?yàn)槲覀兊某绦蛲ǔ6际且觲hile(1)這個(gè)循環(huán),因此呢,問(wèn)題到了這里,單片機(jī)程序沒(méi)有while(1)會(huì)出現(xiàn)什么情況,這一點(diǎn)已經(jīng)不重要了。但是有一點(diǎn)已經(jīng)可以確認(rèn)了,一部分單片機(jī)在沒(méi)有while(1)的情況下,運(yùn)行到最后一行出現(xiàn)的情況受到編譯開(kāi)發(fā)環(huán)境的影響。
  當(dāng)然了,一個(gè)嚴(yán)謹(jǐn)?shù)拈_(kāi)發(fā)環(huán)境,就應(yīng)該像KEIL和MAPLAB這樣,在程序員編譯程序可能出現(xiàn)漏洞的地方給與防護(hù),避免程序跑飛程序員無(wú)法查找程序問(wèn)題。


關(guān)鍵詞: 單片機(jī)C語(yǔ)言whil

評(píng)論


技術(shù)專區(qū)

關(guān)閉