99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>單片機(jī)>單片機(jī)的C語言中while有什么樣的作用

單片機(jī)的C語言中while有什么樣的作用

2019-09-04 | pdf | 0.01 MB | 次下載 | 1積分

資料介紹

  單片機(jī)C語言的主程序,通常要用一個(gè)while(1)語句來讓程序進(jìn)入一個(gè)無限循環(huán),目的是為了讓程序一直保持在我們需要運(yùn)行的情況下。

  雖然這種做法毋庸置疑,在網(wǎng)上還是有不少朋友有疑問,如果程序不加while(1)會出現(xiàn)什么情況,對于這種好學(xué)精神,還是值得贊揚(yáng)的,做學(xué)問就需要有追根問底的精神。

  首先,大家要理解一件事情,我們編寫的C語言程序,最終下載到單片機(jī)當(dāng)中去,在我們單片機(jī)的程序存儲空間FLASH當(dāng)中存儲的全部是2進(jìn)制數(shù)字代碼。比如0x00,0x01,一直到0xff。而我們編寫的C代碼,依靠的是編譯軟件,比如keil軟件,首先將C語言編譯成為匯編語言,最終匯編語言變成2進(jìn)制代碼,也就是我們的HEX文件當(dāng)中的數(shù)據(jù),下載到單片機(jī)當(dāng)中去。

  因此,查找這個(gè)問題,首先從源頭來找,首先是C語言,然后,我們再看一下軟件給我們編譯的匯編語言是什么樣子。用KEIL軟件編寫一個(gè)程序,然后simulator的方式進(jìn)行仿真,進(jìn)入仿真環(huán)境后,在View窗口下有個(gè)Disassembly window,打開,里邊就會出現(xiàn)剛才我們的C語言所對應(yīng)的匯編語言了(KEIL軟件會自動將C編譯成匯編),找到里邊的主函數(shù),找到你最后一行的程序所對應(yīng)的匯編,找到后,會發(fā)現(xiàn)在最后一行程序結(jié)束后,KEIL這個(gè)軟件還會自動給加入幾行匯編代碼,這幾行代碼就是(1)MOV R0, #0x7F;(2)CLR A; (3)MOV @R0, A; (4) DJNZ R0, (3); (5)MOV SP, #0x0C;(6) LJMP main;這幾條語句,前4條,是將我們單片機(jī)的內(nèi)存的前128個(gè)地址清零,第5條,是定義堆棧,第6條,是將程序重新跳轉(zhuǎn)到main函數(shù)的首行進(jìn)行執(zhí)行。

  從這里我們可以看出,最終下載到單片機(jī)運(yùn)行的程序包含兩部分,一部分是我們編寫的程序代碼,另外一部分是編譯器自動生成的代碼,因此,用KEIL軟件編寫的程序在沒有while(1)的情況下運(yùn)行到最后一行,會自動跳轉(zhuǎn)到main函數(shù)第一行運(yùn)行。

  本著嚴(yán)謹(jǐn)?shù)膽B(tài)度,筆者又查找PIC單片機(jī)的編譯開發(fā)環(huán)境MAPLAB IDE,找到其中的匯編程序,在Disassembly window匯編程序中沒有發(fā)現(xiàn)跳轉(zhuǎn)到主函數(shù)的語句或者是復(fù)位語句。筆者不甘心,于是繼續(xù)查找,打開了Promgram Memory,這也是最終下載到單片機(jī)當(dāng)中的程序,通過仔細(xì)查看筆者在其后邊,發(fā)現(xiàn)了在main函數(shù)的最后,有一條“reset”語句,這是一條PIC單片機(jī)的復(fù)位語句,也就是說PIC單片機(jī)在進(jìn)行程序編譯的過程中,如果沒有while(1)語句,最后則會直接執(zhí)行復(fù)位,這MAPLAB隱藏的可夠深的。

  我在論壇上看到一個(gè)發(fā)帖者提出他下載進(jìn)AVR單片機(jī)的沒有while(1)的程序,但是單片機(jī)卻沒有復(fù)位,這點(diǎn)我沒有再去驗(yàn)證,因?yàn)槲覀兊某绦蛲ǔ6际且觲hile(1)這個(gè)循環(huán),因此呢,問題到了這里,單片機(jī)程序沒有while(1)會出現(xiàn)什么情況,這一點(diǎn)已經(jīng)不重要了。但是有一點(diǎn)已經(jīng)可以確認(rèn)了,一部分單片機(jī)在沒有while(1)的情況下,運(yùn)行到最后一行出現(xiàn)的情況受到編譯開發(fā)環(huán)境的影響。

  當(dāng)然了,一個(gè)嚴(yán)謹(jǐn)?shù)拈_發(fā)環(huán)境,就應(yīng)該像KEIL和MAPLAB這樣,在程序員編譯程序可能出現(xiàn)漏洞的地方給與防護(hù),避免程序跑飛程序員無法查找程序問題。

  深有體會。剛學(xué)單片機(jī)不久,參考別人的程序?qū)懥薒CD驅(qū)動,在買來的實(shí)驗(yàn)板上運(yùn)行時(shí),顯示正常。在自己用面包板上搭建的系統(tǒng)運(yùn)行時(shí),只能顯示幾秒鐘,之后一片空白,當(dāng)時(shí)懷疑面包板供電不穩(wěn)定,或者信號線干擾,折騰幾小時(shí)后,在程序末尾加一句“while(1);”,顯示完全正常。

  不加不穩(wěn)定,有時(shí)候會在main()里面循環(huán),有時(shí)候會亂碼。

  這里的while(1)并不是防止程序“跑飛”的,而是防止main()返回。

 ?、?在嵌入式中main是不能返回的。不同的C語言實(shí)現(xiàn)的單片機(jī)初始化代碼會有不同的表現(xiàn),有的是在call _main后jmp,而有的是jmp 0,等等這些會導(dǎo)致不可預(yù)料的結(jié)果。

  ② 在我們寫的C語言后轉(zhuǎn)換成匯編,再觀察單片機(jī)的代碼區(qū),你會發(fā)現(xiàn)沒有寫程序的部分例如全1或者全0區(qū)域,程序運(yùn)行到這里,就會有可能造成意料不到的結(jié)果。若無while(1)循環(huán),程序全部執(zhí)行后,跳轉(zhuǎn)至程序起始處重新執(zhí)行。

下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1TC358743XBG評估板參考手冊
  2. 1.36 MB  |  330次下載  |  免費(fèi)
  3. 2開關(guān)電源基礎(chǔ)知識
  4. 5.73 MB  |  6次下載  |  免費(fèi)
  5. 3100W短波放大電路圖
  6. 0.05 MB  |  4次下載  |  3 積分
  7. 4嵌入式linux-聊天程序設(shè)計(jì)
  8. 0.60 MB  |  3次下載  |  免費(fèi)
  9. 5基于FPGA的光纖通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)
  10. 0.61 MB  |  2次下載  |  免費(fèi)
  11. 651單片機(jī)窗簾控制器仿真程序
  12. 1.93 MB  |  2次下載  |  免費(fèi)
  13. 751單片機(jī)大棚環(huán)境控制器仿真程序
  14. 1.10 MB  |  2次下載  |  免費(fèi)
  15. 8基于51單片機(jī)的RGB調(diào)色燈程序仿真
  16. 0.86 MB  |  2次下載  |  免費(fèi)

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費(fèi)
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33564次下載  |  免費(fèi)
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費(fèi)
  7. 4開關(guān)電源設(shè)計(jì)實(shí)例指南
  8. 未知  |  21549次下載  |  免費(fèi)
  9. 5電氣工程師手冊免費(fèi)下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費(fèi)
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費(fèi)
  13. 7電子制作實(shí)例集錦 下載
  14. 未知  |  8113次下載  |  免費(fèi)
  15. 8《LED驅(qū)動電路設(shè)計(jì)》 溫德爾著
  16. 0.00 MB  |  6653次下載  |  免費(fèi)

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費(fèi)
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537796次下載  |  免費(fèi)
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420026次下載  |  免費(fèi)
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費(fèi)
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費(fèi)
  11. 6電路仿真軟件multisim 10.0免費(fèi)下載
  12. 340992  |  191185次下載  |  免費(fèi)
  13. 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費(fèi)
  15. 8proe5.0野火版下載(中文版免費(fèi)下載)
  16. 未知  |  138040次下載  |  免費(fèi)