精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

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

3天內不再提示

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

jf_pJlTbmA9 ? 來源:TsinghuaJoking ? 作者:TsinghuaJoking ? 2023-10-18 17:37 ? 次閱讀

正常的程序,都不會跳出main,但是,如果跳出了 main 函數,程序到底去哪兒了,你有相關這個問題嗎?

一、問題提出

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

#include 

void test(num) {
    switch(num) {
        case 1: P2_0=0; P2_1=0; 
            break;
    }
}

void main(void) {
    test(1);
}

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

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

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

#include 

void test(num) {
    switch(num) {
        case 1: P2_0=0; P2_1=0; 
            break;
    }
}

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

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

上面兩種情況的區別,在于第二個程序中主循環 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_C51STARTUP   SEGMENT   CODE
?STACK          SEGMENT   IDATA

                RSEG    ?STACK
                DS      1

                EXTRN CODE (?C_START)
                PUBLIC  ?C_STARTUP

                CSEG    AT      0
?C_STARTUP:     LJMP    STARTUP1

                RSEG    ?C_C51STARTUP

STARTUP1:

IF IDATALEN <> 0
                MOV     R0,#IDATALEN - 1
                CLR     A
IDATALOOP:      MOV     @R0,A
                DJNZ    R0,IDATALOOP
ENDIF

IF XDATALEN <> 0
                MOV     DPTR,#XDATASTART
                MOV     R7,#LOW (XDATALEN)
  IF (LOW (XDATALEN)) <> 0
                MOV     R6,#(HIGH (XDATALEN)) +1
  ELSE
                MOV     R6,#HIGH (XDATALEN)
  ENDIF
                CLR     A
XDATALOOP:      MOVX    @DPTR,A
                INC     DPTR
                DJNZ    R7,XDATALOOP
                DJNZ    R6,XDATALOOP
ENDIF

IF PPAGEENABLE <> 0
                MOV     PPAGE_SFR,#PPAGE
ENDIF

IF PDATALEN <> 0
                MOV     R0,#LOW (PDATASTART)
                MOV     R7,#LOW (PDATALEN)
                CLR     A
PDATALOOP:      MOVX    @R0,A
                INC     R0
                DJNZ    R7,PDATALOOP
ENDIF

IF IBPSTACK <> 0
EXTRN DATA (?C_IBP)

                MOV     ?C_IBP,#LOW IBPSTACKTOP
ENDIF

IF XBPSTACK <> 0
EXTRN DATA (?C_XBP)

                MOV     ?C_XBP,#HIGH XBPSTACKTOP
                MOV     ?C_XBP+1,#LOW XBPSTACKTOP
ENDIF

IF PBPSTACK <> 0
EXTRN DATA (?C_PBP)
                MOV     ?C_PBP,#LOW PBPSTACKTOP
ENDIF

                MOV     SP,#?STACK-1
                LJMP    ?C_START

                END

上面的代碼也被博文51單片機程序執行流程(STARTUP.A51)中進行逐步調試跟蹤驗證過:

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

2.2 世界盡頭

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

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

Keil編譯器

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

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

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

MAPLAB編譯器

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

總結

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

來源:TsinghuaJoking
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理

審核編輯 黃宇

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

    關注

    242

    文章

    23153

    瀏覽量

    658614
  • 單片機
    +關注

    關注

    6032

    文章

    44525

    瀏覽量

    633256
  • 函數
    +關注

    關注

    3

    文章

    4308

    瀏覽量

    62444
  • main
    +關注

    關注

    0

    文章

    38

    瀏覽量

    6142
收藏 人收藏

    評論

    相關推薦

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

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

    什么叫單片機單片機能干嘛?求解答

    什么叫單片機單片機的標號信息及封裝類型又有哪些呢?單片機能干嘛?51單片機都有哪些外部引腳?
    發表于 07-01 08:07

    單片機能干嘛?如何學習單片機

    什么叫單片機單片機的標號信息及封裝類型又有哪些呢?單片機能干嘛?如何學習單片機
    發表于 10-21 07:59

    怎么去學習單片機? 學習單片機的目的是干嘛

    怎么去學習單片機?學習單片機的目的是干嘛單片機和linux學習的關系,為什么學習linux?
    發表于 10-25 06:51

    STM32單片機DEBUG不能進入Main函數怎么解決?

    STM32單片機DEBUG不能進入Main函數怎么解決?
    發表于 12-02 06:39

    單片機還能有什么秘密呢

    關于單片機中你不知道的秘密單片機還有能有什么秘密呢?基礎知識了解上電過程學習總結與深化單片機還有能有什么秘密呢?我們從一開始學C語言或者學習單片機,都從
    發表于 01-20 07:31

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

    很多人在基于STM32單片機項目開發過程中,會遇到STM32程序無法進入main的現象,在這篇文將分享STM32程序無法進入main函數的解決方法,希望對用戶有所幫助。
    的頭像 發表于 07-22 16:18 ?1.5w次閱讀

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

    單片機 keil c語言字符比較函數的使用 使用strcmp();strcmp()的介紹、32單片機中的使用示例注意事項strcmp()的介紹、這是菜鳥教程的介紹:C 庫函數 int
    發表于 11-21 15:06 ?17次下載
    <b class='flag-5'>單片機</b> keil  c語言字符比較<b class='flag-5'>函數</b>的使用 使用strcmp();

    51單片機 點亮一個LED LED閃爍

    51單片機程序的基礎#include <reg52.h> //51單片機頭文件void main() //主函數{ while(1
    發表于 11-23 17:06 ?5次下載
    51<b class='flag-5'>單片機</b> 點亮一個LED LED閃爍

    單片機啟動過程: main之前干了啥

    單片機在執行main函數之前,都干了什么呢?都做了什么準備呢?來總結一下。一 準備用KEIL學STM32單片機編程的時候,按下其仿真按鈕再按下RST按鈕會發現進入到一個啟動文件star
    發表于 11-23 18:06 ?1次下載
    <b class='flag-5'>單片機</b>啟動過程: <b class='flag-5'>main</b>之前干了啥

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

    在剛開始學習單片機的時候,一直以為程序啟動后就直接進入到了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函數退出后程序去哪兒了?

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

    單片機用按鈕中斷函數

    單片機用按鈕中斷函數? 單片機中斷是一種能夠使單片機響應外部信號的機制,這種機制允許單片機在處理其他任務時去響應中斷信號,從而提高
    的頭像 發表于 09-01 10:17 ?1477次閱讀

    單片機的程序結束后都干嘛去了

    單片機的程序結束后都干嘛去了
    的頭像 發表于 10-17 17:16 ?632次閱讀
    <b class='flag-5'>單片機</b>的程序<b class='flag-5'>結束</b>后都<b class='flag-5'>干嘛</b><b class='flag-5'>去了</b>?