對單片機地址空間和堆棧的理解

2020-12-16 電子工程專輯
idata—可尋址片內ram,允許訪問全部內部ram 0x00-0xff
xdata—可尋址片外ram 0x0000- 0xffff
程序存儲區單片機存儲器有ROM跟RAM之分,RAM存放中間結果,數據和經常變換的代碼,ROM存放code。51單片機採用的是哈弗結構,即數據跟代碼擁有單獨的地址空間。存儲器可以分為程序存儲器(EEPROM、FLASH之類)、內部數據存儲器(ram)、SFR、位地址空間和外部數據存儲器。
內部數據存儲器在物理上分為內部SRAM和特殊功能寄存器,而內部分為低(0x00-0x7f)和高(0x80-0xff),高128位元組地址重複,需要不同的訪問方式。SFR用直接尋址方式,SRAM需要間接方式。這裡SFR是寄存器,硬體上是中央處理器的內部組成部分,訪問速度很快。在低128B的SRAM,0x00-0x1f是4個通用工作寄存器,每組有R0-R7。要使用哪一組,都可以通過PSW中的RS1、RS0來配置。位尋址是在0x20-0x2f。


程序內存可以分為幾個區,包括棧區(stack)、堆區(Heap)、全局區(static)、文字常亮區和程序代碼區。程序編譯之後,全局變量,靜態變量已經分配好內存空間。在函數運行時,程序需要為局部變量分配棧空間。當中斷來時,也需要將函數指針入棧,保護現場,以便於中斷處理完之後再回到之前執行的函數。棧是從高到低分配,堆是從低到高分配。我們一般說的堆棧往往指的是棧。堆棧又分硬堆棧和軟堆棧,硬堆棧即SP,從片內RAM的頂部向下生長。軟堆棧在硬堆棧跟全局變量區之間的空間。C51函數調用通過R0-R7和棧來實現。


為什麼單片機啟動時,不需要用bootloader將代碼從ROM搬移到RAM,而ARM則需要?這裡我們可以先看看單片機程序執行的過程。
單片機執行分三個步驟,取執行——分析指令——執行指令。
取指令的任務是:根據PC的值從程序存儲器讀出指令,送到指令寄存器,然後分析執行。這樣單片機就從內部程序存儲器取代碼指令,從RAM存取相關數據。要知道RAM取數的速度是遠高於ROM的,但是單片機因為本身運行頻率不高,所以從ROM取指令慢並不構成影響。而ARM不同,CPU運行的頻率高,遠大於從ROM讀寫的速度,所以一般只要有作業系統,都需要將代碼部分拷貝到RAM中再執行。


本文轉載自:今日頭條(版主:小魁說事)

免責聲明:本文為轉載文章,轉載此文目的在於傳遞更多信息,版權歸原作者所有。本文所用視頻、圖片、文字如涉及作品版權問題,請聯繫小編進行處理。

貿澤電子設計圈由貿澤電子(Mouser Electronics)開發和運營,服務全球廣大電子設計群體,貿澤電子分銷超過800家領先品牌,可訂購500多萬種在線產品,為客戶提供一站式採購平臺,歡迎關注我們,獲取第一手的設計與產業資訊信息!



相關焦點

  • 單片機地址空間,堆棧理解
    idata—可尋址片內ram,允許訪問全部內部ram 0x00-0xffpadata—分頁尋址訪問片外ramxdata—可尋址片外ram 0x0000- 0xffffcode--程序存儲區單片機存儲器分ROM跟RAM之分,RAM存放中間結果,數據和經常變換的代碼,ROM存放code。
  • 什麼叫軟體堆棧,什麼叫硬體堆棧?
    什麼叫軟體堆棧,什麼叫硬體堆棧?兩者的區別是什麼?看其棧頂指針是否和CPU具有特殊的關聯,有關聯者(如SP)「硬」,而無關聯者「軟」。
  • STM32分配堆棧空間不足問題原因及解決方法
    在開發過程中,我們有時候可能會遇到數據錯誤的情況,而這個情況發生多數是由於堆棧溢出導致,這裡我們將詳細講解復現堆棧溢出會導致的問題及提供相應的解決方法。   先說結論,以STM32F103RCT6為例,初始的棧空間是1KB,堆空間是512Byte。如果動態內存分配需求過多時,需要手動調節堆空間。
  • 函數調用中堆棧的個人理解
    首先我們來看一下什麼是堆、棧還有堆棧,我們經常說堆棧其實它是等同於棧的概念。     可以通俗意義上這樣理解堆,堆是一段非常大的內存空間,供不同的程式設計師從其中取出一段供自己使用,使用之後要由程式設計師自己釋放,如果不釋放的話,這部分存儲空間將不能被其他程序使用。堆的存儲空間是不連續的,因為會因為不同時間,不同大小的堆空間的申請導致其不連續性。
  • 對ARM堆棧的理解
    堆棧其實就是內存中的一段連續空間,只是有了堆棧指針,所以顯得比較特別,堆棧一般分為兩種:向上生長:堆棧指針向高地址方向生長,稱為遞增堆棧。
  • ARM編程:ARM初始化,堆棧地址是怎樣計算的
    SPACEUSR_STACK_LEGTH*4;用戶(系統)模式堆棧空間SPACEFIQ_STACK_LEGTH*4;快速中斷模式堆棧空間>SPACEABT_STACK_LEGTH*4;中止義模式堆棧空間
  • 堆棧在C語言中的定義(單片機的中堆棧相當於棧)
    數據結構的棧和堆 首先在數據結構上要知道堆棧,儘管我們這麼稱呼它,但實際上堆棧是兩種數據結構:堆和棧。 堆和棧都是一種數據項按序排列的數據結構。內存分配中的棧和堆 然而我要說的重點並不在這,我要說的堆和棧並不是數據結構的堆和棧,之所以要說數據結構的堆和棧是為了和後面我要說的堆區和棧區區別開來,請大家一定要注意。
  • 單片機全局變量 局部變量 堆與棧 的區別
    單片機全局變量 局部變量 堆與棧 的區別本文引用地址:http://www.eepw.com.cn/article/201611/323093.htm局部變量空間,就是堆棧空間,也就是棧空間。
  • 彙編語言中的堆棧是什麼?
    1、初始堆棧空間是作業系統給應用程式分配的內存空間;2、程序運行時用來存儲臨時數據的地方,比如參數、返回值;3、寄存器ESP是棧頂指針,ESP指向哪個內存地址,哪個內存地址就是堆棧棧頂,ESP保存的數據,正是堆棧已使用地址的棧頂。
  • nRF24L01寄存器地址與說明
    (1)在配置模式下單片機通過SPI接口配置nRF24L01的工作參數。   (2)在發射或接收模式下單片機SPI接口發送或接收數據。   和SPI接口的指令共有8個,使用每個指令時必須使CSN變低,用完後將其變高。單片機的控制指令從nRF24L01的MOSI引腳輸入,而nRF24L01的狀態信息和數據信息是從其MISO引腳輸出並送給單片機的。
  • MCS-51單片機試題及答案
    A.接收中斷請求標誌位 B.發送中斷請求標誌位  C.串行口允許接收位 D.地址/數據位  三、簡答題(每小題4分,共20分)  1.簡述堆棧。  2.簡述變址尋址方式並舉例說明。  3.簡述中斷響應的主要內容。
  • stm32 堆棧分配
    1.堆和棧大小定義大小在startup_stm32f2xx.s本文引用地址:http://www.eepw.com.cn>0startup_stm32f2xx.o(STACK)顯然Cortex-m3資料可知:__initial_sp是堆棧指針
  • 堆棧的功能是什麼?有什麼操作原則?棧頂地址如何指示?
    堆棧是存儲器中的特殊群體。在內RAM中專門闢出一個連續存儲區,用來暫時存放子程序斷口地址、中斷斷口地址和其他需要保存的數據。本文引用地址:http://www.eepw.com.cn/article/201611/323156.htm堆棧操作無論是存入或取出數據,均只能依次存人或依次取出,不能越位,必須遵循「先進後出"、「後進先出」的原則。堆棧指針SP指出棧頂存儲單元的地址。
  • STC單片機EEPROM的應用和程序
    本文引用地址:http://www.eepw.com.cn/article/201611/320955.htm單片機運行時的數據都存在於RAM(隨機存儲器)中,在掉電後RAM 中的數據是無法保留的,那麼怎樣使數據在掉電後不丟失呢?
  • 單片機原理|C51程序設計基礎複習題
    A、源程序 B、彙編程序 C、目標程序 D、編譯程序12 C51編譯器提供了一組宏定義來對code、data、pdata和xdata空間進行絕對尋址,其定義的頭文件為( B)。A、只支持一般指針,或叫通用指針,即標準C語言的指針 B、只支持存儲器指針 C、和標準C一樣同時支持一般指針和存儲器指針 D、C51同時支持一般指針和存儲器指針,但標準C不支持存儲器指針19 單片機程序設計中需要在主程序設計死循環,在C51中實現死循環採用語句(C )。
  • 01-JavaScript 調用堆棧
    JavaScript 引擎是一個單線程解析器,而單線程解析器由堆和單一調用棧組成。瀏覽器提供 Web APIs,比如:DOM,AJAX 和 定時器。 本文旨在說明什麼是調用堆棧以及為什麼需要調用棧?對調用棧的理解有助於我們更加清晰的知道 函數的的層次結構和執行順序 在 JavaScript 的引擎中工作方式。
  • 採用單片機的瀝青智能軟化點測試儀簡介
    引言本文引用地址:http://www.eepw.com.cn/article/170705.htm直徑為10mm的瀝青球試樣安放於浸泡在傳熱介質中的支架上,當加熱到一定溫度時
  • S12單片機模塊應用及程序下載調試
    default.prm文件用於定義目標代碼的裝載地址,用戶應當根據使用單片機的內存分配情況修改這個文件。CodeWarrior 自動生成的 .prm 文件默認MC9S12DG128 的RAM 在:      RAM = READ_WRITE 0x0400 TO 0x1FFF;      這個默認區間必須修改,因為在這一空間有 1K 的I/O 寄存器空間 和2K EEPROM 空間。使用默認定義會丟失1K RAM 和 2K EEPROM。
  • 基於單片機的LED彩燈控制器
    對於EPROM型單片機,在EPROM編程期間,此引腳接收編程脈P衝(PROG功能)③PSEN外部程序存儲器讀選通信號輸出端,在從外部程序存儲取指令(或數據)期間,在每個機器周期內兩次有效。同樣可以驅動八LSTTL輸入。④ EA/Vpp 、EA/Vpp為內部程序存儲器和外部程序存儲器選擇端。
  • 面向51單片機的Keil uVision4的四種基本數據類型
    的Keil uVision4對此進行了簡化, 因此,可以理解為只存在如下四種基本數據類型: 1、char:字符型 2、int = short = short int:整型 3、long = long int:長整型