色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

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

3天內不再提示

編寫一個簡單的C51程序

Q4MP_gh_c472c21 ? 來源:TsinghuaJoking ? 作者:TsinghuaJoking ? 2022-03-12 11:17 ? 次閱讀

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

01 問題提出

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

#include

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

voidmain(void){
test(1);
}

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

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

#include

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

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

??上面兩種情況的區別,在于第二個程序中 主循環 main() 函數始終沒有退出,而第一個程序,main() 函數退出了。似乎前面LED 微微點亮 應該與 主函數 退出之后,單片機都干了些啥有關系。

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

02 程序去哪兒了?

從上面提問者書寫的代碼來看,應該是一位C51的愛好者,使用的是C51的編譯器,在一款C51開發板上愉快的進行實驗。他一開始沒有安裝嵌入式程序開發的慣例在主程序void main(void) 中利用無限循環將程序控制在主程序函數中,就出現了前面實驗結果中令人迷惑的情況。
注:他是一個膽大心細的人,觀察還挺仔細的。

2.1 盤古開天辟地

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

??關于C51是如何啟動的, 在如下面博文中也被測試說明:

  • 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)中進行逐步調試跟蹤驗證過:

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


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

2.2 世界盡頭

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

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

2.2.1 Keil編譯器

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

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

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

2.2.2 MAPLAB編譯器

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

總??結

對于嵌入式系統,如果沒有運行RTOS,那么程序開發中的 主函數(main())需要通過某種機制使其永遠愉快的運行下去,它沒有終點。

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

原文標題:程序結束后去哪兒了?

文章出處:【微信公眾號:嵌入式ARM】歡迎添加關注!文章轉載請注明出處。

審核編輯:湯梓紅


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

    關注

    6042

    文章

    44617

    瀏覽量

    637553
  • C語言
    +關注

    關注

    180

    文章

    7614

    瀏覽量

    137426
  • 函數
    +關注

    關注

    3

    文章

    4345

    瀏覽量

    62871

原文標題:程序結束后去哪兒了?

文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    C51基本結構程序設計

    C51基本結構程序設計1. 掌握if語句來實現選擇結構,能利用if語句編寫相應的分枝結構的程序。在嵌套if語句中,定要搞清楚else與哪個
    發表于 06-12 23:44 ?32次下載

    C51程序的函數教程

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

    單片機C51編程規范

    單片機C51編程規范 1單片機C51編程規范- 前言   為了提高源程序的質量和可維護性,從而最終提高軟件產品生產力,特編寫此規范。
    發表于 01-14 21:03 ?2591次閱讀

    Keil C51庫函數參考

    第五章 Keil C51庫函數參考 C51強大功能及其高效率的重要體現之在于其豐富的可直接調用的庫函數,多使用庫函數使程序代碼簡單,結構清
    發表于 04-07 09:45 ?413次下載

    C51精確延時函數的編寫及調試方法

    本內容詳細介紹了C51精確延時函數的編寫及調試方法
    發表于 05-24 11:33 ?272次下載
    <b class='flag-5'>C51</b>精確延時函數的<b class='flag-5'>編寫</b>及調試方法

    C51語言程序設計技巧

    1 C51語言程序設計\技巧 C語言 是種高級程序設計語言,它提供了十分完備的規范化流程控制結構。因此采用
    發表于 05-17 14:02 ?6045次閱讀
    <b class='flag-5'>C51</b>語言<b class='flag-5'>程序</b>設計技巧

    流水燈的C51程序

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

    C51單片機對液晶片的驅動

    Keil C51編寫的192*64液晶片驅動程序,感謝很多網友提供了參考源程序, 本程序是在網友們提供的
    發表于 11-19 16:22 ?1881次閱讀

    如何使用KEIL C51和proteus實現C51匯編程序的設計實例

    本文檔的主要內容詳細介紹的是如何使用KEIL C51和proteus實現C51匯編程序的設計實例。
    發表于 07-30 17:35 ?19次下載
    如何使用KEIL <b class='flag-5'>C51</b>和proteus實現<b class='flag-5'>C51</b>匯編<b class='flag-5'>程序</b>的設計實例

    X25045的C51讀寫程序

    本文檔的主要內容詳細介紹的是X25045的C51讀寫程序
    的頭像 發表于 01-18 11:13 ?3157次閱讀

    單片機C51語言程序設計基礎的資料合集免費下載

    本文檔的主要內容詳細介紹的是單片機C51語言程序設計基礎的資料合集免費下載包括了:單片機開發概述,構建C51集成開發環境,單片機C51語言程序
    發表于 03-16 08:00 ?19次下載
    單片機<b class='flag-5'>C51</b>語言<b class='flag-5'>程序</b>設計基礎的資料合集免費下載

    51單片機讀寫AT29C040的C51程序

    本文檔的主要內容詳細介紹的是給大家介紹51單片機讀寫AT29C040的c51程序
    的頭像 發表于 11-07 12:01 ?5002次閱讀

    單片機C51程序設計的學習課件免費下載

    本文檔的主要內容詳細介紹的是單片機C51程序設計的學習課件免費下載包括了:1、C51程序設計基礎,2、C51的數據類型及其在
    發表于 11-24 17:24 ?64次下載
    單片機<b class='flag-5'>C51</b><b class='flag-5'>程序</b>設計的學習課件免費下載

    Keil C51與單片機開發入門(第一個程序

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

    c51流水燈程序下載

    c51流水燈程序免費下載。
    發表于 05-20 17:15 ?10次下載
    主站蜘蛛池模板: 伊人久久大香线蕉综合99 | 快穿之诱受双性被灌满h | 欧美6O老妪与小伙交 | 久久精品一区二区三区资源网 | 国精产品一区一区三区有限在线 | max girls 大感谢祭 | 2020国产成人精品免费视频 | 亚洲人美女肛交真人全程 | 在线观看亚洲专区5555 | 国产精品三级在线观看 | 久久综合久久鬼色 | 国精产品999一区二区三区有限 | 亚洲性夜夜夜色综合网 | S货SAO死你BL大点声叫BL | 日本免费一本天堂在线 | 日韩欧美国产免费看清风阁 | 久久黄色免费 | 伊人久久大香网 | 国产成人精品男人的天堂网站 | 欧美男男网站免费观看videos | 国产麻豆精品传媒AV国产在线 | 亚洲国产精品综合久久一线 | 国产精品系列在线观看 | 丝袜美女被啪啪不带套漫画 | 色男人综合 | 日本阿v在线资源无码免费 日本阿v片在线播放免费 | 在线视频av大全色久久 | 一本之道高清www在线观看 | 神马影院在线eecss伦理片 | 成人国产精品免费网站 | 囯产精品一区二区三区线 | jizzxxxx18中国内地 | 国内精品乱码卡一卡2卡三卡 | 亚洲精品视频观看 | 国产午夜在线观看视频 | 我和妽妽在厨房里的激情区二区 | 欧美xxx性| 亚洲日韩视频免费观看 | 色婷婷激情AV精品影院 | 黑人 尺寸 强行害怕 痛哭 | 国产一及毛片 |