單片機的RAM與ROM概念

RAM與ROM

  • 1、RAM與ROM
  • 2、 bss、data、heap、stack、text詳細講解
  • 3、詳細探討 TCM、OCRAM 和 HBNRAM 之間的區別及其具體作用。
    • 3.1、TCM(Tightly Coupled Memory)
    • 3.2、 OCRAM(On Chip RAM)
    • 3.3、HBNRAM (Hibernate RAM)
    • 3.4、總結

1、RAM與ROM

keil編譯完成后,會有提示,形如:
在這里插入圖片描述
其中:

  1. Code為代碼,本質上就是一大堆ARM指令;

  2. RO為只讀的數據,下文的text段和constdata段屬于此屬性區。例如,char *name = “TOM”;//TOM三個字符就存放在ROM中作為RO-DATA;char cmd[] = “AT”;AT兩個字符會在RAM和FLASH中各有一份。有些常量會在RO區中,有些例如立即數,會直接被編譯在code區中。

  3. RW為非0初始化的全局變量和靜態變量占用的RAM大小,下文中的.data段和.bss屬于RW區。注意:同時還要占用等量的ROM大小用于存放這些非0變量的初值;

  4. ZI(zero initialize)沒有進行初始化或者初始化為0。(該區域3個用途:0初始化的全局和靜態變量+堆區+棧區)。

下面是keil自動生成的.map文件中的信息:

Flash的占用量就是上圖中:

  • ROM Size的大小,它包含了①+②+③的大小【ARM指令代碼+只讀數據+非0初始化變量的初值】(Flash 占用大小 = .text 大小 + .data大小 + 其它section(如.bss, .stack, .heap等) 位置信息大小)
  • RAM的占用量包含上述③+④的大小,也即【非0初始化變量、0初始化RAM(又分為0初始化靜態變量區+堆區+棧區)】(SRAM 占用大小 = .data 大小 + .bss 大小 + .stack大小 + .heap大小)

2、 bss、data、heap、stack、text詳細講解

  • text代碼段:用來存放代碼和常量(const 關鍵字定義的變量)

  • .data數據段:用來存放有初始值非0的全局變量和靜態變量(static修飾的變量,包括全局靜態變量和靜態局部變量),在MCU啟動過程中,會被從 flash 內 copy 到 SRAM 內(各家的啟動代碼都會做此操作)。

  • .bss段:存儲未初始化或初始化為 0 的全局/靜態變量不占用可執行文件的實際磁盤空間,僅在程序加載時由系統分配內存并清零。存儲已初始化為非零值的全局/靜態變量,需占用可執行文件空間保存初始數據。例如:static int arr[3] = {1, 2, 3}; 需要在 .data 段存儲這 3 個值。

  • **.stack棧空間:**用來存放局部變量、入參參數、返回值等,由編譯器自動分配釋放,如一個函數被調用后,產生的臨時變量都會存到棧區的頂部,當函數完成后,會自動從頂部將剛使用的數據銷毀。棧區的地址是從高地址向下增長的。

  • .heap 堆區: 用來動態內存分配,如 malloc, new 申請的內存,由程序員手動分配釋放。程序中不釋放,則程序結束時,由OS回收;據說這個和數據結構中的堆 沒有什么關系;堆區使用時地址向上增長。

ROM與RAM數據比較

數據段說明RAMROM
.bsstruefalse
.datatruetrue
RO-data常量falsetrue
.textfalsetrue
stack局部變量等truefalse
heapmalloctruefalse

示例代碼演示

int init_nonzero_global  = 0x55;               //初始化的全局變量,存在.data
int init_zero_global      =0;                  //初始化為0, 存在.bss
const int const_a      = 0xaa;                 //常量, 在.text
static char uninit_global;                    //未初始化的靜態變量,在.bss 
static char e      = '123456';                //初始化的靜態變量,在 .data 的 static 區域
static char init_zero_global = 0;            //初始化為0的全局靜態變量,存在.bss 
void main (void)
{int f;                                  //未初始化的局部變量, 在 .stackint g = 2;                              //初始化的局部變量, 在 .stackstatic int x;                          //未初始化的靜態變量,在 .bssstatic int y = 3;                      //初始化的靜態變量,在 .data 的 static 區域char *p1;                             //p1 .stackp1 = (char *)malloc(50);    //分配得來的50個字節的區域在 .heapif(NULL == p1){free(p1);           //釋放 .heap 50個字節}while(1){}
}

運行結果:在Nordic編譯環境進行測試只有未初始化的全局變量存放在bss中。

bss、data、heap、stack、text示意圖:
單片機的程序運行時,這 5 段在物理存儲器上的位置,如下圖所示:
Flash

3、詳細探討 TCM、OCRAM 和 HBNRAM 之間的區別及其具體作用。

3.1、TCM(Tightly Coupled Memory)

具體作用

  • TCM 是一種緊耦合存儲器,通常用于實時計算的處理器中,如 ARM Cortex-M 系列。

  • 與緩存相比,TCM 的訪問延遲較低,能夠提供確定性的訪問時間。

  • 通常用于存放關鍵性代碼或數據,以減少訪問時間,提升系統性能。

特點與用途

  • 低延遲:因為與處理器緊密耦合,訪問速度非常快。

  • 確定性:適用于要求嚴格實時性能的應用場景。

  • 固定大小:通常較小且固定大小的內存區域。

3.2、 OCRAM(On Chip RAM)

具體作用

  • OCRAM 是片上隨機存取存儲器,與主存儲器(如 DRAM)相比,其訪問延遲較低。
  • 一般用于存儲經常需要訪問的數據,以提高訪問效率。

特點與用途

  • 快速訪問:相比于外部存儲器(如 DRAM),訪問速度快,適用于需要頻繁訪問的數據。

  • 中等容量:容量通常較大于 TCM,但仍然有限。

  • 多用途:可以用來存儲代碼、數據,甚至可以作為緩沖區。

3.3、HBNRAM (Hibernate RAM)

具體作用

  • HBNRAM 是一種特定用途的內存,主要用于低功耗或休眠模式下的數據保持。
  • 在系統進入休眠模式時,可以存儲一些重要數據,確保在喚醒時可以快速恢復。

特點與用

  • 低功耗:設計上強調低功耗,數據在休眠模式中保持。

  • 數據保持:適用于需要在休眠狀態中保留關鍵數據的應用。

  • 小容量:通常容量較小,主要存儲需要在低功耗模式下保留的數據。

3.4、總結

參數TCMOCRAMHBNRAM
作用實時、低延遲訪問快速訪問數據/代碼低功耗數據保持
延遲極低
容量較小中等
用途存放關鍵代碼/數據存放頻繁訪問的數據/代碼休眠模式下維護重要數據
特點低延遲、確定性快速訪問、多用途低功耗、數據保持

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/96668.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/96668.shtml
英文地址,請注明出處:http://en.pswp.cn/web/96668.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

實驗3:事件處理(2學時)

實驗目的(1)熟練掌握 v-on 指令的用法,學會使用 v-on 指令監聽 DOM 元素的事件,并通過該事件觸發調用事件處理程序。(2)掌握v-on 指令修飾符的基本用法。實驗內容實現購物車功能的拓展(商品數量…

商品庫存扣減方案

文章目錄1. Lua腳本 Redis(業界首選,綜合最優)2. Redis原子命令(DECRBY 結果校驗)3. Redis事務(MULTI/EXEC)4. 分布式鎖(基于Redis實現)5. Redisson客戶端封裝&#xf…

關于在阿里云DMS誤操作后如何恢復數據的記錄

前言 昨天因客戶員工操作錯誤,導致快遞單號和訂單互換。客戶員工那邊讓筆記修改數據。 于是筆者寫下如下SQL來操作,導致了災難性事故。 update t_order_fed_ex_record set tracking_number 884102170661, master_tracking_number 884102170661, push…

【操作系統核心知識梳理】線程(Thread)重點與易錯點全面總結

在多任務操作系統中,線程是比進程更輕量的執行單元,理解線程的特性和實現方式是掌握并發編程的基礎。本文系統梳理了線程相關的核心知識點和常見誤區,助你夯實操作系統基礎。一、線程的基本概念與引入目的 1.1 什么是線程? 線程是…

深入理解 Python 中的 `__call__` 方法

化身為可調用的對象:深入理解 Python 中的 __call__ 方法 引言:函數與對象的邊界模糊化 在 Python 中,我們最熟悉的概念莫過于函數(Function) 和對象(Object)。函數是可調用的(calla…

云服務器使用代理穩定與github通信方法

使用SSH反向隧道 (SSH Reverse Tunneling) 利用SSH連接在您的本地電腦和云服務器之間建立一個反向的加密通道。 原理: 從本地電腦發起一個SSH命令到您的云服務器,這個命令會告訴云服務器:“請監聽您自己的某個端口(例如&#xff1…

7.k8s四層代理service

Service的基本介紹 Cluster IP:每個 Service 都分配了一個Cluster IP,它是一個虛擬的內部IP地址,用于在集群內部進行訪問。這個虛擬IP是由Kubernetes自動分配的,并且與Service對象一一對應。 端口映射:Service可以映射…

Qt 工程中 UI 文件在 Makefile 中的處理

Qt 工程中 UI 文件在 Makefile 中的處理 在 Qt 工程中,.ui 文件(Qt Designer 界面文件)需要通過 uic(用戶界面編譯器)工具轉換為對應的頭文件。以下是幾種情況下如何處理 UI 文件:1. 使用 qmake 自動生成 M…

ZLMediaKit性能測試

一、環境 系統:虛擬機 Ubuntu22.04 64bit配置: 4核8G設置:ulimit -n 102400 二、安裝 依賴安裝sudo apt update sudo apt install ffmpeg sudo apt install nloadzlm服務安裝參考:https://blog.csdn.net/hanbo622/article/details/149064939?…

智能文檔處理業務,應該選擇大模型還是OCR專用小模型?

智能文檔處理業務中,最佳策略不是二選一,而是“大小模型協同”。用專用小模型處理高頻、標準化的核心文檔流,實現極致效率與成本控制;用大模型賦能非標、長尾文檔的靈活處理,加速業務創新。 OCR小模型會被大模型取代嗎…

android 如何判定底部導航欄顯示時 不是鍵盤顯示

在 Android 中判定底部導航欄是否顯示時,核心痛點是 區分 “導航欄的底部 Insets” 和 “軟鍵盤彈出的底部 Insets”—— 兩者都會導致 getSystemWindowInsetBottom() 返回非零值,直接判斷會誤將鍵盤彈出當成導航欄顯示。以下是基于 WindowInsets 類型區…

你知道服務器和電腦主機的區別嗎?

我們都知道服務器和臺式主機有著不同之處,但具體說出個一二三來很多人還是一頭霧水,也就是知其然不知其所以然,都是CPU主板 內存 硬盤 電源,撐死就差一個顯卡不同,但其實服務器和我們正常使用的臺式主機差距很大&#…

什么是包裝類

什么是包裝類 在Java中,包裝類(Wrapper Class)是為基本數據類型提供的對應的引用類型。Java中的基本數據類型(如int、char、boolean等)不是對象,為了在需要對象的場景中使用基本數據類型(如集合…

用Python打造專業級老照片修復工具:讓時光倒流的數字魔法

在這個數字化時代,我們手中珍藏著許多泛黃、模糊、甚至有劃痕的老照片。這些照片承載著珍貴的回憶,但時間的侵蝕讓它們失去了往日的光彩。今天,我將帶您一起用Python開發一個專業級的老照片修復工具,讓這些珍貴的記憶重現光彩。為…

linux中查找包含xxx內容的文件

linux中怎么查找哪個文件包含xxx內容 在Linux中查找包含特定內容的文件 在Linux系統中,有幾種常用方法來查找包含特定內容的文件。以下是幾種最有效的方法:1. 使用 grep 命令(最常用) 基本語法:bash grep -r "搜索…

sklearn 加州房價數據集 fetch_california_housing 出錯 403: Forbidden 修復方案

問題 加載加州房價數據時出現 403 錯誤 HTTP Error 403: Forbidden from sklearn.datasets import fetch_california_housingcalifornia fetch_california_housing() print(california.target.shape) 解決方案 運行下述代碼,然后再運行上述的 fetch_california_hou…

嵌入式學習---(硬件)

1、在LED實驗中,在對Soc引腳配置時都做了哪些工作?復用功能配置操作寄存器:IOMUXC_SW_MUX_CTL_PAD_GPIO1_IO03將引腳的低 4 位設置為 0101,將引腳復用為 GPIO 功能電氣特性配置操作寄存器:IOMUXC_SW_PAD_CTL_PAD_GPIO1…

微信小程序開發教程(十一)

目錄:1.上拉觸底案例-初步實現上拉觸底效果2.上拉觸底案例-添加loading效果3.上拉觸底案例-節流處理4.擴展-自定義編譯模式1.上拉觸底案例-初步實現上拉觸底效果頁面加載的時候調用這個方法:設置樣式:下拉觸底后繼續調用獲取顏色的方法2.上拉…

Android相機API2,基于GLSurfaceView+SurfaceTexture實現相機預覽,集成的相機算法采用GPU方案,簡要說明

Android相機API2,基于GLSurfaceViewSurfaceTexture實現相機預覽,集成的相機算法采用GPU方案,簡要流程如下(不疊加相機算法的預覽顯示流程也大體如此,只是去掉了算法部分):進入相機:1,新建實現了…

[code-review] 日志機制 | `LOG_LEVEL`

第6章:日志機制(調試) 歡迎來到我們了解ChatGPT-CodeReview項目的最后一章 在第5章:文件過濾邏輯(范圍管理器)中,我們學習了機器人如何智能地決定哪些文件需要發送給AI審查。 但一旦機器人開…