51單片機程序執行過程圖解分析
51單片機程序執行過程圖解分析
一個很簡單的程序試一下。
執行以上程序,由P1端口控製的流水燈閃了一下。程序最終進入while(1);裏糾纏去了,這個到好解釋。
現將while(1);語句屏蔽掉。我還以為程序不能被正確執行了呢,因為退出了main主函數,就像Render需要循環來實現一樣(盡管剛剛閃燈的程序不在循環之內,但我還是不由產生了這一錯覺)。程序執行的結果是:流水燈不停的閃爍!
看到這個現象後的猜想及動作^-^:
(1) 這塊板壞了吧!(在帶操作係統如linux字符界麵下運行一個不帶死循環的C語言文件完畢後就會返回到linux shell程序中)。趕緊換個板再測試一下,顯然還是一樣的結果。
(2) 單片機中將一直執行main函數中的最後一個(些)語句?(基於帶OS平台下運行標準C語言文件的經驗,可從來沒有想過是main函數被多次調用或多次進入)
(3) 單片機內將C語言指令取出來加載到單片機內,單片機內自動生成一個主程序循環執行C語言中main函數的內容?(雖然很荒唐,還是想了)
(4) 趕快穀歌百度一下單片機的執行流程(雖然在穀歌百度時以“51單片機程序執行流程”搜索,沒有搜到相關內容)。換樸實的搜索詞:“51單片機 main”。然後就出現跟我一樣帶有疑問的問題:為什麼main函數中不加while(1);語句之後程序會反複執行呢?回答的關鍵詞包括“程序跑飛、看門狗、複位”。
(5) 趁上嵌入式的機會將“51單片機程序執行流程”搬出來並向老師講述了我所寫程序的得到的現象,包括我怎麼驗證呀等等。
老師的回答:Keil C51程序自動加載了一個名為”STARTUP.A51”的文件,在這個文件裏麵進行了一係列的初始化操作後進入用戶編寫的C語言程序入口main函數中,main函數執行完畢後,STARTUP.A51文件後有一句跳轉到程序入口main函數的語句,所以會再次進入C語言主程序main函數中執行相關內容。
然後我用keil軟件模擬了運行一下以上那一段代碼:
程序開始運行就在程序入口main函數的第一條語句之處,Disassembly窗口是c語言代碼與彙編代碼相對應的窗口,前麵是地址,後麵的是C語言對應的彙編語句。下麵的窗口是相應文件的運行代碼的位置,由黃色箭頭指向當前正要執行的代碼。然後點擊單步運行工具條,指導跳出main函數為止,程序跳轉到STARTUP.A51中的以下代碼位置:
這裏是一個循環,根據DJNZ指令的功能:每執行一次DJNZ RO, IDATALOOP就將R0的值減1,若R0的值不為0則就跳到IDATALOOP地址去。很顯然這是一個循環,那麼RO的值是多少呢,在以下窗口顯示:
可見r0的初值為0x7f,這裏將要循環0x7f(128)次,具體在這裏r0值的含義可查看一下子的。那麼在這個循環之後程序又將去哪裏呢?跳過這個循環後程序運行的地方如下:
在單步運行一次:
根據Disassembly的內容,此條語句執行了就又要回到main函數中去了,執行一下試試:
是的!
所以,在51單片機中,程序的執行流程就是會不斷( 以r0的值作為延遲條件, 具體含義可繼續探索 )的進入main函數中執行main函數中的代碼。
為什麼我們在linux等上麵運行不帶死循環的C語言代碼後程序就會自行終止呢?這是不同的操作流程:
(1) C51單片機不帶OS(操作係統),代碼的執行形勢在此看來就由STARTUP.A51來安排了,沒有一個更大的程序來管理怎麼調用main函數。
(2) 像Linux這類的平台是帶了OS的,運行一個C語言程序對linux來說就是一個任務,除了運行C語言程序這個任務外還有其它的任務。當運行一個C語言程序完畢時,此次的任務也算是完成了。如在linux shell界麵運行一個文件名為“hello.c”功能為輸出“hello world!”的C語言程序,過程如下:
編譯:gcc hello.c –o hello
運行:./hello
在運行hello可執行文件時,可以當做是shell調用了hello這個可執行程序。在hello運行完畢後,將返回值等返回給shell界麵。整個C語言文件的生死全有linux shell程序管理。
初學單片機從51入門的好處 | |
51單片機是一款已經出現很久的單片機,它的出現可以說是劃時代的。同時期出現的其它單片機都已經逐漸退出曆史的舞台,而它卻依舊出現在某些專業的教材上。從這點來看,它依舊有其學習的意義。下麵說說初學單片機從51入門的好處。 51單片機的學習資源非常多... |
如何使用C語言控製硬件 | |
C語言的應用編程在單片機的領域占了很大一部分,使用的比較多的51單片機和STM32單片機都可以使用MDK軟件編寫固件。 單片機燒寫了固件後可以點亮LED燈,可以驅動ADC檢測電壓,也可以驅動蜂鳴器發聲,這就是簡單地控製硬件。稍微複雜一點的,可以驅動NRF2401進... |
c語言怎麼讀取一個變量的二進製文件內容 | |
C語言是一種高級語言,很多設置都為了符合我們程序員的理解做了相應的調整。機器對於變量的理解是基於電路,也就是所謂的高低電平。也是因為這個出現了一個二進製。 而人類的計數更喜歡使用十進製,有專家說是因為是人類當初計數使用的手指,這樣十進製比較... |
單片機為啥叫單片機 | |
1、MCU 我一般在工作計劃和原理圖的說明上,就直接將STM32或者STC89的單片機,標注為MCU。 無論是理解為Micro CPU,還是Microcontroller Unit,我認為都行,也沒有仔細去區分去過。自從32位單片機出來後,一些單片機設計的係統確實是具備部分電腦的功能。 你... |
16位單片機低端打不過8位高端打不過32位怎 | |
有時間去了解一下TI的MPS係列的單片機,它的低功耗和8位的51還有32位的STM32還是有一定的區別度的。 就比如MSP430係列,一些醫療的應用也少不了它,其各種低功耗的應用和例子一抓一大把。 也許從價格上來說,感覺,8位的便宜好買;從性能上來說,感覺,32位的... |
- 單片機和嵌入式哪個好
- 單片機重要特性含義解讀
- 單片機三總線結構及時序分析
- 單片機沒有PWM外設也可以做可調占空比
- 開源硬件arduino是什麼
- 標誌寄存器中的狀態標誌和控製標誌
- at89c51和stc12c5a60s2的引腳的區別
- 學習51單片機要用到哪些硬件工具
- 單片機定時的時間怎麼改變
- 單片機自動斷電或關機電路圖講解
- 串口的波特率如何計算?串口通信波特率計
- 單片機波特率計算公式和方法
- 51單片機ram區域劃分
- spi時序圖怎麼看?spi時序圖閱讀方法
- 51單片機怎麼顯示出數字的?單片機數碼管
- 51單片機有幾個中斷源_52單片機中斷源
- 嵌入式係統的評價方法
- AT89C51單片機為核心的時鍾電路的程序設
- stm32學到什麼程度叫精通
- 用STM32隻會庫函數不會用寄存器有影響嗎