91欧美超碰AV自拍|国产成年人性爱视频免费看|亚洲 日韩 欧美一厂二区入|人人看人人爽人人操aV|丝袜美腿视频一区二区在线看|人人操人人爽人人爱|婷婷五月天超碰|97色色欧美亚州A√|另类A√无码精品一级av|欧美特级日韩特级

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

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

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

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

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

掃碼添加小助手

加入工程師交流群

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

一、問題提出

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

#include 

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

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

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

wKgaomUD3cCAN5uTAA1RmE0XHgg376.png

如果在主程序中,增加一個無限循環(huán):while(1); ,則電路板上的就不再會出現(xià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ū)別,在于第二個程序中主循環(huán) main()函數(shù)始終沒有退出,而第一個程序,main()函數(shù)退出了。似乎前面LED微微點亮 應該與主函數(shù)退出之后,單片機都干了些啥有關系。

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

二、程序去哪兒了?

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

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

2.1 盤古開天辟地

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

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

下面截取了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單片機程序執(zhí)行流程(STARTUP.A51)中進行逐步調(diào)試跟蹤驗證過:

wKgaomUD3caAYpp7AAG4gK1aF2U913.png

2.2 世界盡頭

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

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

Keil編譯器

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

MOV R0, #0x7F
CLR A
MOV @R0, A
DJNZ R0, (3)
MOV SP, #0x0C
LJMP main
這幾條語句,前4條,是將我們單片機的內(nèi)存的前128個地址清零,第5條,是定義堆棧,第6條,是將程序重新跳轉到main函數(shù)的首行進行執(zhí)行。

MAPLAB編譯器

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

總結

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

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

審核編輯 黃宇

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

    關注

    6076

    文章

    45500

    瀏覽量

    670619
  • 編譯器
    +關注

    關注

    1

    文章

    1672

    瀏覽量

    51657
  • maplab
    +關注

    關注

    0

    文章

    3

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    單片機中有FLASH為啥還需要EEROM?

    單片機里明明有FLASH,為啥還要再塞個EEPROM?不少剛接觸嵌入式的小伙伴估計都有過這樣的疑惑:FLASH能存程序,容量大,讀取又快,干嘛還要加個讀寫慢、容量小的EEPROM?這不是多此一舉嘛。其實,這倆兄弟各有所長,分工明
    的頭像 發(fā)表于 03-05 13:39 ?70次閱讀
    <b class='flag-5'>單片機</b>中有FLASH為啥還需要EEROM?

    單片機程序跑飛死機的幾種原因分享

    在使用單片機過程中,經(jīng)常會出現(xiàn)程序運行一段時間,不能夠正常相應的情況。一般分為軟件原因和硬件原因,其中硬件原因比較容易查,軟件原因就較為復雜。 軟件導致單片機死機的原因 1、指針異
    發(fā)表于 01-21 07:34

    單片機里的程序運行方式

    于實時控制、故障自動處理、計算機與外設間傳送數(shù)據(jù)及人機對話等。 單片機啟動過程 單片機的啟動過程是加電,先運行芯片內(nèi)部固有程序(這個程序
    發(fā)表于 01-16 06:57

    學習單片機快速方法

    要知道流水燈是怎么和單片機連接的(一般學習板配有電路圖)。然后你要能編寫不同的程序去控制LED的亮滅,花樣就隨你遍了。 有時間的話可以去網(wǎng)上下載些流水燈的源程序看看??纯慈思矣惺裁?/div>
    發(fā)表于 01-14 07:42

    單片機如何燒錄程序?

    單片機如何燒錄程序
    發(fā)表于 01-08 07:04

    單片機解密是什么?

    芯片的其中一個類。 單片機(MCU)一般都有內(nèi)部程序區(qū)和數(shù)據(jù)區(qū)(或者其一)供用戶存放程序和工作數(shù)據(jù)(或者其一)。為了防止未經(jīng)授訪問或拷貝單片機的機內(nèi)
    發(fā)表于 12-30 08:19

    單片機程序的執(zhí)行

    : 對單片機編程程序的代碼段,data段,bss段,rodata段等存放在Flash中。當單片機上電
    發(fā)表于 12-04 06:20

    單片機燒錄原理是怎樣的?輝芒微單片機燒錄程序詳細步驟講解

    燒錄(Programming)就是把 .hex/.bin 文件里的機器碼搬運進單片機片內(nèi) Flash 的過程。輝芒微(FMD)單片機內(nèi)部有一塊 自舉 BootROM,上電時會先跑這段程序;如果檢測
    的頭像 發(fā)表于 09-17 16:14 ?2365次閱讀
    <b class='flag-5'>單片機</b>燒錄原理是怎樣的?輝芒微<b class='flag-5'>單片機</b>燒錄<b class='flag-5'>程序</b>詳細步驟講解

    單片機的儲存優(yōu)點是什么

    單片機作為嵌入式系統(tǒng)的核心,其儲存系統(tǒng)是實現(xiàn)數(shù)據(jù)存儲與程序運行的關鍵部分。與獨立存儲芯片相比,單片機的儲存單元在集成度、功耗、可靠性等方面具備獨特優(yōu)勢,這些優(yōu)點使其能適應從消費電子到工業(yè)控制的多樣化
    的頭像 發(fā)表于 07-31 10:09 ?704次閱讀

    怎么測單片機系統(tǒng)頻率

    單片機系統(tǒng)頻率是指單片機工作時的時鐘頻率,它直接影響單片機的運行速度和處理能力,準確測量系統(tǒng)頻率對單片機應用開發(fā)、程序調(diào)試和性能優(yōu)化具有重要
    的頭像 發(fā)表于 07-25 11:39 ?807次閱讀

    單片機怎么驅動電機?

    在各類自動化設備和智能裝置中,電機是重要的執(zhí)行部件,而單片機作為控制核心,需要通過特定的方式驅動電機運轉。單片機驅動電機并非直接連接即可,而是要根據(jù)電機類型和功率,搭配合適的驅動電路,才能實現(xiàn)穩(wěn)定
    的頭像 發(fā)表于 07-25 09:31 ?936次閱讀

    單片機怎么燒程序

    單片機程序是將編寫好的程序代碼寫入單片機內(nèi)部存儲單元,讓單片機按照預設邏輯工作的過程,是單片機
    的頭像 發(fā)表于 07-23 11:47 ?1335次閱讀

    STC單片機范例程序

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

    2.4寸TFT彩屏配套測試程序-51單片機

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

    單片機各種復位電路原理

    使用哪種類型的單片機,總要涉及到單片機復位電路的設計。而單片機復位電路設計的好壞,直接影響到整個系統(tǒng)工作的可靠性。許多用戶在設計完單片機系統(tǒng),并在實驗室調(diào)試成功
    發(fā)表于 05-30 16:53