日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

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

單片機(jī)main函數(shù)結(jié)束干嘛去了?

jf_pJlTbmA9 ? 來(lái)源:TsinghuaJoking ? 作者:TsinghuaJoking ? 2023-10-18 17:37 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

正常的程序,都不會(huì)跳出main,但是,如果跳出了 main 函數(shù),程序到底去哪兒了,你有相關(guān)這個(gè)問(wèn)題嗎?

一、問(wèn)題提出

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

#include 

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ā)亮。

“單片機(jī)main函數(shù)結(jié)束干嘛去了?

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

#include 

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

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

“單片機(jī)main函數(shù)結(jié)束干嘛去了?

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

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

二、程序去哪兒了?

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

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

2.1 盤古開(kāi)天辟地

對(duì)于C語(yǔ)言編程來(lái)說(shuō),所有的用戶程序世界是從主程序main()開(kāi)始的。給用戶程序開(kāi)天辟地的任務(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_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單片機(jī)程序執(zhí)行流程(STARTUP.A51)中進(jìn)行逐步調(diào)試跟蹤驗(yàn)證過(guò):

“單片機(jī)main函數(shù)結(jié)束干嘛去了?

2.2 世界盡頭

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

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

Keil編譯器

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

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

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

MAPLAB編譯器

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

總結(jié)

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

來(lái)源:TsinghuaJoking
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理

審核編輯 黃宇

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

    關(guān)注

    244

    文章

    24731

    瀏覽量

    692625
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6078

    文章

    45590

    瀏覽量

    673938
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4422

    瀏覽量

    67867
  • main
    +關(guān)注

    關(guān)注

    0

    文章

    38

    瀏覽量

    6638
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    單片機(jī)main函數(shù)在中斷函數(shù)里執(zhí)行?

    最近看了硬漢分享的一個(gè)內(nèi)容:為什么復(fù)位中斷服務(wù)程序里面直接調(diào)用的main函數(shù),難道所有程序都在復(fù)位中斷里面執(zhí)行的?
    發(fā)表于 10-24 11:04 ?1564次閱讀

    什么叫單片機(jī)單片機(jī)能干嘛?求解答

    什么叫單片機(jī)?單片機(jī)的標(biāo)號(hào)信息及封裝類型又有哪些呢?單片機(jī)能干嘛?51單片機(jī)都有哪些外部引腳?
    發(fā)表于 07-01 08:07

    單片機(jī)能干嘛?如何學(xué)習(xí)單片機(jī)

    什么叫單片機(jī)?單片機(jī)的標(biāo)號(hào)信息及封裝類型又有哪些呢?單片機(jī)能干嘛?如何學(xué)習(xí)單片機(jī)
    發(fā)表于 10-21 07:59

    怎么去學(xué)習(xí)單片機(jī)? 學(xué)習(xí)單片機(jī)的目的是干嘛?

    怎么去學(xué)習(xí)單片機(jī)?學(xué)習(xí)單片機(jī)的目的是干嘛?單片機(jī)和linux學(xué)習(xí)的關(guān)系,為什么學(xué)習(xí)linux?
    發(fā)表于 10-25 06:51

    STM32單片機(jī)DEBUG不能進(jìn)入Main函數(shù)怎么解決?

    STM32單片機(jī)DEBUG不能進(jìn)入Main函數(shù)怎么解決?
    發(fā)表于 12-02 06:39

    單片機(jī)還能有什么秘密呢

    關(guān)于單片機(jī)中你不知道的秘密單片機(jī)還有能有什么秘密呢?基礎(chǔ)知識(shí)了解上電過(guò)程學(xué)習(xí)總結(jié)與深化單片機(jī)還有能有什么秘密呢?我們從一開(kāi)始學(xué)C語(yǔ)言或者學(xué)習(xí)單片機(jī),都從
    發(fā)表于 01-20 07:31

    STM32程序無(wú)法進(jìn)入main函數(shù)的解決方法

    很多人在基于STM32單片機(jī)項(xiàng)目開(kāi)發(fā)過(guò)程中,會(huì)遇到STM32程序無(wú)法進(jìn)入main的現(xiàn)象,在這篇文將分享STM32程序無(wú)法進(jìn)入main函數(shù)的解決方法,希望對(duì)用戶有所幫助。
    的頭像 發(fā)表于 07-22 16:18 ?1.8w次閱讀

    單片機(jī) keil c語(yǔ)言字符比較函數(shù)的使用 使用strcmp();

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

    單片機(jī)啟動(dòng)過(guò)程: main之前干了啥

    單片機(jī)在執(zhí)行main函數(shù)之前,都干了什么呢?都做了什么準(zhǔn)備呢?來(lái)總結(jié)一下。一 準(zhǔn)備用KEIL學(xué)STM32單片機(jī)編程的時(shí)候,按下其仿真按鈕再按下RST按鈕會(huì)發(fā)現(xiàn)進(jìn)入到一個(gè)啟動(dòng)文件star
    發(fā)表于 11-23 18:06 ?1次下載
    <b class='flag-5'>單片機(jī)</b>啟動(dòng)過(guò)程: <b class='flag-5'>main</b>之前干了啥

    STM32系列單片機(jī)在進(jìn)入main函數(shù)前都在干些什么?

    在剛開(kāi)始學(xué)習(xí)單片機(jī)的時(shí)候,一直以為程序啟動(dòng)后就直接進(jìn)入到了main函數(shù),但是隨著學(xué)習(xí)的深入才發(fā)現(xiàn),程序在進(jìn)入main函數(shù)前其實(shí)還要干好多事情
    發(fā)表于 11-23 18:21 ?12次下載
    STM32系列<b class='flag-5'>單片機(jī)</b>在進(jìn)入<b class='flag-5'>main</b><b class='flag-5'>函數(shù)</b>前都在干些什么?

    單片機(jī) keil調(diào)試的時(shí)候進(jìn)入不了main函數(shù)

    單片機(jī) keil調(diào)試的時(shí)候進(jìn)入不了main函數(shù)
    發(fā)表于 12-03 20:51 ?6次下載
    <b class='flag-5'>單片機(jī)</b> keil調(diào)試的時(shí)候進(jìn)入不了<b class='flag-5'>main</b><b class='flag-5'>函數(shù)</b>

    如何在單片機(jī)中使用malloc函數(shù)

    但是每個(gè)嵌入式 RTOS 都會(huì)有自己的內(nèi)存管理方式,本文就來(lái)聊聊我對(duì) malloc 函數(shù)單片機(jī)程序設(shè)計(jì)中的一些看法。 本文并不是要說(shuō)明在單片機(jī)中怎么使用 malloc函數(shù),而是
    的頭像 發(fā)表于 04-24 09:50 ?3641次閱讀
    如何在<b class='flag-5'>單片機(jī)</b>中使用malloc<b class='flag-5'>函數(shù)</b>

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

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

    單片機(jī)用按鈕中斷函數(shù)

    單片機(jī)用按鈕中斷函數(shù)? 單片機(jī)中斷是一種能夠使單片機(jī)響應(yīng)外部信號(hào)的機(jī)制,這種機(jī)制允許單片機(jī)在處理其他任務(wù)時(shí)去響應(yīng)中斷信號(hào),從而提高
    的頭像 發(fā)表于 09-01 10:17 ?3135次閱讀

    單片機(jī)的程序結(jié)束后都干嘛去了?

    單片機(jī)的程序結(jié)束后都干嘛去了?
    的頭像 發(fā)表于 10-17 17:16 ?1613次閱讀
    <b class='flag-5'>單片機(jī)</b>的程序<b class='flag-5'>結(jié)束</b>后都<b class='flag-5'>干嘛</b><b class='flag-5'>去了</b>?
    云和县| 东安县| 凤城市| 黄龙县| 崇礼县| 乌鲁木齐县| 巩留县| 阿鲁科尔沁旗| 杭锦后旗| 富锦市| 达孜县| 昌图县| 巴林左旗| 区。| 二手房| 曲阳县| 怀宁县| SHOW| 邵东县| 彩票| 温泉县| 大英县| 富宁县| 榆中县| 武夷山市| 阿克陶县| 鄯善县| 四会市| 裕民县| 白山市| 苍梧县| 龙游县| 钦州市| 白沙| 内丘县| 渑池县| 南川市| 新河县| 辽中县| 开化县| 团风县|