99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

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

jf_pJlTbmA9 ? 來(lái)源:TsinghuaJoking公眾號(hào) ? 作者:TsinghuaJoking公眾號(hào) ? 2023-10-17 17:16 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

對(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ǔ)言編譯器決定的。

一、問(wèn)題提出

今天在單片機(jī)led模塊定義函數(shù)中看到一個(gè)有趣的問(wèn)題。提問(wèn)者在進(jìn)行基本的C51編程實(shí)驗(yàn),編寫(xiě)了一個(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ā)亮。

wKgaomUD3cCAN5uTAA1RmE0XHgg376.png

如果在主程序中,增加一個(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);
}

上面兩種情況的區(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ū)寫(xiě)的代碼來(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ì)的?!?/p>

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

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

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

下面截取了STARTUP.A51 代碼的一段,可以看到盤(pán)古在單片機(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ò):

wKgaomUD3caAYpp7AAG4gK1aF2U913.png

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公眾號(hào)
免責(zé)聲明:本文為轉(zhuǎn)載文章,轉(zhuǎn)載此文目的在于傳遞更多信息,版權(quán)歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權(quán)問(wèn)題,請(qǐng)聯(lián)系小編進(jìn)行處理

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(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)投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6067

    文章

    44989

    瀏覽量

    650363
  • 編譯器
    +關(guān)注

    關(guān)注

    1

    文章

    1662

    瀏覽量

    50208
  • maplab
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    STC單片機(jī)范例程序

    電子發(fā)燒友網(wǎng)站提供《STC單片機(jī)范例程序.zip》資料免費(fèi)下載
    發(fā)表于 06-04 16:27 ?4次下載

    2.4寸TFT彩屏配套測(cè)試程序-51單片機(jī)

    如題,2.4寸TFT彩屏配套測(cè)試程序-51單片機(jī)
    發(fā)表于 06-04 16:26 ?0次下載

    單片機(jī)Debug工具性能對(duì)比 單片機(jī)調(diào)試常用命令

    單片機(jī)(Microcontroller Unit, MCU)調(diào)試是嵌入式開(kāi)發(fā)中的一個(gè)重要環(huán)節(jié),它幫助開(kāi)發(fā)者發(fā)現(xiàn)和修復(fù)代碼中的錯(cuò)誤,優(yōu)化程序性能。不同的單片機(jī)和開(kāi)發(fā)環(huán)境可能使用不同的調(diào)試工具和命令
    的頭像 發(fā)表于 12-19 09:56 ?1413次閱讀

    單片機(jī)編程語(yǔ)言有哪些選擇

    單片機(jī)(Microcontroller Unit,MCU)編程是指為單片機(jī)編寫(xiě)程序的過(guò)程,這些程序控制單片機(jī)的行為和功能。單片機(jī)廣泛應(yīng)用于嵌
    的頭像 發(fā)表于 11-01 14:13 ?2416次閱讀

    單片機(jī)怎么寫(xiě)入程序

    程序通常涉及以下幾個(gè)步驟: 選擇單片機(jī)和開(kāi)發(fā)環(huán)境 : 確定項(xiàng)目需求,選擇合適的單片機(jī)型號(hào)。 安裝相應(yīng)的開(kāi)發(fā)環(huán)境,如Keil、IAR、MPLAB等。 硬件連接 : 將單片機(jī)連接到開(kāi)發(fā)板或
    的頭像 發(fā)表于 10-21 11:21 ?2415次閱讀

    單片機(jī)的中斷機(jī)制

    單片機(jī)的中斷機(jī)制是一種重要的處理方式,它允許單片機(jī)在執(zhí)行主程序的過(guò)程中,能夠暫停當(dāng)前任務(wù),轉(zhuǎn)而處理外部或內(nèi)部緊急事件。這種機(jī)制極大地提高了系統(tǒng)的響應(yīng)速度和處理能力,使得單片機(jī)在各種應(yīng)用
    的頭像 發(fā)表于 10-17 18:03 ?1970次閱讀

    單片機(jī)hex文件反編譯成C語(yǔ)言的過(guò)程

    使用C語(yǔ)言編寫(xiě),然后編譯成機(jī)器碼并燒錄到單片機(jī)的存儲(chǔ)器中。 Hex文件是一種用于存儲(chǔ)單片機(jī)程序的文件格式,它包含了程序的機(jī)器碼和一些附加信息,如起始地址、
    的頭像 發(fā)表于 09-02 10:49 ?6101次閱讀

    keil可以讀出單片機(jī)程序

    Keil是一款廣泛應(yīng)用于單片機(jī)程序開(kāi)發(fā)的軟件,它提供了包括C編譯器、宏匯編、連接器、庫(kù)管理和一個(gè)功能強(qiáng)大的仿真調(diào)試器等在內(nèi)的完整開(kāi)發(fā)方案。然而,關(guān)于Keil是否能直接“讀出”單片機(jī)程序
    的頭像 發(fā)表于 09-02 10:32 ?2144次閱讀

    單片機(jī)燒錄程序用什么軟件

    單片機(jī)燒錄程序單片機(jī)開(kāi)發(fā)過(guò)程中的一個(gè)重要環(huán)節(jié),涉及到將編寫(xiě)好的程序代碼通過(guò)燒錄器寫(xiě)入單片機(jī)的ROM中,以實(shí)現(xiàn)對(duì)
    的頭像 發(fā)表于 09-02 10:05 ?3428次閱讀

    單片機(jī)燒錄程序可以重新燒嗎

    單片機(jī)(Microcontroller Unit, MCU)是一種集成電路芯片,它將計(jì)算機(jī)的CPU、存儲(chǔ)器、輸入/輸出接口等集成在一塊芯片上,用于控制各種電子設(shè)備。單片機(jī)燒錄程序是指將編寫(xiě)
    的頭像 發(fā)表于 09-02 10:04 ?3134次閱讀

    單片機(jī)燒錄程序的線比單片機(jī)上的少還能燒錄嗎

    單片機(jī)燒錄原理 單片機(jī)燒錄是指將編寫(xiě)好的程序代碼通過(guò)一定的方式傳輸?shù)?b class='flag-5'>單片機(jī)的存儲(chǔ)器中,使其能夠按照程序的指令運(yùn)行。這個(gè)過(guò)程通常需要使用燒錄器
    的頭像 發(fā)表于 09-02 09:54 ?1079次閱讀

    單片機(jī)燒錄程序的串口線怎么連接

    單片機(jī)開(kāi)發(fā)過(guò)程中,燒錄程序是一項(xiàng)重要的工作。而燒錄程序通常需要使用串口線來(lái)實(shí)現(xiàn)。本文將介紹單片機(jī)燒錄程序的串口線連接方法,包括串口線的類(lèi)型
    的頭像 發(fā)表于 09-02 09:50 ?4034次閱讀

    單片機(jī)燒錄程序的基本步驟是什么

    單片機(jī)燒錄程序單片機(jī)開(kāi)發(fā)過(guò)程中非常重要的一步,它涉及到將編寫(xiě)好的程序代碼通過(guò)一定的方式傳輸?shù)?b class='flag-5'>單片機(jī)內(nèi)部的存儲(chǔ)器中,使
    的頭像 發(fā)表于 09-02 09:47 ?2748次閱讀

    stm32單片機(jī)燒錄程序會(huì)擦除原來(lái)的程序

    在STM32單片機(jī)燒錄程序的過(guò)程中, 通常情況下會(huì)擦除原來(lái)的程序 ,并將新程序寫(xiě)入單片機(jī)的閃存(Flash)中。這一過(guò)程是通過(guò)燒錄工具(如S
    的頭像 發(fā)表于 09-02 09:42 ?4690次閱讀

    藍(lán)牙模塊如何實(shí)現(xiàn)單片機(jī)和手機(jī)端數(shù)據(jù)互傳

    ZX-D30、ZX-D37、ZX-D32等。 藍(lán)牙模塊設(shè)置 : 將藍(lán)牙模塊與單片機(jī)連接。通常,藍(lán)牙模塊通過(guò)串口(UART)與單片機(jī)通信。 設(shè)置藍(lán)牙模塊的工作模式和參數(shù),例如波特率、名稱、停止位、數(shù)據(jù)位等。這通常通過(guò)發(fā)送特定的AT命令來(lái)完成。 編寫(xiě)
    的頭像 發(fā)表于 07-24 17:59 ?5608次閱讀
    藍(lán)牙模塊如何實(shí)現(xiàn)<b class='flag-5'>單片機(jī)</b>和手機(jī)端數(shù)據(jù)互傳