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

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

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

編寫一個(gè)簡(jiǎn)單的C51程序

Q4MP_gh_c472c21 ? 來(lái)源:TsinghuaJoking ? 作者:TsinghuaJoking ? 2022-03-12 11:17 ? 次閱讀

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

01 問題提出

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

#include

voidtest(num){
switch(num){
case1:P2_0=0;P2_1=0;
break;
}
}

voidmain(void){
test(1);
}

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

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

#include

voidtest(num){
switch(num){
case1:P2_0=0;P2_1=0;
break;
}
}

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

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

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

02 程序去哪兒了?

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

2.1 盤古開天辟地

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

??關(guān)于C51是如何啟動(dòng)的, 在如下面博文中也被測(cè)試說(shuō)明:

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

??下面截取了 STARTUP.A51 代碼的一段,可以看到盤古在單片機(jī) RESET 之后做了點(diǎn)準(zhǔn)備工作(初始化全局變量、堆棧指針)之后,就直接跳轉(zhuǎn)至:?C_START

NAME?C_STARTUP

?C_C51STARTUPSEGMENTCODE
?STACKSEGMENTIDATA

RSEG?STACK
DS1

EXTRNCODE(?C_START)
PUBLIC?C_STARTUP

CSEGAT0
?C_STARTUP:LJMPSTARTUP1

RSEG?C_C51STARTUP

STARTUP1:

IFIDATALEN<>0
MOVR0,#IDATALEN-1
CLRA
IDATALOOP:MOV@R0,A
DJNZR0,IDATALOOP
ENDIF

IFXDATALEN<>0
MOVDPTR,#XDATASTART
MOVR7,#LOW(XDATALEN)
IF(LOW(XDATALEN))<>0
MOVR6,#(HIGH(XDATALEN))+1
ELSE
MOVR6,#HIGH(XDATALEN)
ENDIF
CLRA
XDATALOOP:MOVX@DPTR,A
INCDPTR
DJNZR7,XDATALOOP
DJNZR6,XDATALOOP
ENDIF

IFPPAGEENABLE<>0
MOVPPAGE_SFR,#PPAGE
ENDIF

IFPDATALEN<>0
MOVR0,#LOW(PDATASTART)
MOVR7,#LOW(PDATALEN)
CLRA
PDATALOOP:MOVX@R0,A
INCR0
DJNZR7,PDATALOOP
ENDIF

IFIBPSTACK<>0
EXTRNDATA(?C_IBP)

MOV?C_IBP,#LOWIBPSTACKTOP
ENDIF

IFXBPSTACK<>0
EXTRNDATA(?C_XBP)

MOV?C_XBP,#HIGHXBPSTACKTOP
MOV?C_XBP+1,#LOWXBPSTACKTOP
ENDIF

IFPBPSTACK<>0
EXTRNDATA(?C_PBP)
MOV?C_PBP,#LOWPBPSTACKTOP
ENDIF

MOVSP,#?STACK-1
LJMP?C_START

END

??上面的代碼也被博文 51單片機(jī)程序執(zhí)行流程(STARTUP.A51)中進(jìn)行逐步調(diào)試跟蹤驗(yàn)證過:

915c6e02-92f3-11ec-952b-dac502259ad0.jpg


▲ 圖2.1.1 顯示LJMP C_START 就是進(jìn)入 main() 程序

2.2 世界盡頭

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

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

2.2.1 Keil編譯器

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

MOVR0,#0x7F
CLRA
MOV@R0,A
DJNZR0,(3)
MOVSP,#0x0C
LJMPmain

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

2.2.2 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),如果沒有運(yùn)行RTOS,那么程序開發(fā)中的 主函數(shù)(main())需要通過某種機(jī)制使其永遠(yuǎn)愉快的運(yùn)行下去,它沒有終點(diǎn)。

如果想從main函數(shù)中退出,具體干什么是由所使用的C語(yǔ)言編譯器決定的。

原文標(biāo)題:程序結(jié)束后去哪兒了?

文章出處:【微信公眾號(hào):嵌入式ARM】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

審核編輯:湯梓紅


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

    關(guān)注

    6023

    文章

    44376

    瀏覽量

    628297
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

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

    關(guān)注

    3

    文章

    4235

    瀏覽量

    61965

原文標(biāo)題:程序結(jié)束后去哪兒了?

文章出處:【微信號(hào):gh_c472c2199c88,微信公眾號(hào):嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    C51基本結(jié)構(gòu)程序設(shè)計(jì)

    C51基本結(jié)構(gòu)程序設(shè)計(jì)1. 掌握if語(yǔ)句來(lái)實(shí)現(xiàn)選擇結(jié)構(gòu),能利用if語(yǔ)句編寫相應(yīng)的分枝結(jié)構(gòu)的程序。在嵌套if語(yǔ)句中,定要搞清楚else與哪個(gè)
    發(fā)表于 06-12 23:44 ?32次下載

    C51程序的函數(shù)教程

    函數(shù)是C51程序的基本組成部分,C51程序的全部工作都是由各式各樣的函數(shù)完成的。本章主要介紹函數(shù)的定義、調(diào)用、參數(shù)的傳遞、變量的作用域等。1.理解函數(shù)的概念,能根據(jù)需
    發(fā)表于 06-12 23:46 ?54次下載

    單片機(jī)C51編程規(guī)范

    單片機(jī)C51編程規(guī)范 1單片機(jī)C51編程規(guī)范- 前言   為了提高源程序的質(zhì)量和可維護(hù)性,從而最終提高軟件產(chǎn)品生產(chǎn)力,特編寫此規(guī)范。
    發(fā)表于 01-14 21:03 ?2504次閱讀

    Keil C51庫(kù)函數(shù)參考

    第五章 Keil C51庫(kù)函數(shù)參考 C51強(qiáng)大功能及其高效率的重要體現(xiàn)之在于其豐富的可直接調(diào)用的庫(kù)函數(shù),多使用庫(kù)函數(shù)使程序代碼簡(jiǎn)單,結(jié)構(gòu)清
    發(fā)表于 04-07 09:45 ?412次下載

    C51精確延時(shí)函數(shù)的編寫及調(diào)試方法

    本內(nèi)容詳細(xì)介紹了C51精確延時(shí)函數(shù)的編寫及調(diào)試方法
    發(fā)表于 05-24 11:33 ?272次下載
    <b class='flag-5'>C51</b>精確延時(shí)函數(shù)的<b class='flag-5'>編寫</b>及調(diào)試方法

    C51語(yǔ)言程序設(shè)計(jì)技巧

    1 C51語(yǔ)言程序設(shè)計(jì)\技巧 C語(yǔ)言 是種高級(jí)程序設(shè)計(jì)語(yǔ)言,它提供了十分完備的規(guī)范化流程控制結(jié)構(gòu)。因此采用
    發(fā)表于 05-17 14:02 ?5932次閱讀
    <b class='flag-5'>C51</b>語(yǔ)言<b class='flag-5'>程序</b>設(shè)計(jì)技巧

    個(gè)流水燈的C51程序

    流水燈的C51程序流水燈的C51程序流水燈的C51程序
    發(fā)表于 01-07 16:55 ?3次下載

    C51單片機(jī)對(duì)液晶片的驅(qū)動(dòng)

    Keil C51編寫的192*64液晶片驅(qū)動(dòng)程序,感謝很多網(wǎng)友提供了參考源程序, 本程序是在網(wǎng)友們提供的
    發(fā)表于 11-19 16:22 ?1780次閱讀

    如何使用KEIL C51和proteus實(shí)現(xiàn)C51匯編程序的設(shè)計(jì)實(shí)例

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用KEIL C51和proteus實(shí)現(xiàn)C51匯編程序的設(shè)計(jì)實(shí)例。
    發(fā)表于 07-30 17:35 ?19次下載
    如何使用KEIL <b class='flag-5'>C51</b>和proteus實(shí)現(xiàn)<b class='flag-5'>C51</b>匯編<b class='flag-5'>程序</b>的設(shè)計(jì)實(shí)例

    個(gè)X25045的C51讀寫程序

    本文檔的主要內(nèi)容詳細(xì)介紹的是個(gè)X25045的C51讀寫程序。
    的頭像 發(fā)表于 01-18 11:13 ?3024次閱讀

    單片機(jī)C51語(yǔ)言程序設(shè)計(jì)基礎(chǔ)的資料合集免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C51語(yǔ)言程序設(shè)計(jì)基礎(chǔ)的資料合集免費(fèi)下載包括了:?jiǎn)纹瑱C(jī)開發(fā)概述,構(gòu)建C51集成開發(fā)環(huán)境,單片機(jī)C51語(yǔ)言程序
    發(fā)表于 03-16 08:00 ?18次下載
    單片機(jī)<b class='flag-5'>C51</b>語(yǔ)言<b class='flag-5'>程序</b>設(shè)計(jì)基礎(chǔ)的資料合集免費(fèi)下載

    51單片機(jī)讀寫AT29C040的C51程序

    本文檔的主要內(nèi)容詳細(xì)介紹的是給大家介紹個(gè)51單片機(jī)讀寫AT29C040的c51程序。
    的頭像 發(fā)表于 11-07 12:01 ?4761次閱讀

    單片機(jī)C51程序設(shè)計(jì)的學(xué)習(xí)課件免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是單片機(jī)C51程序設(shè)計(jì)的學(xué)習(xí)課件免費(fèi)下載包括了:1、C51程序設(shè)計(jì)基礎(chǔ),2、C51的數(shù)據(jù)類型及其在
    發(fā)表于 11-24 17:24 ?63次下載
    單片機(jī)<b class='flag-5'>C51</b><b class='flag-5'>程序</b>設(shè)計(jì)的學(xué)習(xí)課件免費(fèi)下載

    Keil C51與單片機(jī)開發(fā)入門(第一個(gè)程序

    Keil C51與單片機(jī)開發(fā)入門(第一個(gè)程序
    發(fā)表于 11-13 15:21 ?11次下載
    Keil <b class='flag-5'>C51</b>與單片機(jī)開發(fā)入門(第<b class='flag-5'>一個(gè)</b><b class='flag-5'>程序</b>)

    c51流水燈程序下載

    c51流水燈程序免費(fèi)下載。
    發(fā)表于 05-20 17:15 ?10次下載