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

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

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

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

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

GReq_mcu168 ? 來(lái)源:CSDN ? 作者:CSDN ? 2022-03-11 10:10 ? 次閱讀

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

01問(wèn)題提出

今天在CSDN的 單片機(jī)led模塊定義函數(shù)的問(wèn)題[1]中看到一個(gè)有趣的問(wèn)題。提問(wèn)者在進(jìn)行基本的C51編程實(shí)驗(yàn),編寫(xiě)了一個(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ā)亮。

25a78be2-8f01-11ec-952b-dac502259ad0.png

▲ 圖1.1 實(shí)驗(yàn)板上的未點(diǎn)亮的LED居然微微發(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); }

25c67dcc-8f01-11ec-952b-dac502259ad0.png

▲ 圖1.2 實(shí)驗(yàn)板上后面六個(gè)LED就不再點(diǎn)亮了

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

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

02程序去哪兒了?

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

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

2.1 盤(pán)古開(kāi)天辟地

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

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

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

下面截取了STARTUP.A51代碼的一段,可以看到盤(pán)古在單片機(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)[3]中進(jìn)行逐步調(diào)試跟蹤驗(yàn)證過(guò):

25e5150c-8f01-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)的問(wèn)題中作者對(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),如果沒(méi)有運(yùn)行RTOS,那么程序開(kāi)發(fā)中的 主函數(shù)(main())需要通過(guò)某種機(jī)制使其永遠(yuǎn)愉快的運(yùn)行下去,它沒(méi)有終點(diǎn)。

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

審核編輯 :李倩

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

    關(guān)注

    41

    文章

    3630

    瀏覽量

    129792
  • C51
    C51
    +關(guān)注

    關(guān)注

    5

    文章

    284

    瀏覽量

    58306

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

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

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    51單片機(jī)-LED模塊

    LED模塊是通過(guò)74573鎖存器芯片與單片機(jī)IO口連接,并與數(shù)碼管共用IO口。
    的頭像 發(fā)表于 05-23 09:14 ?9003次閱讀
    51<b class='flag-5'>單片機(jī)</b>-<b class='flag-5'>LED</b>燈<b class='flag-5'>模塊</b>

    定義單片機(jī)寄存器操作和模塊接口相關(guān)的函數(shù)

    :/* 定義單片機(jī)寄存器操作和模塊接口相關(guān)的函數(shù), 方便在不同平臺(tái)間移植 */// 單片機(jī): STM32F103VE,
    發(fā)表于 12-13 07:43

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

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

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

    比unsigned int更優(yōu)化的代碼,在使用時(shí)應(yīng)該使用unsigned char作為延時(shí)變量。 以某晶振為12MHz的單片機(jī)為例,晶振為12MHz即一個(gè)機(jī)器周期為1us。
    發(fā)表于 11-16 17:06 ?8.5w次閱讀

    如何使用單片機(jī)系統(tǒng)重寫(xiě)printf函數(shù)

    本文檔的主要內(nèi)容詳細(xì)介紹的是如何使用單片機(jī)系統(tǒng)重寫(xiě)printf函數(shù)。
    發(fā)表于 07-23 17:37 ?1次下載
    如何使用<b class='flag-5'>單片機(jī)</b>系統(tǒng)重寫(xiě)printf<b class='flag-5'>函數(shù)</b>

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

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

    使用MSP430F5529單片機(jī)控制LED同時(shí)閃爍的庫(kù)函數(shù)免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用MSP430F5529單片機(jī)控制LED同時(shí)閃爍的庫(kù)函數(shù)免費(fèi)下載。
    發(fā)表于 07-24 08:00 ?10次下載
    使用MSP430F5529<b class='flag-5'>單片機(jī)</b>控制<b class='flag-5'>LED</b>同時(shí)閃爍的庫(kù)<b class='flag-5'>函數(shù)</b>免費(fèi)下載

    單片機(jī)模塊學(xué)習(xí)

    單片機(jī)的幾個(gè)寄存器學(xué)完了,就是對(duì)模塊的學(xué)習(xí),同時(shí)也有一些協(xié)議比如iic,spi,單線等等,高級(jí)的單片機(jī)會(huì)用到高級(jí)的協(xié)議LED數(shù)碼管鍵盤(pán)串口
    發(fā)表于 11-14 14:36 ?1次下載
    <b class='flag-5'>單片機(jī)</b><b class='flag-5'>模塊</b>學(xué)習(xí)

    hc06藍(lán)牙模塊接51單片機(jī)點(diǎn)亮LED

    hc06藍(lán)牙模塊接51單片機(jī)點(diǎn)亮LED
    發(fā)表于 11-20 19:06 ?52次下載
    hc06藍(lán)牙<b class='flag-5'>模塊</b>接51<b class='flag-5'>單片機(jī)</b>點(diǎn)亮<b class='flag-5'>LED</b>

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

    ) //循環(huán) { }}使用51單片機(jī)點(diǎn)亮一個(gè)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)亮一個(gè)<b class='flag-5'>LED</b> <b class='flag-5'>LED</b>閃爍

    C語(yǔ)言&單片機(jī)不定參數(shù)個(gè)數(shù)的函數(shù)定義

    在學(xué)習(xí)使用C語(yǔ)言的時(shí)候都會(huì)告知main函數(shù)是可以接入多個(gè)參數(shù)的,那么問(wèn)題來(lái)了,不定參數(shù)個(gè)數(shù)的函數(shù)如何定義的呢,它是否可以在單片機(jī)中使用呢定義
    發(fā)表于 11-29 09:51 ?8次下載
    C語(yǔ)言&<b class='flag-5'>單片機(jī)</b>不定參數(shù)個(gè)數(shù)的<b class='flag-5'>函數(shù)</b><b class='flag-5'>定義</b>

    串口調(diào)用單片機(jī)函數(shù)(c/c++)[自定義shell]

    調(diào)試單片機(jī)常用,參考正點(diǎn)原子USMART寫(xiě)了個(gè)簡(jiǎn)單的自用核心內(nèi)容如下1、C語(yǔ)言(stm32)定義typedef struct ShellFun_CLASS{ void* func; //函數(shù)
    發(fā)表于 01-13 13:25 ?1次下載
    串口調(diào)用<b class='flag-5'>單片機(jī)</b><b class='flag-5'>函數(shù)</b>(c/c++)[自<b class='flag-5'>定義</b>shell]

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

    正常的程序,都不會(huì)跳出main,但是,如果跳出了 main 函數(shù),程序到底去哪兒了,你有相關(guān)這個(gè)問(wèn)題嗎?
    的頭像 發(fā)表于 08-25 10:42 ?963次閱讀

    如何在單片機(jī)中使用malloc函數(shù)

    但是每個(gè)嵌入式 RTOS 都會(huì)有自己的內(nèi)存管理方式,本文就來(lái)聊聊我對(duì) malloc 函數(shù)單片機(jī)程序設(shè)計(jì)中的一些看法。 本文并不是要說(shuō)明在單片機(jī)中怎么使用 malloc函數(shù),而是
    的頭像 發(fā)表于 04-24 09:50 ?2649次閱讀
    如何在<b class='flag-5'>單片機(jī)</b>中使用malloc<b class='flag-5'>函數(shù)</b>

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

    單片機(jī)用按鈕中斷函數(shù)? 單片機(jī)中斷是一種能夠使單片機(jī)響應(yīng)外部信號(hào)的機(jī)制,這種機(jī)制允許單片機(jī)在處理其他任務(wù)時(shí)去響應(yīng)中斷信號(hào),從而提高
    的頭像 發(fā)表于 09-01 10:17 ?1623次閱讀
    主站蜘蛛池模板: 成人国产在线视频 | 亚洲香蕉影院 | 色综合天天综合网国产人 | 黄色视奸 | 日本爱爱片 | 美女视频永久黄网站免费观看国产 | 可以免费看黄的网站 | a级午夜毛片免费一区二区 a看片 | 成人a毛片免费全部播放 | 国产最好的精华液网站 | 网络色综合久久 | 天天摸天天做天天爽天天弄 | 黄色永久免费 | 国产成人高清一区二区私人 | jk黑色丝袜美腿老师啪啪 | 在线色网| 六月婷操 | www.在线视频| 四虎免费影院在线播放 | 亚洲欧美在线精品一区二区 | 国模吧双双大尺度炮交gogo | 国产全黄三级三级 | 人人干人人做 | 天天爽夜夜爽天天做夜夜做 | 国产精品久久久亚洲 | 中文字幕一区二区三区精彩视频 | 久久精品影院永久网址 | 天天干夜夜叭 | 六月丁香婷婷天天在线 | 五月天色丁香 | 国模最新私拍视频在线观看 | 婷婷丁香五月中文字幕 | 性欧美长视频 | 韩国三级hd中文字幕久久精品 | 色综合天天综一个色天天综合网 | 亚洲精品美女 | 国产紧缚jvid| 亚洲色图综合网 | 欧美线人一区二区三区 | 天天天天做夜夜夜做 | 伊人狼人综合网 |