<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>
"); //-->

博客專(zhuān)欄

EEPW首頁(yè) > 博客 > MCU和SoC內存使用物理地址還是虛擬地址?

MCU和SoC內存使用物理地址還是虛擬地址?

發(fā)布人:美男子玩編程 時(shí)間:2024-10-14 來(lái)源:工程師 發(fā)布文章

在嵌入式系統中,微控制器 (MCU) 和系統級芯片 (SoC) 的內存管理方式可能有所不同,具體取決于它們的設計和應用場(chǎng)景。


1


微控制器 (MCU)


大多數微控制器 (MCU) 使用物理地址進(jìn)行內存訪(fǎng)問(wèn)。MCU 通常是設計為簡(jiǎn)單、資源有限的嵌入式設備,目標是低功耗、低成本以及實(shí)時(shí)操作。


這些設備一般沒(méi)有復雜的內存管理單元 (MMU) 來(lái)處理虛擬地址到物理地址的映射。因此,程序代碼和數據是直接通過(guò)物理地址訪(fǎng)問(wèn)的。


以常見(jiàn)的 STM32 系列微控制器為例:


  • Flash 存儲器:通常從地址 0x08000000 開(kāi)始。這個(gè)地址是物理地址,程序代碼通常存儲在這里。

  • SRAM:通常從地址 0x20000000 開(kāi)始。這個(gè)地址也是物理地址,用于數據存儲和堆棧操作。


在編程時(shí),當開(kāi)發(fā)者使用指針或訪(fǎng)問(wèn)某個(gè)變量時(shí),實(shí)際操作的是物理地址。例如:


#define LED_PIN (*(volatile uint32_t*)0x48000814)  // 指定 GPIO 端口的物理地址 int main(void) {    LED_PIN = 0x01;  // 設置引腳電平為高    while (1);}


在這個(gè)例子中,0x48000814 是直接引用的物理地址,用于控制 MCU 上的 GPIO 引腳。


2


系統級芯片 (SoC)


與 MCU 不同,系統級芯片 (SoC) 通常集成了更復雜的處理器內核(例如 ARM Cortex-A 系列),并且可能運行如 Linux 這樣的操作系統。


這些 SoC 通常具有內存管理單元 (MMU),能夠將虛擬地址映射到物理地址。因此,虛擬地址是應用程序通常使用的地址空間。


以 Raspberry Pi 這類(lèi)基于 ARM Cortex-A 系列處理器的 SoC 為例:


  • 內核態(tài)地址空間:在操作系統內核中,內核會(huì )管理物理內存,內核代碼通??梢灾苯釉L(fǎng)問(wèn)物理地址,但通常仍使用虛擬地址進(jìn)行管理。

  • 用戶(hù)態(tài)地址空間:應用程序在用戶(hù)態(tài)下運行,所有內存訪(fǎng)問(wèn)都是通過(guò)虛擬地址進(jìn)行的。操作系統通過(guò) MMU 將這些虛擬地址映射到實(shí)際的物理內存。


C 語(yǔ)言示例如下:


#include <stdio.h>#include <stdlib.h> int main() {    int *ptr = (int *)malloc(sizeof(int));    if (ptr == NULL) {        fprintf(stderr, "內存分配失??!n");        return 1;    }     *ptr = 123;    printf("虛擬地址: %p, 值: %dn", (void*)ptr, *ptr);     free(ptr);    return 0;}


在這個(gè)例子中,malloc 函數返回的指針 ptr 是一個(gè)虛擬地址。操作系統會(huì )通過(guò) MMU 將其映射到物理內存。應用程序無(wú)需了解這個(gè)過(guò)程,操作系統自動(dòng)管理虛擬地址和物理地址之間的映射關(guān)系。


  • MCU 通常使用物理地址進(jìn)行內存訪(fǎng)問(wèn),因其設計簡(jiǎn)單且資源受限,不具備復雜的內存管理單元 (MMU)。

  • SoC,特別是那些運行復雜操作系統的 SoC,如 ARM Cortex-A 系列,通常使用虛擬地址進(jìn)行內存管理,依賴(lài) MMU 將虛擬地址映射到物理地址。


理解這兩者的差異對于開(kāi)發(fā)嵌入式系統的程序時(shí)至關(guān)重要,因為內存管理的復雜性和方式直接影響到程序的設計和調試方式。

*博客內容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀(guān)點(diǎn),如有侵權請聯(lián)系工作人員刪除。



關(guān)鍵詞: MCU SoC

相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>