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

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

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

關(guān)于單片機(jī)堆棧操作:堆棧是單片機(jī)中的存儲單元

454398 ? 來源:博客園 ? 作者:Andrew_qian ? 2020-10-21 17:32 ? 次閱讀

看關(guān)于單片機(jī)方面的書籍的時候,總是能看到別人說的一些堆棧啊什么的操作,之前看到這個術(shù)語就直接跳過,沒想到去探究單片機(jī)內(nèi)部的原理。但是最近課程學(xué)習(xí)微機(jī)原理這門課,需要我們寫匯編程序,匯編里面經(jīng)常遇到堆棧這個東西,所以就找了個時間把堆棧給徹底的搞一下。

如果了解一點(diǎn)匯編編程話,就可以知道,堆棧是內(nèi)存中一段連續(xù)的存儲區(qū)域,用來保存一些臨時數(shù)據(jù)。通常用來保存CALL指令調(diào)用子程序時的返回地址,RET指令從堆棧中獲取返回地址。中斷指令I(lǐng)NT調(diào)用中斷程序時,將標(biāo)志寄存器值、代碼段寄存器CS值、指令指針寄存器IP值保存在堆棧中。

堆棧也可以用來保存其他數(shù)據(jù)。

堆棧操作由PUSH,POP兩條指令來完成;

堆棧操作的操作數(shù)均為子類型(兩個字節(jié))進(jìn)行操作。

程序內(nèi)存可以分為幾個區(qū),棧區(qū)(stack),堆區(qū)(Heap),全局區(qū)(static),文字常亮區(qū),程序代碼區(qū)。

程序編譯之后,全局變量,靜態(tài)變量已經(jīng)分配好內(nèi)存空間,在函數(shù)運(yùn)行時,程序需要為局部變量分配??臻g,當(dāng)中斷來時,也需要將函數(shù)指針入棧,保護(hù)現(xiàn)場,以便于中斷處理完之后再回到之前執(zhí)行的函數(shù)。

棧是從高到低分配,堆是從低到高分配。

我們一般說的堆棧指的棧。堆棧又分硬堆棧和軟堆棧,硬堆棧即SP,從片內(nèi)RAM的頂部向下生長。軟堆棧在硬堆棧跟全局變量區(qū)之間的空間,C51函數(shù)調(diào)用通過R0-R7和棧來實(shí)現(xiàn)。

為什么單片機(jī)啟動時,不需要用bootloader將代碼從ROM搬移到RAM,而ARM則需要。這里我們可以先看看單片機(jī)程序執(zhí)行的過程,單片機(jī)執(zhí)行分三個步驟,取執(zhí)行---分析指令----執(zhí)行指令。取指令的任務(wù)是:根據(jù)PC的值從程序存儲器讀出指令,送到指令寄存器。然后分析執(zhí)行執(zhí)行。這樣單片機(jī)就從內(nèi)部程序存儲器去代碼指令,從RAM存取相關(guān)數(shù)據(jù)。要知道RAM取數(shù)的速度是遠(yuǎn)高于ROM的,但是單片機(jī)因?yàn)楸旧磉\(yùn)行頻率不高,所以從ROM取指令慢并不影響。而ARM不同,cpu運(yùn)行的頻率高,遠(yuǎn)大于從ROM讀寫的速度,所以一般有操作系統(tǒng),都需要將代碼部分拷貝到RAM中再執(zhí)行。

再來看一個網(wǎng)上很流行的經(jīng)典例子:

main.cpp

int a = 0; 全局初始化區(qū)

char *p1; 全局未初始化區(qū)

main()

{

int b; 棧

char s[] = “abc”; 棧

char *p2; 棧

char *p3 = “123456”; 123456/0在常量區(qū),p3在棧上。

static int c =0; 全局(靜態(tài))初始化區(qū)

p1 = (char *)malloc(10); 堆

p2 = (char *)malloc(20); 堆

}

不知道你是否有點(diǎn)明白了,堆和棧的第一個區(qū)別就是申請方式不同:棧(英文名稱是stack)是系統(tǒng)自動分配空間的,例如我們定義一個 char a;系統(tǒng)會自動在棧上為其開辟空間。而堆(英文名稱是heap)則是程序員根據(jù)需要自己申請的空間,例如malloc(10);開辟十個字節(jié)的空間。由于棧上的空間是自動分配自動回收的,所以棧上的數(shù)據(jù)的生存周期只是在函數(shù)的運(yùn)行過程中,運(yùn)行后就釋放掉,不可以再訪問。而堆上的數(shù)據(jù)只要程序員不釋放空間,就一直可以訪問到,不過缺點(diǎn)是一旦忘記釋放會造成內(nèi)存泄露。

網(wǎng)上一個很好的比喻,摘抄下來,以便理解:

使用棧就象我們?nèi)ワ堭^里吃飯,只管點(diǎn)菜(發(fā)出申請)、付錢、和吃(使用),吃飽了就走,不必理會切菜、洗菜等準(zhǔn)備工作和洗碗、刷鍋等掃尾工作,他的好處是快捷,但是自由度小。

使用堆就象是自己動手做喜歡吃的菜肴,比較麻煩,但是比較符合自己的口味,而且自由度大。

總結(jié):

其實(shí)堆棧就是單片機(jī)中的一些存儲單元,這些存儲單元被指定保存一些特殊信息,比如地址(保護(hù)斷點(diǎn))和數(shù)據(jù)(保護(hù)現(xiàn)場)。

如果非要給他加幾個特點(diǎn)的話那就是:1、這些存儲單元中的內(nèi)容都是程序執(zhí)行過程中被中斷打斷時,事故現(xiàn)場的一些相關(guān)參數(shù)。如果不保存這些參數(shù),單片機(jī)執(zhí)行完中斷函數(shù)后就無法回到主程序繼續(xù)執(zhí)行了。

2、這些存儲單元的地址被記在了一個叫做堆棧指針(SP)的地方。

好了,以上就是這些。
編輯:hfy

聲明:本文內(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)注

    6030

    文章

    44489

    瀏覽量

    631994
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5294

    瀏覽量

    119816
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1354

    瀏覽量

    114444
  • Call
    +關(guān)注

    關(guān)注

    0

    文章

    9

    瀏覽量

    8319
  • 堆棧
    +關(guān)注

    關(guān)注

    0

    文章

    182

    瀏覽量

    19717
收藏 人收藏

    評論

    相關(guān)推薦

    單片機(jī)怎么寫入程序

    單片機(jī)(Microcontroller Unit,MCU)是一種集成電路芯片,它將計算機(jī)的CPU、存儲器、輸入/輸出接口等功能集成在一個芯片上。單片機(jī)廣泛應(yīng)用于嵌入式系統(tǒng)和物聯(lián)網(wǎng)設(shè)備
    的頭像 發(fā)表于 10-21 11:21 ?217次閱讀

    51單片機(jī)的主要邏輯功能部件是什么

    部件的操作。它包括算術(shù)邏輯單元(ALU),用于執(zhí)行算術(shù)和邏輯運(yùn)算。 2. 存儲器 程序存儲器(ROM):用于存儲程序代碼,通常是
    的頭像 發(fā)表于 10-18 12:49 ?171次閱讀

    單片機(jī)的中斷機(jī)制

    單片機(jī)的中斷機(jī)制是一種重要的處理方式,它允許單片機(jī)在執(zhí)行主程序的過程,能夠暫停當(dāng)前任務(wù),轉(zhuǎn)而處理外部或內(nèi)部緊急事件。這種機(jī)制極大地提高了系統(tǒng)的響應(yīng)速度和處理能力,使得單片機(jī)在各種應(yīng)用
    的頭像 發(fā)表于 10-17 18:03 ?294次閱讀

    單片機(jī)燒錄程序可以重新燒嗎

    好的程序代碼通過特定的方式寫入單片機(jī)存儲,使其能夠按照預(yù)定的邏輯執(zhí)行任務(wù)。單片機(jī)燒錄程序可以重新燒錄,這是單片機(jī)編程和開發(fā)過程
    的頭像 發(fā)表于 09-02 10:04 ?780次閱讀

    單片機(jī)燒錄程序的線比單片機(jī)上的少還能燒錄嗎

    單片機(jī)燒錄原理 單片機(jī)燒錄是指將編寫好的程序代碼通過一定的方式傳輸?shù)?b class='flag-5'>單片機(jī)的存儲,使其能夠按照程序的指令運(yùn)行。這個過程通常需要使用燒錄器
    的頭像 發(fā)表于 09-02 09:54 ?367次閱讀

    單片機(jī)燒錄程序的基本步驟是什么

    單片機(jī)燒錄程序是單片機(jī)開發(fā)過程中非常重要的一步,它涉及到將編寫好的程序代碼通過一定的方式傳輸?shù)?b class='flag-5'>單片機(jī)內(nèi)部的存儲,使
    的頭像 發(fā)表于 09-02 09:47 ?697次閱讀

    單片機(jī)是什么?單片機(jī)編程如何入門?

    單片機(jī)其實(shí)是一種很早的叫法了,最開始我們的前輩叫單板機(jī)或者叫單片機(jī),因?yàn)槟莻€時候單片機(jī)的處理能力還沒有很強(qiáng),現(xiàn)在我們所用的基本都是微型處理單元,也叫為控制器也稱之為MCU
    的頭像 發(fā)表于 03-28 08:03 ?1679次閱讀
    <b class='flag-5'>單片機(jī)</b>是什么?<b class='flag-5'>單片機(jī)</b>編程如何入門?

    單片機(jī)的最小系統(tǒng)由什么組成 單片機(jī)的最小系統(tǒng)包括哪些

    Unit,CPU)、存儲器、輸入輸出接口電路等核心功能,常見的單片機(jī)有以8051為代表的8位單片機(jī)、PIC系列單片機(jī)和AVR系列單片機(jī)等。
    的頭像 發(fā)表于 02-02 11:27 ?9600次閱讀

    單片機(jī)并行是什么意思

    單片機(jī)的并行是指能夠同時執(zhí)行多個操作或指令的能力。傳統(tǒng)的計算機(jī)體系結(jié)構(gòu),處理器通常是按照順序執(zhí)行指令,即一條指令執(zhí)行完畢后再執(zhí)行下一條指令。而在
    的頭像 發(fā)表于 12-20 09:33 ?1142次閱讀

    單片機(jī)boot腳干嘛的

    單片機(jī)boot腳是單片機(jī)的引導(dǎo)腳,用于控制單片機(jī)的啟動和引導(dǎo)過程。在單片機(jī)系統(tǒng),boot腳的作用十分重要,它影響著整個
    的頭像 發(fā)表于 12-19 09:47 ?9128次閱讀

    單片機(jī)如何檢測電流?

    單片機(jī)如何檢測電流? 隨著科技的發(fā)展,單片機(jī)技術(shù)在電子設(shè)備得到了廣泛應(yīng)用。其中,電流檢測是單片機(jī)的一個重要功能之一。本文將詳細(xì)介紹單片機(jī)
    的頭像 發(fā)表于 12-07 15:37 ?3556次閱讀

    單片機(jī)的燒寫次數(shù)是不是無限的呢?單片機(jī)能燒錄多少次?

    單片機(jī)的結(jié)構(gòu)和燒寫方式 單片機(jī)是一種集成電路,它集成了處理器、存儲器、輸入輸出接口等功能。燒寫單片機(jī)時,通常使用專用的編程器連接計算機(jī)和單片機(jī)
    的頭像 發(fā)表于 12-07 13:46 ?3788次閱讀

    什么是單片機(jī)語音芯片?

    在電子技術(shù)的飛速發(fā)展下,語音芯片成為了日常生活不可或缺的一部分。而在語音芯片領(lǐng)域,單片機(jī)語音芯片占據(jù)了重要的地位。那么,究竟什么是單片機(jī)語音芯片呢?一、定義與概念首先,我們來了解一下單片機(jī)
    的頭像 發(fā)表于 12-07 08:53 ?725次閱讀
    什么是<b class='flag-5'>單片機(jī)</b>語音芯片?

    單片機(jī)最小系統(tǒng)原理圖講解

    單片機(jī)最小系統(tǒng),或者稱為最小應(yīng)用系統(tǒng),是指能夠維持單片機(jī)正常工作的最小工作單元。對51系列單片機(jī)來說,最小系統(tǒng)一般應(yīng)該包括:單片機(jī)芯片、晶振
    的頭像 發(fā)表于 11-22 14:13 ?1.4w次閱讀
    <b class='flag-5'>單片機(jī)</b>最小系統(tǒng)原理圖講解

    FPGA和單片機(jī)的區(qū)別

    任務(wù),必須把要解決的問題編成一系列指令(這些指令必須是選定單片機(jī)能識別和執(zhí)行的指令),這一系列指令的集合就成為程序,程序需要預(yù)先存放在具有存儲功能的部件——存儲。
    發(fā)表于 11-14 15:30