国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

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

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

掃碼添加小助手

加入工程師交流群

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

一、問題提出

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

#include 

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

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

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

wKgaomUD3cCAN5uTAA1RmE0XHgg376.png

如果在主程序中,增加一個無限循環: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()函數退出了。似乎前面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)中進行逐步調試跟蹤驗證過:

wKgaomUD3caAYpp7AAG4gK1aF2U913.png

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公眾號
免責聲明:本文為轉載文章,轉載此文目的在于傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯系小編進行處理

審核編輯 黃宇

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

    關注

    6076

    文章

    45494

    瀏覽量

    670262
  • 編譯器
    +關注

    關注

    1

    文章

    1672

    瀏覽量

    51592
  • maplab
    +關注

    關注

    0

    文章

    3

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

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

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

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

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

    單片機里的程序運行方式

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

    學習單片機快速方法

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

    單片機如何燒錄程序

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

    單片機解密是什么?

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

    單片機程序的執行

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

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

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

    單片機的儲存優點是什么

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

    怎么測單片機系統頻率

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

    單片機怎么驅動電機?

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

    單片機怎么燒程序

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

    STC單片機范例程序

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

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

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

    單片機各種復位電路原理

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