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

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

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

3天內不再提示

單片機led模塊定義函數程序去哪了

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

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

一、問題提出

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

#include

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

voidmain(void){
test(1);
}

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

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

如果在主程序中,增加一個無限循環:while(1); ,則電路板上的就不再會出現“微微點亮”的現象了。

#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

上面兩種情況的區別,在于第二個程序中主循環 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_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單片機程序執行流程(STARTUP.A51)中進行逐步調試跟蹤驗證過:

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

2.2 世界盡頭

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

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

Keil編譯器

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

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

這幾條語句,前4條,是將我們單片機的內存的前128個地址清零,第5條,是定義堆棧,第6條,是將程序重新跳轉到main函數的首行進行執行。

MAPLAB編譯器

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

總結

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

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

    關注

    6040

    文章

    44592

    瀏覽量

    636912
  • 程序
    +關注

    關注

    117

    文章

    3793

    瀏覽量

    81220
  • 函數
    +關注

    關注

    3

    文章

    4343

    瀏覽量

    62806
  • LED模塊
    +關注

    關注

    0

    文章

    27

    瀏覽量

    13105

原文標題:單片機main函數結束干嘛去了?

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

收藏 人收藏

    評論

    相關推薦

    單片機LED點陣顯示keil程序

    本內容提供單片機LED點陣顯示keil程序,歡迎大家下載學習 //單片機LED點陣顯示keil
    發表于 11-09 17:58 ?343次下載

    單片機控制的LED燈、最小系統及八路流水燈

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

    51單片機C語言延時函數怎么定義和使用

    C語言定義延時函數主要通過無意義指令的執行來達到延時的目的。下面給出一個經典的延時函數。C程序中可使用不同類型的變量來進行延時設計。經實驗測試,使用unsigned char類型具有
    發表于 11-16 17:06 ?8.5w次閱讀

    AVR單片機的延時函數程序免費下載

    本文檔的主要內容詳細介紹的是AVR單片機的延時函數程序免費下載
    發表于 11-16 08:00 ?7次下載
    AVR<b class='flag-5'>單片機</b>的延時<b class='flag-5'>函數</b><b class='flag-5'>程序</b>免費下載

    51單片機常用庫函數程序免費下載

    本文檔的主要內容詳細介紹的是51單片機常用庫函數程序免費下載。
    發表于 08-29 17:28 ?24次下載
    51<b class='flag-5'>單片機</b>常用庫<b class='flag-5'>函數</b><b class='flag-5'>程序</b>免費下載

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

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

    單片機的主程序是如何執行的

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

    單片機按鍵使用程序 (51單片機

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

    單片機模塊化編程

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

    51單片機 點亮一個LED LED閃爍

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

    單片機程序是如何執行的?指令數據寫?

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

    單片機程序是如何執行的:指令數據寫

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

    單片機led模塊定義函數的問題

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

    C語言編程中main函數退出后程序哪兒

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

    單片機用按鈕中斷函數

    單片機用按鈕中斷函數? 單片機中斷是一種能夠使單片機響應外部信號的機制,這種機制允許單片機在處理其他任務時
    的頭像 發表于 09-01 10:17 ?1581次閱讀
    主站蜘蛛池模板: 中文4480yy私人免费影院| www.jizz中国| 日本一区二区三区在线 视频观看免费 | www四虎在线高清| 久久青| 日本黄在线| 天堂影| 美女网战色| 亚洲午夜久久久精品影院| 国产一级特黄aaaa大片野外| 人人干97| 日韩欧美亚洲综合久久影院d3| 亚洲天堂2013| 综合婷婷| 井野雏田小樱天天被调教| 97dyy影院理论片| 无遮挡很爽很污很黄的网站w| 国产精品片| 狠狠操亚洲| 久久久久久久久女黄| 国产一区二区三区在线观看影院| 欧美黄色片免费看| 欧美性一区二区三区五区| 日本天堂影院| 久久久久久久网站| 成 人 免 费 黄 色| 天天干夜夜爽| 奇米激情| 午夜999| 天天射天天干天天操| 女bbbbxxxx毛片视频| 丁香婷婷综合网| 99xxxx开心| 日本妞xxxxxxxxx69| 免费视频在线播放| 91视频观看免费| 一级片高清| 手机在线色| 欧美精品 在线播放| www.亚洲黄色| 国产亚洲精品美女久久久|