日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

程序结束后去哪儿了?

發(fā)布時(shí)間:2023/12/20 编程问答 64 豆豆
生活随笔 收集整理的這篇文章主要介紹了 程序结束后去哪儿了? 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

大家好,我是寫代碼的籃球球癡,轉(zhuǎn)發(fā)一篇卓老師的文章,文章中的內(nèi)容我之前做單片機(jī)的時(shí)候也有遇到過。

推薦給大家看看~


簡(jiǎn) 介: 對(duì)于嵌入式系統(tǒng),如果沒有運(yùn)行RTOS,那么程序開發(fā)中的 主函數(shù)(main())需要通過某種機(jī)制使其永遠(yuǎn)愉快的運(yùn)行下去,它沒有終點(diǎn)。如果想從main函數(shù)中退出,具體干什么是由所使用的C語言編譯器決定的。
關(guān)鍵詞C51main程序退出

01 問題提出

??今天在CSDN的 ?單片機(jī)led模塊定義函數(shù)的問題[1] ?中看到一個(gè)有趣的問題。提問者在進(jìn)行基本的C51編程實(shí)驗(yàn),編寫了一個(gè)簡(jiǎn)單的C51程序如下:

#include?<REGX51.H>void?test(num)?{switch(num)?{case?1:?P2_0=0;?P2_1=0;?break;} }void?main(void)?{test(1); }

??程序執(zhí)行完之后,可以看到實(shí)驗(yàn)板上的有兩個(gè)LED被點(diǎn)亮,另外六個(gè)居然微微發(fā)亮

▲ 圖1.1 實(shí)驗(yàn)板上的未點(diǎn)亮的LED居然微微發(fā)亮

??如果在主程序中,增加一個(gè)無限循環(huán):while(1); ,則電路板上的就不再會(huì)出現(xiàn)“微微點(diǎn)亮”的現(xiàn)象了。

#include?<REGX51.H>void?test(num)?{switch(num)?{case?1:?P2_0=0;?P2_1=0;?break;} }void?main(void)?{test(1);while(1); }▲ 圖1.2 實(shí)驗(yàn)板上后面六個(gè)LED就不再點(diǎn)亮了

??上面兩種情況的區(qū)別,在于第二個(gè)程序中 主循環(huán) main() 函數(shù)始終沒有退出,而第一個(gè)程序,main() 函數(shù)退出了。似乎前面LED 微微點(diǎn)亮 應(yīng)該與 主函數(shù) 退出之后,單片機(jī)都干了些啥有關(guān)系。

??那么就剩下一個(gè)問題:對(duì)于普通的嵌入式系統(tǒng),C語言編程中 main()函數(shù)退出之后,程序去哪兒了?

02 程序去哪兒了?

??從上面提問者書寫的代碼來看,應(yīng)該是一位C51的愛好者,使用的是C51的編譯器,在一款C51開發(fā)板上愉快的進(jìn)行實(shí)驗(yàn)。他一開始沒有安裝嵌入式程序開發(fā)的慣例 在主程序void main(void) 中利用無限循環(huán)將程序控制在主程序函數(shù)中,就出現(xiàn)了前面實(shí)驗(yàn)結(jié)果中令人迷惑的情況。

注:他是一個(gè)膽大心細(xì)的人,觀察還挺仔細(xì)的。

2.1 盤古開天辟地

??對(duì)于C語言編程來說,所有的用戶程序世界是從主程序 main() ?開始的。給用戶程序開天辟地的任務(wù)是由 一小段 盤古代碼 STARTUP.A51。

??關(guān)于C51是如何啟動(dòng)的, 在如下面博文中也被測(cè)試說明:

  • 51單片機(jī)程序執(zhí)行流程(STARTUP.A51管理Main函數(shù)的執(zhí)行)[2]

??下面截取了 STARTUP.A51 代碼的一段,可以看到盤古在單片機(jī) RESET 之后做了點(diǎn)準(zhǔn)備工作(初始化全局變量、堆棧指針)之后,就直接跳轉(zhuǎn)至:?C_START

NAME?????C_STARTUP?C_C51STARTUP???SEGMENT???CODE ?STACK??????????SEGMENT???IDATARSEG?????STACKDS??????1EXTRN?CODE?(?C_START)PUBLIC???C_STARTUPCSEG????AT??????0 ?C_STARTUP:?????LJMP????STARTUP1RSEG?????C_C51STARTUPSTARTUP1:IF?IDATALEN?<>?0MOV?????R0,#IDATALEN?-?1CLR?????A IDATALOOP:??????MOV?????@R0,ADJNZ????R0,IDATALOOP ENDIFIF?XDATALEN?<>?0MOV?????DPTR,#XDATASTARTMOV?????R7,#LOW?(XDATALEN)IF?(LOW?(XDATALEN))?<>?0MOV?????R6,#(HIGH?(XDATALEN))?+1ELSEMOV?????R6,#HIGH?(XDATALEN)ENDIFCLR?????A XDATALOOP:??????MOVX????@DPTR,AINC?????DPTRDJNZ????R7,XDATALOOPDJNZ????R6,XDATALOOP ENDIFIF?PPAGEENABLE?<>?0MOV?????PPAGE_SFR,#PPAGE ENDIFIF?PDATALEN?<>?0MOV?????R0,#LOW?(PDATASTART)MOV?????R7,#LOW?(PDATALEN)CLR?????A PDATALOOP:??????MOVX????@R0,AINC?????R0DJNZ????R7,PDATALOOP ENDIFIF?IBPSTACK?<>?0 EXTRN?DATA?(?C_IBP)MOV??????C_IBP,#LOW?IBPSTACKTOP ENDIFIF?XBPSTACK?<>?0 EXTRN?DATA?(?C_XBP)MOV??????C_XBP,#HIGH?XBPSTACKTOPMOV??????C_XBP+1,#LOW?XBPSTACKTOP ENDIFIF?PBPSTACK?<>?0 EXTRN?DATA?(?C_PBP)MOV??????C_PBP,#LOW?PBPSTACKTOP ENDIFMOV?????SP,#?STACK-1LJMP?????C_STARTEND

??上面的代碼也被博文 ?51單片機(jī)程序執(zhí)行流程(STARTUP.A51)[3] 中進(jìn)行逐步調(diào)試跟蹤驗(yàn)證過:

▲ 圖2.1.1 ?顯示LJMP C_START 就是進(jìn)入 main() 程序

2.2 世界盡頭

??由于進(jìn)入main() 函數(shù)是長(zhǎng)跳轉(zhuǎn),所以main函數(shù)是不會(huì)正常返回到啟動(dòng)程序 STARTUP.A51,那么程序去哪了?

??在博文 單片機(jī)C語言while(1)的問題 中作者對(duì)于 KEIL編譯器和PIC的 MAPLAB編譯器對(duì)于main函數(shù)的最后時(shí)光進(jìn)行了反匯編查看。

2.2.1 Keil編譯器

??在main函數(shù)的最后,程序增加了一下幾行代碼:

MOV?R0,?#0x7F CLR?A MOV?@R0,?A DJNZ?R0,?(3) MOV?SP,?#0x0C LJMP?main

??這幾條語句,前4條,是將我們單片機(jī)的內(nèi)存的前128個(gè)地址清零,第5條,是定義堆棧,第6條,是將程序重新跳轉(zhuǎn)到main函數(shù)的首行進(jìn)行執(zhí)行。

2.2.2 MAPLAB編譯器

??PIC 單片機(jī)語言程序進(jìn)行跟蹤,發(fā)現(xiàn)main() 函數(shù)最后一條語句為 reset,也就是單片機(jī)直接復(fù)位,這是 MAPLAB編譯器根據(jù) PIC 單片機(jī)特點(diǎn)增加的復(fù)位語句。

※ 總??結(jié) ※

??對(duì)于嵌入式系統(tǒng),如果沒有運(yùn)行RTOS,那么程序開發(fā)中的 主函數(shù)(main())需要通過某種機(jī)制使其永遠(yuǎn)愉快的運(yùn)行下去,它沒有終點(diǎn)。

??如果想從main函數(shù)中退出,具體干什么是由所使用的C語言編譯器決定的。

參考資料

[1]

單片機(jī)led模塊定義函數(shù)的問題: https://ask.csdn.net/questions/7640604?utm_medium=distribute.pc_feed_v2.none-task-ask-ask_personrec_tag-3.pc_personrecdepth_1-utm_source=distribute.pc_feed_v2.none-task-ask-ask_personrec_tag-3.pc_personrec

[2]

51單片機(jī)程序執(zhí)行流程(STARTUP.A51管理Main函數(shù)的執(zhí)行): https://blog.csdn.net/ChenGuiGan/article/details/88769619

[3]

51單片機(jī)程序執(zhí)行流程(STARTUP.A51): https://blog.csdn.net/tangsun999/article/details/45604507

總結(jié)

以上是生活随笔為你收集整理的程序结束后去哪儿了?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。