資料介紹
單片機(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)底的精神。
首先,大家要理解一件事情,我們編寫(xiě)的C語(yǔ)言程序,最終下載到單片機(jī)當(dāng)中去,在我們單片機(jī)的程序存儲(chǔ)空間FLASH當(dāng)中存儲(chǔ)的全部是2進(jìn)制數(shù)字代碼。比如0x00,0x01,一直到0xff。而我們編寫(xiě)的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軟件編寫(xiě)一個(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)行的程序包含兩部分,一部分是我們編寫(xiě)的程序代碼,另外一部分是編譯器自動(dòng)生成的代碼,因此,用KEIL軟件編寫(xiě)的程序在沒(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)題。
深有體會(huì)。剛學(xué)單片機(jī)不久,參考別人的程序?qū)懥薒CD驅(qū)動(dòng),在買(mǎi)來(lái)的實(shí)驗(yàn)板上運(yùn)行時(shí),顯示正常。在自己用面包板上搭建的系統(tǒng)運(yùn)行時(shí),只能顯示幾秒鐘,之后一片空白,當(dāng)時(shí)懷疑面包板供電不穩(wěn)定,或者信號(hào)線干擾,折騰幾小時(shí)后,在程序末尾加一句“while(1);”,顯示完全正常。
不加不穩(wěn)定,有時(shí)候會(huì)在main()里面循環(huán),有時(shí)候會(huì)亂碼。
這里的while(1)并不是防止程序“跑飛”的,而是防止main()返回。
① 在嵌入式中main是不能返回的。不同的C語(yǔ)言實(shí)現(xiàn)的單片機(jī)初始化代碼會(huì)有不同的表現(xiàn),有的是在call _main后jmp,而有的是jmp 0,等等這些會(huì)導(dǎo)致不可預(yù)料的結(jié)果。
② 在我們寫(xiě)的C語(yǔ)言后轉(zhuǎn)換成匯編,再觀察單片機(jī)的代碼區(qū),你會(huì)發(fā)現(xiàn)沒(méi)有寫(xiě)程序的部分例如全1或者全0區(qū)域,程序運(yùn)行到這里,就會(huì)有可能造成意料不到的結(jié)果。若無(wú)while(1)循環(huán),程序全部執(zhí)行后,跳轉(zhuǎn)至程序起始處重新執(zhí)行。
- RAM在單片機(jī)里有什么樣的作用?
- 《PIC單片機(jī)C語(yǔ)言》pdf 0次下載
- 單片機(jī)C語(yǔ)言程序與數(shù)據(jù)存儲(chǔ)
- C語(yǔ)言和單片機(jī)C語(yǔ)言為什么會(huì)有差異?雖不同但理同!
- [ 愛(ài)找茬 ]都是C語(yǔ)言,單片機(jī)C語(yǔ)言和普通的C語(yǔ)言究竟有什么差異呢?
- 1.單片機(jī)和C語(yǔ)言的關(guān)系(5)
- 單片機(jī)C語(yǔ)言和匯編語(yǔ)言混合編程實(shí)例詳解 224次下載
- PIC單片機(jī)的C語(yǔ)言編程電子版下載 0次下載
- 單片機(jī)上拉電阻有什么樣的作用好使用原則詳細(xì)說(shuō)明
- 單片機(jī)C語(yǔ)言中如何使用nop函數(shù)進(jìn)行短延時(shí)的效果資料和程序說(shuō)明 10次下載
- C51單片機(jī)C語(yǔ)言與標(biāo)準(zhǔn)C語(yǔ)言有什么區(qū)別? 134次下載
- 單片機(jī)C語(yǔ)言code與data的作用 1次下載
- 8051單片機(jī)C語(yǔ)言軟件設(shè)計(jì)8051單片機(jī)C語(yǔ)言軟件設(shè)計(jì) 92次下載
- 單片機(jī)C語(yǔ)言中常用到的關(guān)鍵字及數(shù)據(jù)類型 13次下載
- AVR單片機(jī)C語(yǔ)言總綱
- 什么是C語(yǔ)言?單片機(jī)有什么特點(diǎn)?為什么要用C語(yǔ)言編程? 1264次閱讀
- C語(yǔ)言怎么跳出while函數(shù) 3.5w次閱讀
- 單片機(jī)液晶漢字顯示的C語(yǔ)言程序 4885次閱讀
- 單片機(jī)為什么需要晶振?晶振在單片機(jī)中有什么樣的作用 2.1w次閱讀
- 新手教程:單片機(jī)的學(xué)習(xí)實(shí)踐步驟 3819次閱讀
- C語(yǔ)言中#和##符號(hào)有什么樣的作用 4.5w次閱讀
- 學(xué)習(xí)單片機(jī)一定要先學(xué)好C語(yǔ)言再去學(xué)單片機(jī)嗎 1.3w次閱讀
- 單片機(jī)C語(yǔ)言有哪些優(yōu)越性?如何建立一個(gè)Keil C51項(xiàng)目 1.2w次閱讀
- 單片機(jī)C語(yǔ)言的求平方根怎么實(shí)現(xiàn) 3462次閱讀
- RAM在單片機(jī)里有什么樣的作用 6262次閱讀
- 單片機(jī)C語(yǔ)言之串口通信協(xié)議 4773次閱讀
- 單片機(jī)仿真器有什么用?單片機(jī)仿真器作用介紹 1.7w次閱讀
- pic單片機(jī)io口控制教程之c語(yǔ)言編程實(shí)現(xiàn) 1.1w次閱讀
- 單片機(jī)編程之匯編語(yǔ)言基礎(chǔ)-常用指令和程序模式 1.5w次閱讀
- 單片機(jī)C語(yǔ)言知識(shí)點(diǎn)全攻略(一) 5w次閱讀
下載排行
本周
- 1TC358743XBG評(píng)估板參考手冊(cè)
- 1.36 MB | 330次下載 | 免費(fèi)
- 2開(kāi)關(guān)電源基礎(chǔ)知識(shí)
- 5.73 MB | 6次下載 | 免費(fèi)
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設(shè)計(jì)
- 0.60 MB | 3次下載 | 免費(fèi)
- 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
- 0.61 MB | 2次下載 | 免費(fèi)
- 651單片機(jī)窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費(fèi)
- 751單片機(jī)大棚環(huán)境控制器仿真程序
- 1.10 MB | 2次下載 | 免費(fèi)
- 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
- 0.86 MB | 2次下載 | 免費(fèi)
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 2555集成電路應(yīng)用800例(新編版)
- 0.00 MB | 33564次下載 | 免費(fèi)
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費(fèi)
- 4開(kāi)關(guān)電源設(shè)計(jì)實(shí)例指南
- 未知 | 21549次下載 | 免費(fèi)
- 5電氣工程師手冊(cè)免費(fèi)下載(新編第二版pdf電子書(shū))
- 0.00 MB | 15349次下載 | 免費(fèi)
- 6數(shù)字電路基礎(chǔ)pdf(下載)
- 未知 | 13750次下載 | 免費(fèi)
- 7電子制作實(shí)例集錦 下載
- 未知 | 8113次下載 | 免費(fèi)
- 8《LED驅(qū)動(dòng)電路設(shè)計(jì)》 溫德?tīng)栔?/a>
- 0.00 MB | 6653次下載 | 免費(fèi)
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費(fèi)
- 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
- 78.1 MB | 537796次下載 | 免費(fèi)
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費(fèi)
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費(fèi)
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費(fèi)
- 6電路仿真軟件multisim 10.0免費(fèi)下載
- 340992 | 191185次下載 | 免費(fèi)
- 7十天學(xué)會(huì)AVR單片機(jī)與C語(yǔ)言視頻教程 下載
- 158M | 183279次下載 | 免費(fèi)
- 8proe5.0野火版下載(中文版免費(fèi)下載)
- 未知 | 138040次下載 | 免費(fèi)
評(píng)論
查看更多