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

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

單片機main()函數退出之后,程序會跑去哪里?

dyquk4xk2p3d ? 來源:TsinghuaJoking ? 2023-03-30 10:01 ? 次閱讀

對于嵌入式系統,如果沒有運行RTOS,那么程序開發中的主函數main()需要通過某種機制使其永遠愉快的運行下去,它沒有終點。如果想從main函數中退出,具體干什么是由所使用的C語言編譯器決定的。

一、問題提出

單片機led模塊定義函數中看到一個有趣的問題。提問者在進行基本的C51編程實驗,編寫了一個簡單的C51程序如下:

#include

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

voidmain(void){
test(1);
}

程序執行完之后,可以看到實驗板上的有兩個LED被點亮,另外六個居然微微發亮。

a8229fca-ce8a-11ed-bfe3-dac502259ad0.png

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

#include

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

voidmain(void){
test(1);
while(1);
}
a8c10372-ce8a-11ed-bfe3-dac502259ad0.png

上面兩種情況的區別,在于第二個程序中主循環 main()函數始終沒有退出,而第一個程序,main()函數退出了。似乎前面LED微微點亮 應該與主函數退出之后,單片機都干了些啥有關系。

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

二、程序去哪兒了?

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

注:他是一個膽大心細的人,觀察還挺仔細的。

2.1 盤古開天辟地

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

51單片機程序執行流程(STARTUP.A51管理Main函數的執行)

下面截取了STARTUP.A51 代碼的一段,可以看到盤古在單片機RESET之后做了點準備工作(初始化全局變量、堆棧指針)之后,就直接跳轉至:?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單片機程序執行流程(STARTUP.A51)中進行逐步調試跟蹤驗證過:

a92449c8-ce8a-11ed-bfe3-dac502259ad0.png

2.2 世界盡頭

由于進入main()函數是長跳轉,所以main函數是不會正常返回到啟動程序STARTUP.A51,那么程序去哪了?

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

Keil編譯器

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

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

這幾條語句,前4條,是將我們單片機的內存的前128個地址清零,第5條,是定義堆棧,第6條,是將程序重新跳轉到main函數的首行進行執行。

MAPLAB編譯器

PIC 單片機語言程序進行跟蹤,發現main() 函數最后一條語句為 reset,也就是單片機直接復位,這是 MAPLAB編譯器根據 PIC 單片機特點增加的復位語句。

總結

對于嵌入式系統,如果沒有運行RTOS,那么程序開發中的主函數(main())需要通過某種機制使其永遠愉快的運行下去,它沒有終點。如果想從main函數中退出,具體干什么是由所使用的C語言編譯器決定的。

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • C語言
    +關注

    關注

    180

    文章

    7604

    瀏覽量

    136692
  • 函數
    +關注

    關注

    3

    文章

    4327

    瀏覽量

    62573
  • RTOS
    +關注

    關注

    22

    文章

    811

    瀏覽量

    119595
  • main
    +關注

    關注

    0

    文章

    38

    瀏覽量

    6158
  • maplab
    +關注

    關注

    0

    文章

    3

    瀏覽量

    1259

原文標題:單片機main()函數退出之后,程序會跑去哪里?

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    單片機main函數在中斷函數里執行?

    最近看了硬漢分享的一個內容:為什么復位中斷服務程序里面直接調用的main函數,難道所有程序都在復位中斷里面執行的?
    發表于 10-24 11:04 ?961次閱讀

    請問單片機main函數是執行一次,還是反復執行?

    ; //電機運行一段時間motor = 0;//電機停}按程序邏輯,電機應該是運行一就停止的,但是下載到板子之后,電機一直運行。在程序最后加了while死循環
    發表于 03-20 08:42

    請問單片機main函數是執行一次還是反復執行?

    請問單片機main函數是執行一次,還是反復執行?
    發表于 10-19 06:25

    請問單片機main函數是執行一次還是反復執行?

    motor = 0;//電機停 } 按程序邏輯,電機應該是運行一就停止的,但是下載到板子之后,電機一直運行。 在程序最后加了while死循環之后
    發表于 10-23 06:20

    AVR單片機的延時函數程序免費下載

    本文檔的主要內容詳細介紹的是AVR單片機的延時函數程序免費下載
    發表于 11-16 08:00 ?7次下載
    AVR<b class='flag-5'>單片機</b>的延時<b class='flag-5'>函數</b><b class='flag-5'>程序</b>免費下載

    單片機學習教程之C程序的簡單介紹

    包含頭文件:現學習的是C51 單片機,所以需要的頭文件是#include《reg51.h》程序的主函數, main 函數
    發表于 11-19 17:24 ?12次下載

    深度剖析C語言的main函數

    main的返回值 main函數的返回值用于說明程序退出狀態。如果返回0,則代表程序正常
    的頭像 發表于 12-18 17:07 ?4388次閱讀

    STM32程序無法進入main函數的解決方法

    很多人在基于STM32單片機項目開發過程中,遇到STM32程序無法進入main的現象,在這篇文將分享STM32程序無法進入
    的頭像 發表于 07-22 16:18 ?1.6w次閱讀

    單片機 keil c語言字符比較函數的使用 使用strcmp();

    (const char *str1, const char *str2) 把 str1 所指向的字符串和 str2 所指向的字符串進行比較。菜鳥的鏈接32單片機中的使用示例1.要在單片機中使用我們要先添加頭文件:string.h不然程序
    發表于 11-21 15:06 ?17次下載
    <b class='flag-5'>單片機</b> keil  c語言字符比較<b class='flag-5'>函數</b>的使用 使用strcmp();

    STM32系列單片機在進入main函數前都在干些什么?

    在剛開始學習單片機的時候,一直以為程序啟動后就直接進入到了main函數,但是隨著學習的深入才發現,程序在進入
    發表于 11-23 18:21 ?12次下載
    STM32系列<b class='flag-5'>單片機</b>在進入<b class='flag-5'>main</b><b class='flag-5'>函數</b>前都在干些什么?

    單片機 keil調試的時候進入不了main函數

    單片機 keil調試的時候進入不了main函數
    發表于 12-03 20:51 ?6次下載
    <b class='flag-5'>單片機</b> keil調試的時候進入不了<b class='flag-5'>main</b><b class='flag-5'>函數</b>

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

    對于嵌入式系統,如果沒有運行RTOS,那么程序開發中的主函數main()需要通過某種機制使其永遠愉快的運行下去,它沒有終點。如果想從main函數
    的頭像 發表于 03-22 17:44 ?2714次閱讀

    C語言編程中main函數退出程序去哪兒了?

    PIC 單片機語言程序進行跟蹤,發現main() 函數最后一條語句為 reset,也就是單片機直接復位,這是 MAPLAB編譯器根據 PIC
    發表于 05-31 15:28 ?419次閱讀
    C語言編程中<b class='flag-5'>main</b><b class='flag-5'>函數</b><b class='flag-5'>退出</b>后<b class='flag-5'>程序</b>去哪兒了?

    main函數不一定就是程序入口

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

    單片機main函數結束干嘛去了?

    單片機main函數結束干嘛去了?
    的頭像 發表于 10-18 17:37 ?707次閱讀
    <b class='flag-5'>單片機</b><b class='flag-5'>main</b><b class='flag-5'>函數</b>結束干嘛去了?
    主站蜘蛛池模板: 益日韩欧群交P片内射中文| 青青草原在线免费| 99香蕉视频| 欧洲xxxxx| 国产AV99激情久久无码天堂| 我年轻漂亮的继坶2中字在线播放| 国产午夜免费不卡精品理论片| 亚洲色婷婷久久精品AV蜜桃久久| 久久国产精品自线拍免费| 57PAO强力打造高清免费| 欧洲馒头大肥p| 国产精品免费大片| 亚洲欧美日韩在线码不卡 | 国产美女裸身网站免费观看视频 | 国产成人久久精品激情| 亚洲国产精品一区二区久久第| 久草色香蕉视频在线| 99re6热这里在线精品视频| 日本漂亮妈妈7观整有限中| 国产精品久久久久秋霞影视| 亚洲视频精品在线观看| 男人都懂www深夜免费网站| 调教椅上的调教SM总裁被调教| 亚洲高清国产拍精品动图| 狼与美女谐音歌词| 耻辱の奴隷淑女中文字幕| 亚洲精品国偷拍自产在线 | 欧美一级成人影院免费的| 国产精品99AV在线观看| 一二三四在线播放免费观看中文版视频| 男人和女人全黄一级毛片| 国产精品AV无码免费播放| 野花香HD免费高清版6高清版| 欧美人成在线观看ccc36| 国产老头与老太hd| 18禁黄久久久AAA片| 日韩精品无码视频一区二区蜜桃| 国家产午夜精品无人区| 99国内精品久久久久久久清纯| 呜呜别塞了啊抽插| 麻豆产精品一二三产区区|