在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

單片機(jī)led模塊定義函數(shù)程序去哪了

硬件攻城獅 ? 來源:硬件攻城獅 ? 作者:硬件攻城獅 ? 2022-08-25 10:42 ? 次閱讀

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

一、問題提出

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

#include

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

voidmain(void){
test(1);
}

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

7728f790-238e-11ed-ba43-dac502259ad0.png

如果在主程序中,增加一個無限循環(huán):while(1); ,則電路板上的就不再會出現(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);
}
77472c38-238e-11ed-ba43-dac502259ad0.png

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

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

二、程序去哪兒了?

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

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

2.1 盤古開天辟地

對于C語言編程來說,所有的用戶程序世界是從主程序main()開始的。給用戶程序開天辟地的任務(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_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)試跟蹤驗證過:

776f4858-238e-11ed-ba43-dac502259ad0.png

2.2 世界盡頭

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

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

Keil編譯器

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

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

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

MAPLAB編譯器

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

總結(jié)

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

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

    關(guān)注

    6065

    文章

    44946

    瀏覽量

    648005
  • 程序
    +關(guān)注

    關(guān)注

    117

    文章

    3825

    瀏覽量

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

    關(guān)注

    3

    文章

    4374

    瀏覽量

    64383
  • LED模塊
    +關(guān)注

    關(guān)注

    0

    文章

    27

    瀏覽量

    13445

原文標(biāo)題:單片機(jī)main函數(shù)結(jié)束干嘛去了?

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

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

    單片機(jī)LED點(diǎn)陣顯示keil程序

    本內(nèi)容提供單片機(jī)LED點(diǎn)陣顯示keil程序,歡迎大家下載學(xué)習(xí) //單片機(jī)LED點(diǎn)陣顯示keil
    發(fā)表于 11-09 17:58 ?343次下載

    單片機(jī)控制的LED燈、最小系統(tǒng)及八路流水燈

    1、 單片機(jī)控制一個LED燈的C語言程序范例 單片機(jī)控制一個LED燈的C語言程序范例1: //用
    發(fā)表于 09-06 10:37 ?23次下載

    51單片機(jī)C語言延時函數(shù)怎么定義和使用

    C語言定義延時函數(shù)主要通過無意義指令的執(zhí)行來達(dá)到延時的目的。下面給出一個經(jīng)典的延時函數(shù)。C程序中可使用不同類型的變量來進(jìn)行延時設(shè)計。經(jīng)實(shí)驗測試,使用unsigned char類型具有
    發(fā)表于 11-16 17:06 ?8.6w次閱讀

    AVR單片機(jī)的延時函數(shù)程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是AVR單片機(jī)的延時函數(shù)程序免費(fèi)下載
    發(fā)表于 11-16 08:00 ?7次下載
    AVR<b class='flag-5'>單片機(jī)</b>的延時<b class='flag-5'>函數(shù)</b><b class='flag-5'>程序</b>免費(fèi)下載

    51單片機(jī)常用庫函數(shù)程序免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)常用庫函數(shù)程序免費(fèi)下載。
    發(fā)表于 08-29 17:28 ?25次下載
    51<b class='flag-5'>單片機(jī)</b>常用庫<b class='flag-5'>函數(shù)</b><b class='flag-5'>程序</b>免費(fèi)下載

    51單片機(jī)定義端口和定時器中斷與蜂鳴器報警程序函數(shù)合集

    本文檔的主要內(nèi)容詳細(xì)介紹的是51單片機(jī)定義端口和全局變量及定時器中斷與蜂鳴器報警程序函數(shù)合集免費(fèi)下載。
    發(fā)表于 07-10 17:40 ?11次下載
    51<b class='flag-5'>單片機(jī)</b>的<b class='flag-5'>定義</b>端口和定時器中斷與蜂鳴器報警<b class='flag-5'>程序</b>等<b class='flag-5'>函數(shù)</b>合集

    單片機(jī)的主程序是如何執(zhí)行的

    我們從單片機(jī)的工作原理可以看出單片機(jī)是執(zhí)行程序來完成我們所要求的任務(wù)的,在單片機(jī)中有很多子程序單片機(jī)
    的頭像 發(fā)表于 10-30 17:28 ?1.1w次閱讀
    <b class='flag-5'>單片機(jī)</b>的主<b class='flag-5'>程序</b>是如何執(zhí)行的

    單片機(jī)按鍵使用程序 (51單片機(jī)

    單片機(jī)獨(dú)立按鍵使用程序 (51單片機(jī))獨(dú)立按鍵是單片機(jī)中很重要的一個器件,在這篇文章里,通過這個用獨(dú)立按鍵控制LED燈的小
    發(fā)表于 11-11 18:36 ?108次下載
    <b class='flag-5'>單片機(jī)</b>按鍵使用<b class='flag-5'>程序</b> (51<b class='flag-5'>單片機(jī)</b>)

    單片機(jī)模塊化編程

    單片機(jī)模塊化編程步驟:1、先建5個文件夾:LED總文件夾、project、user、output和bsp文件夾project文件夾主要放工程項目;user文件夾主要放main程序和pb
    發(fā)表于 11-14 19:36 ?10次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>模塊</b>化編程

    51單片機(jī) 點(diǎn)亮一個LED LED閃爍

    ) //循環(huán) { }}使用51單片機(jī)點(diǎn)亮一個LED#include <reg52.h> //51單片機(jī)頭文件sbit LED=P2^0;
    發(fā)表于 11-23 17:06 ?5次下載
    51<b class='flag-5'>單片機(jī)</b> 點(diǎn)亮一個<b class='flag-5'>LED</b> <b class='flag-5'>LED</b>閃爍

    單片機(jī)程序是如何執(zhí)行的?指令數(shù)據(jù)寫?

    單片機(jī)的運(yùn)行需要執(zhí)行程序,同時硬件也是必不可少的,二者缺一不可。大家都知道單片機(jī)的運(yùn)行需要執(zhí)行寫好的程序,但是單片機(jī)的指令數(shù)據(jù)都被寫在
    發(fā)表于 11-23 17:51 ?9次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>程序</b>是如何執(zhí)行的?指令數(shù)據(jù)寫<b class='flag-5'>哪</b><b class='flag-5'>了</b>?

    單片機(jī)程序是如何執(zhí)行的:指令數(shù)據(jù)寫

    單片機(jī)的運(yùn)行需要執(zhí)行程序,同時硬件也是必不可少的,二者缺一不可。大家都知道單片機(jī)的運(yùn)行需要執(zhí)行寫好的程序,但是單片機(jī)的指令數(shù)據(jù)都被寫在
    發(fā)表于 12-01 16:06 ?7次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>程序</b>是如何執(zhí)行的:指令數(shù)據(jù)寫<b class='flag-5'>哪</b><b class='flag-5'>了</b>

    單片機(jī)led模塊定義函數(shù)的問題

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

    C語言編程中main函數(shù)退出后程序哪兒

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

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

    單片機(jī)用按鈕中斷函數(shù)? 單片機(jī)中斷是一種能夠使單片機(jī)響應(yīng)外部信號的機(jī)制,這種機(jī)制允許單片機(jī)在處理其他任務(wù)時
    的頭像 發(fā)表于 09-01 10:17 ?1924次閱讀
    主站蜘蛛池模板: 亚洲福利一区福利三区 | 女bbbbxxxx毛片视频0 | 男人一级片| 久久精品免费观看视频 | 久久国产午夜精品理论片34页 | 亚洲国产精品第一区二区 | 在线观看精品视频看看播放 | 欧美福利一区 | 红色一级毛片 | xx视频在线| 色综合美国色农夫网 | 伊人福利网| 91pao强力打造免费高清 | 亚洲欧美在线播放 | 91中文字幕视频 | 深爱综合网 | 2017天天干夜夜操 | 日韩免费 | 一级做a爰片久久毛片美女图片 | aa视频在线观看 | 久久国产高清视频 | 特黄色一级毛片 | 真人实干一级毛片aa免费 | 日本成人免费网站 | 久久www免费人成高清 | 日本操穴 | 国产小视频免费观看 | 狠狠狠狠操 | 伊人网在线观看 | 欧美亚洲综合另类成人 | 黄色综合| 四虎影在永久地址在线观看 | 伊人久久成人成综合网222 | 四虎国产精品免费久久影院 | 午夜骚片| 美女张开腿露尿口给男人亲 | 精品亚洲成a人片在线观看 精品亚洲大全 | 在线亚洲免费 | 人人插人人插 | 亚洲成人网页 | 国产免费好大好硬视频 |