51單片機程序執行流程詳細分析
這里是一個(gè)循環(huán),根據DJNZ指令的功能:每執行一次DJNZ RO, IDATALOOP就將R0的值減1,若R0的值不為0則就跳到IDATALOOP地址去。很顯然這是一個(gè)循環(huán),那么RO的值是多少呢,在以下窗口顯示:
可見(jiàn)r0的初值為0x7f,這里將要循環(huán)0x7f(128)次,具體在這里r0值的含義可查看一下子的。那么在這個(gè)循環(huán)之后程序又將去哪里呢?跳過(guò)這個(gè)循環(huán)后程序運行的地方如下:
再單步運行一次:
根據Disassembly的內容,此條語(yǔ)句執行了就又要回到main函數中去了,執行一下試試:
是的!
所以,在51單片機中,程序的執行流程就是會(huì )不斷( 以r0的值作為延遲條件, 具體含義可繼續探索 )的進(jìn)入main函數中執行main函數中的代碼。
為什么我們在linux等上面運行不帶死循環(huán)的C語(yǔ)言代碼后程序就會(huì )自行終止呢?這是不同的操作流程:
(1) C51單片機不帶OS(操作系統),代碼的執行形勢在此看來(lái)就由STARTUP.A51來(lái)安排了,沒(méi)有一個(gè)更大的程序來(lái)管理怎么調用main函數。
(2) 像Linux這類(lèi)的平臺是帶了OS的,運行一個(gè)C語(yǔ)言程序對linux來(lái)說(shuō)就是一個(gè)任務(wù),除了運行C語(yǔ)言程序這個(gè)任務(wù)外還有其它的任務(wù)。當運行一個(gè)C語(yǔ)言程序完畢時(shí),此次的任務(wù)也算是完成了。如在linux shell界面運行一個(gè)文件名為“hello.c”功能為輸出“hello world!”的C語(yǔ)言程序,過(guò)程如下:
編譯:gcc hello.c –o hello
運行:./hello
在運行hello可執行文件時(shí),可以當做是shell調用了hello這個(gè)可執行程序。在hello運行完畢后,將返回值等返回給shell界面。整個(gè)C語(yǔ)言文件的生死全有linux shell程序管理。
歸其原因,還是代碼規定的機制不一樣吧。
評論