新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > 51單片機程序執(zhí)行流程詳細分析

51單片機程序執(zhí)行流程詳細分析

作者: 時間:2016-11-29 來源:網(wǎng)絡 收藏

這里是一個循環(huán),根據(jù)DJNZ指令的功能:每執(zhí)行一次DJNZ RO, IDATALOOP就將R0的值減1,若R0的值不為0則就跳到IDATALOOP地址去。很顯然這是一個循環(huán),那么RO的值是多少呢,在以下窗口顯示:

可見r0的初值為0x7f,這里將要循環(huán)0x7f(128)次,具體在這里r0值的含義可查看一下子的。那么在這個循環(huán)之后程序又將去哪里呢?跳過這個循環(huán)后程序運行的地方如下:

再單步運行一次:

根據(jù)Disassembly的內(nèi)容,此條語句執(zhí)行了就又要回到main函數(shù)中去了,執(zhí)行一下試試:

是的!

所以,在51單片機中,程序的執(zhí)行流程就是會不斷( 以r0的值作為延遲條件, 具體含義可繼續(xù)探索 )的進入main函數(shù)中執(zhí)行main函數(shù)中的代碼。

為什么我們在linux等上面運行不帶死循環(huán)的C語言代碼后程序就會自行終止呢?這是不同的操作流程:

(1) C51單片機不帶OS(操作系統(tǒng)),代碼的執(zhí)行形勢在此看來就由STARTUP.A51來安排了,沒有一個更大的程序來管理怎么調(diào)用main函數(shù)。

(2) 像Linux這類的平臺是帶了OS的,運行一個C語言程序?qū)inux來說就是一個任務,除了運行C語言程序這個任務外還有其它的任務。當運行一個C語言程序完畢時,此次的任務也算是完成了。如在linux shell界面運行一個文件名為“hello.c”功能為輸出“hello world!”的C語言程序,過程如下:

編譯:gcc hello.c –o hello

運行:./hello

在運行hello可執(zhí)行文件時,可以當做是shell調(diào)用了hello這個可執(zhí)行程序。在hello運行完畢后,將返回值等返回給shell界面。整個C語言文件的生死全有l(wèi)inux shell程序管理。

歸其原因,還是代碼規(guī)定的機制不一樣吧。


上一頁 1 2 下一頁

評論


技術專區(qū)

關閉