資料介紹
單片機C語言的主程序,通常要用一個while(1)語句來讓程序進入一個無限循環,目的是為了讓程序一直保持在我們需要運行的情況下。
雖然這種做法毋庸置疑,在網上還是有不少朋友有疑問,如果程序不加while(1)會出現什么情況,對于這種好學精神,還是值得贊揚的,做學問就需要有追根問底的精神。
首先,大家要理解一件事情,我們編寫的C語言程序,最終下載到單片機當中去,在我們單片機的程序存儲空間FLASH當中存儲的全部是2進制數字代碼。比如0x00,0x01,一直到0xff。而我們編寫的C代碼,依靠的是編譯軟件,比如keil軟件,首先將C語言編譯成為匯編語言,最終匯編語言變成2進制代碼,也就是我們的HEX文件當中的數據,下載到單片機當中去。
因此,查找這個問題,首先從源頭來找,首先是C語言,然后,我們再看一下軟件給我們編譯的匯編語言是什么樣子。用KEIL軟件編寫一個程序,然后simulator的方式進行仿真,進入仿真環境后,在View窗口下有個Disassembly window,打開,里邊就會出現剛才我們的C語言所對應的匯編語言了(KEIL軟件會自動將C編譯成匯編),找到里邊的主函數,找到你最后一行的程序所對應的匯編,找到后,會發現在最后一行程序結束后,KEIL這個軟件還會自動給加入幾行匯編代碼,這幾行代碼就是(1)MOV R0, #0x7F;(2)CLR A; (3)MOV @R0, A; (4) DJNZ R0, (3); (5)MOV SP, #0x0C;(6) LJMP main;這幾條語句,前4條,是將我們單片機的內存的前128個地址清零,第5條,是定義堆棧,第6條,是將程序重新跳轉到main函數的首行進行執行。
從這里我們可以看出,最終下載到單片機運行的程序包含兩部分,一部分是我們編寫的程序代碼,另外一部分是編譯器自動生成的代碼,因此,用KEIL軟件編寫的程序在沒有while(1)的情況下運行到最后一行,會自動跳轉到main函數第一行運行。
本著嚴謹的態度,筆者又查找PIC單片機的編譯開發環境MAPLAB IDE,找到其中的匯編程序,在Disassembly window匯編程序中沒有發現跳轉到主函數的語句或者是復位語句。筆者不甘心,于是繼續查找,打開了Promgram Memory,這也是最終下載到單片機當中的程序,通過仔細查看筆者在其后邊,發現了在main函數的最后,有一條“reset”語句,這是一條PIC單片機的復位語句,也就是說PIC單片機在進行程序編譯的過程中,如果沒有while(1)語句,最后則會直接執行復位,這MAPLAB隱藏的可夠深的。
我在論壇上看到一個發帖者提出他下載進AVR單片機的沒有while(1)的程序,但是單片機卻沒有復位,這點我沒有再去驗證,因為我們的程序通常都是要加while(1)這個循環,因此呢,問題到了這里,單片機程序沒有while(1)會出現什么情況,這一點已經不重要了。但是有一點已經可以確認了,一部分單片機在沒有while(1)的情況下,運行到最后一行出現的情況受到編譯開發環境的影響。
當然了,一個嚴謹的開發環境,就應該像KEIL和MAPLAB這樣,在程序員編譯程序可能出現漏洞的地方給與防護,避免程序跑飛程序員無法查找程序問題。
深有體會。剛學單片機不久,參考別人的程序寫了LCD驅動,在買來的實驗板上運行時,顯示正常。在自己用面包板上搭建的系統運行時,只能顯示幾秒鐘,之后一片空白,當時懷疑面包板供電不穩定,或者信號線干擾,折騰幾小時后,在程序末尾加一句“while(1);”,顯示完全正常。
不加不穩定,有時候會在main()里面循環,有時候會亂碼。
這里的while(1)并不是防止程序“跑飛”的,而是防止main()返回。
① 在嵌入式中main是不能返回的。不同的C語言實現的單片機初始化代碼會有不同的表現,有的是在call _main后jmp,而有的是jmp 0,等等這些會導致不可預料的結果。
② 在我們寫的C語言后轉換成匯編,再觀察單片機的代碼區,你會發現沒有寫程序的部分例如全1或者全0區域,程序運行到這里,就會有可能造成意料不到的結果。若無while(1)循環,程序全部執行后,跳轉至程序起始處重新執行。
- RAM在單片機里有什么樣的作用?
- 《PIC單片機C語言》pdf 0次下載
- 單片機C語言程序與數據存儲
- C語言和單片機C語言為什么會有差異?雖不同但理同!
- [ 愛找茬 ]都是C語言,單片機C語言和普通的C語言究竟有什么差異呢?
- 1.單片機和C語言的關系(5)
- 單片機C語言和匯編語言混合編程實例詳解 224次下載
- PIC單片機的C語言編程電子版下載 0次下載
- 單片機上拉電阻有什么樣的作用好使用原則詳細說明
- 單片機C語言中如何使用nop函數進行短延時的效果資料和程序說明 10次下載
- C51單片機C語言與標準C語言有什么區別? 134次下載
- 單片機C語言code與data的作用 1次下載
- 8051單片機C語言軟件設計8051單片機C語言軟件設計 92次下載
- 單片機C語言中常用到的關鍵字及數據類型 13次下載
- AVR單片機C語言總綱
- 什么是C語言?單片機有什么特點?為什么要用C語言編程? 1264次閱讀
- C語言怎么跳出while函數 3.5w次閱讀
- 單片機液晶漢字顯示的C語言程序 4885次閱讀
- 單片機為什么需要晶振?晶振在單片機中有什么樣的作用 2.1w次閱讀
- 新手教程:單片機的學習實踐步驟 3819次閱讀
- C語言中#和##符號有什么樣的作用 4.5w次閱讀
- 學習單片機一定要先學好C語言再去學單片機嗎 1.3w次閱讀
- 單片機C語言有哪些優越性?如何建立一個Keil C51項目 1.2w次閱讀
- 單片機C語言的求平方根怎么實現 3462次閱讀
- RAM在單片機里有什么樣的作用 6262次閱讀
- 單片機C語言之串口通信協議 4773次閱讀
- 單片機仿真器有什么用?單片機仿真器作用介紹 1.7w次閱讀
- pic單片機io口控制教程之c語言編程實現 1.1w次閱讀
- 單片機編程之匯編語言基礎-常用指令和程序模式 1.5w次閱讀
- 單片機C語言知識點全攻略(一) 5w次閱讀
下載排行
本周
- 1TC358743XBG評估板參考手冊
- 1.36 MB | 330次下載 | 免費
- 2開關電源基礎知識
- 5.73 MB | 6次下載 | 免費
- 3100W短波放大電路圖
- 0.05 MB | 4次下載 | 3 積分
- 4嵌入式linux-聊天程序設計
- 0.60 MB | 3次下載 | 免費
- 5基于FPGA的光纖通信系統的設計與實現
- 0.61 MB | 2次下載 | 免費
- 651單片機窗簾控制器仿真程序
- 1.93 MB | 2次下載 | 免費
- 751單片機大棚環境控制器仿真程序
- 1.10 MB | 2次下載 | 免費
- 8基于51單片機的RGB調色燈程序仿真
- 0.86 MB | 2次下載 | 免費
本月
- 1OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 2555集成電路應用800例(新編版)
- 0.00 MB | 33564次下載 | 免費
- 3接口電路圖大全
- 未知 | 30323次下載 | 免費
- 4開關電源設計實例指南
- 未知 | 21549次下載 | 免費
- 5電氣工程師手冊免費下載(新編第二版pdf電子書)
- 0.00 MB | 15349次下載 | 免費
- 6數字電路基礎pdf(下載)
- 未知 | 13750次下載 | 免費
- 7電子制作實例集錦 下載
- 未知 | 8113次下載 | 免費
- 8《LED驅動電路設計》 溫德爾著
- 0.00 MB | 6653次下載 | 免費
總榜
- 1matlab軟件下載入口
- 未知 | 935054次下載 | 免費
- 2protel99se軟件下載(可英文版轉中文版)
- 78.1 MB | 537796次下載 | 免費
- 3MATLAB 7.1 下載 (含軟件介紹)
- 未知 | 420026次下載 | 免費
- 4OrCAD10.5下載OrCAD10.5中文版軟件
- 0.00 MB | 234315次下載 | 免費
- 5Altium DXP2002下載入口
- 未知 | 233046次下載 | 免費
- 6電路仿真軟件multisim 10.0免費下載
- 340992 | 191185次下載 | 免費
- 7十天學會AVR單片機與C語言視頻教程 下載
- 158M | 183279次下載 | 免費
- 8proe5.0野火版下載(中文版免費下載)
- 未知 | 138040次下載 | 免費
評論
查看更多