色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言編程中main()函數(shù)退出之后程序去哪兒了

h1654155149.6853 ? 來源:TsinghuaJoking ? 作者:TsinghuaJoking ? 2022-03-22 17:44 ? 次閱讀
對(duì)于嵌入式系統(tǒng),如果沒有運(yùn)行RTOS,那么程序開發(fā)中的主函數(shù)main()需要通過某種機(jī)制使其永遠(yuǎn)愉快的運(yùn)行下去,它沒有終點(diǎn)。如果想從main函數(shù)中退出,具體干什么是由所使用的C語言編譯器決定的。

一、問題提出

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

#include

voidtest(num){
switch(num){
case1:P2_0=0;P2_1=0;
break;
}
}

voidmain(void){
test(1);
}

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

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

#include

voidtest(num){
switch(num){
case1:P2_0=0;P2_1=0;
break;
}
}

voidmain(void){
test(1);
while(1);
}

上面兩種情況的區(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ù)退出之后,程序去哪兒了?

二、程序去哪兒了?

從上面提問者書寫的代碼來看,應(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。

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

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

NAME?C_STARTUP

?C_C51STARTUPSEGMENTCODE
?STACKSEGMENTIDATA

RSEG?STACK
DS1

EXTRNCODE(?C_START)
PUBLIC?C_STARTUP

CSEGAT0
?C_STARTUP:LJMPSTARTUP1

RSEG?C_C51STARTUP

STARTUP1:

IFIDATALEN<>0
MOVR0,#IDATALEN-1
CLRA
IDATALOOP:MOV@R0,A
DJNZR0,IDATALOOP
ENDIF

IFXDATALEN<>0
MOVDPTR,#XDATASTART
MOVR7,#LOW(XDATALEN)
IF(LOW(XDATALEN))<>0
MOVR6,#(HIGH(XDATALEN))+1
ELSE
MOVR6,#HIGH(XDATALEN)
ENDIF
CLRA
XDATALOOP:MOVX@DPTR,A
INCDPTR
DJNZR7,XDATALOOP
DJNZR6,XDATALOOP
ENDIF

IFPPAGEENABLE<>0
MOVPPAGE_SFR,#PPAGE
ENDIF

IFPDATALEN<>0
MOVR0,#LOW(PDATASTART)
MOVR7,#LOW(PDATALEN)
CLRA
PDATALOOP:MOVX@R0,A
INCR0
DJNZR7,PDATALOOP
ENDIF

IFIBPSTACK<>0
EXTRNDATA(?C_IBP)

MOV?C_IBP,#LOWIBPSTACKTOP
ENDIF

IFXBPSTACK<>0
EXTRNDATA(?C_XBP)

MOV?C_XBP,#HIGHXBPSTACKTOP
MOV?C_XBP+1,#LOWXBPSTACKTOP
ENDIF

IFPBPSTACK<>0
EXTRNDATA(?C_PBP)
MOV?C_PBP,#LOWPBPSTACKTOP
ENDIF

MOVSP,#?STACK-1
LJMP?C_START

END

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

a5fdb2e6-964d-11ec-952b-dac502259ad0.png

2.2 世界盡頭

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

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

Keil編譯器

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

MOVR0,#0x7F
CLRA
MOV@R0,A
DJNZR0,(3)
MOVSP,#0x0C
LJMPmain

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

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語言編譯器決定的。

原文標(biāo)題:干貨|單片機(jī)的程序結(jié)束后都干嘛去了?

文章出處:【微信公眾號(hào):電子工程世界】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6035

    文章

    44554

    瀏覽量

    634660
  • 嵌入式系
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    13986
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7604

    瀏覽量

    136694

原文標(biāo)題:干貨|單片機(jī)的程序結(jié)束后都干嘛去了?

文章出處:【微信號(hào):電子工程世界,微信公眾號(hào):電子工程世界】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C語言main函數(shù)的正確寫法

    大家好,我是嵌入式老林,從事嵌入式軟件開發(fā)多年,今天分享的內(nèi)容是C語言main函數(shù)的正確寫法,希望能對(duì)你有所幫助
    發(fā)表于 07-11 11:51 ?1262次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>main</b><b class='flag-5'>函數(shù)</b>的正確寫法

    ARM啟動(dòng)文件的__main, 介紹C啟動(dòng)函數(shù)的設(shè)計(jì)

    ARM啟動(dòng)文件的__main, 介紹C啟動(dòng)函數(shù)的設(shè)計(jì)
    發(fā)表于 09-20 09:34 ?9次下載
    ARM啟動(dòng)文件<b class='flag-5'>中</b>的__<b class='flag-5'>main</b>, 介紹<b class='flag-5'>了</b><b class='flag-5'>C</b>啟動(dòng)<b class='flag-5'>函數(shù)</b>的設(shè)計(jì)

    小波c語言程序

    主要介紹小波c語言程序,小波閾值噪就是對(duì)信號(hào)進(jìn)行分解,然后對(duì)分解后的系數(shù)進(jìn)行閾值處理,最
    發(fā)表于 01-10 16:11 ?1.5w次閱讀

    C語言程序main函數(shù)免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語言程序main函數(shù)免費(fèi)下載。
    發(fā)表于 09-26 14:48 ?3次下載

    STM8的C語言編程基本程序與啟動(dòng)代碼分析

    現(xiàn)在幾乎所有的單片機(jī)都能用 C 語言編程,采用 C 語言
    發(fā)表于 08-18 08:00 ?3次下載
    STM8的<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>編程</b>基本<b class='flag-5'>程序</b>與啟動(dòng)代碼分析

    C語言main函數(shù)有幾種寫法?

    從學(xué)習(xí)C語言開始就一直寫個(gè)一個(gè)函數(shù),那么你知道它的標(biāo)準(zhǔn)寫法什么什么樣嗎? main函數(shù),又稱主函數(shù)
    的頭像 發(fā)表于 10-15 11:04 ?3305次閱讀

    深度剖析C語言main函數(shù)

    main的返回值 main函數(shù)的返回值用于說明程序退出狀態(tài)。如果返回0,則代表程序正常
    的頭像 發(fā)表于 12-18 17:07 ?4389次閱讀

    C51單片機(jī)C語言程序設(shè)計(jì)解析的學(xué)習(xí)課件免費(fèi)下載

    C語言程序采用函數(shù)結(jié)構(gòu),每個(gè)C語言程序由一個(gè)或多個(gè)
    發(fā)表于 02-01 09:58 ?12次下載
    <b class='flag-5'>C</b>51單片機(jī)<b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>程序</b>設(shè)計(jì)解析的學(xué)習(xí)課件免費(fèi)下載

    探究一下C語言main函數(shù)各種不同的寫法

    main函數(shù)C程序的入口函數(shù),即程序的執(zhí)行是從main
    發(fā)表于 08-07 17:26 ?1112次閱讀
    探究一下<b class='flag-5'>C</b><b class='flag-5'>語言</b>中<b class='flag-5'>main</b><b class='flag-5'>函數(shù)</b>各種不同的寫法

    單片機(jī)led模塊定義函數(shù)程序

    正常的程序,都不會(huì)跳出main,但是,如果跳出了 main 函數(shù)程序到底
    的頭像 發(fā)表于 08-25 10:42 ?918次閱讀

    單片機(jī)main()函數(shù)退出之后程序會(huì)跑去哪里?

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

    C語言編程main函數(shù)退出程序哪兒?

    PIC 單片機(jī)語言程序進(jìn)行跟蹤,發(fā)現(xiàn)main() 函數(shù)最后一條語句為 reset,也就是單片機(jī)直接復(fù)位,這是 MAPLAB編譯器根據(jù) PIC 單片機(jī)特點(diǎn)增加的復(fù)位語句。
    發(fā)表于 05-31 15:28 ?419次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語言</b><b class='flag-5'>編程</b><b class='flag-5'>中</b><b class='flag-5'>main</b><b class='flag-5'>函數(shù)</b><b class='flag-5'>退出</b>后<b class='flag-5'>程序</b><b class='flag-5'>去</b><b class='flag-5'>哪兒</b><b class='flag-5'>了</b>?

    main函數(shù)不一定就是程序入口

    寫個(gè)測(cè)試代碼,代碼中有main函數(shù),也有test函數(shù),test就是剛才我們說的入口,不過得指定退出方式,要不然程序運(yùn)行的時(shí)候會(huì)出問題。
    的頭像 發(fā)表于 06-15 17:12 ?643次閱讀

    為什么Python沒有main函數(shù)?

    今天的文章,我們來討論一下為什么有的編程語言main函數(shù),而Python為什么沒有main
    發(fā)表于 08-17 11:47 ?322次閱讀

    c語言程序main函數(shù)的位置

    C語言程序main函數(shù)程序的入口點(diǎn),它被認(rèn)為
    的頭像 發(fā)表于 11-24 10:23 ?2506次閱讀
    主站蜘蛛池模板: 总裁呻吟双腿大开男男H| 日本漂亮妈妈7观整有限中| 性绞姿始动作动态图| 亚洲国产精品一区二区第一页| 校园纯肉H教室第一次| 13小箩利洗澡无码视频APP| 国产精品久久久久久久人热| 欧美丰满熟妇无码XOXOXO| 影音先锋电影资源av| 国精产品砖一区二区三区糖心 | 苍老师刺激的120分钟| 欧美 日韩 无码 有码 在线| 成年性生交大片免费看| 亚洲第一页视频| 美女被爆羞羞天美传媒| 刺激一区仑乱| 亚洲宅男天堂a在线| 日韩人妻无码精品-专区 | CHINA学生白嫩| 天美传媒在线观看完整高清| 办公室的秘密2中文字幕| 免费看成人毛片| 99精品久久| 秋霞电影院兔费理论观频84mb| xx顶级欧美熟妞xxhd| 视频专区亚洲欧美日韩| 国产99久久九九免费精品无码 | 免费a毛片| 99re 这里只有精品| 农民工老头在出租屋嫖老熟女| 99在线国产视频| 免费在线视频a| jizzjizz丝袜| 男男免费看| 久久99国产精品一区二区| 亚洲欧美偷拍视频一区| 红尘影院手机在线观看| 亚洲免费黄色片| 狠狠啪 日日啪| 亚洲精品高清中文字幕完整版| 国产乱码二卡3卡四卡|