最近做FreeRTos,以及前面設計的RVOS,這種RTOS級別的系統內存上的分布與CortexA系列里面的分布有相當大的區別,給我搞糊涂了。
目錄
-
STM32(Cortex-M系列)的內存與存儲機制
- Flash存儲內容
- RAM存儲內容
- 啟動與運行時流程
- 示例代碼解析
-
i.MX6ULL(Cortex-A系列)的內存與存儲機制
- 物理內存布局
- 程序存儲與加載流程
- 多級啟動過程
- 裸機程序處理
-
STM32與i.MX6ULL的關鍵差異對比
- 架構設計差異
- 存儲與啟動流程對比
- 內存管理機制
-
總結與適用場景
1. STM32(Cortex-M系列)的內存與存儲機制
Flash存儲內容
- 程序代碼:所有編譯后的機器指令。
- 常量數據:
const
修飾的全局變量、字符串常量。 - 初始化數據:全局/靜態變量的初始值(運行時復制到RAM)。
RAM存儲內容
- 堆棧(Stack):局部變量、函數調用上下文。
- 堆(Heap):動態分配的內存(
malloc
/new
)。 - 全局/靜態變量:運行時實際存儲位置(含
.data
和.bss
段)。
啟動與運行時流程
-
上電啟動:
- CPU從Flash固定地址(
0x08000000
)讀取復位向量,執行啟動代碼(Reset_Handler
)。 - 啟動代碼將
.data
段(初始化數據)從Flash復制到RAM,并清零.bss
段。
- CPU從Flash固定地址(
-
指令執行:
- CPU通過指令總線直接從Flash讀取指令。
- 通過ART加速器或預取隊列優化訪問延遲。
示例代碼
const int FLASH_CONST = 100; // 存儲在Flash
int ram_var = 42; // 初始值在Flash,運行時在RAMvoid main() {int stack_var; // 棧中分配(RAM)static int static_var; // .bss段(RAM)
}
2. i.MX6ULL(Cortex-A系列)的內存與存儲機制
物理內存布局(以1GB DDR為例)
地址范圍 | 用途 |
---|---|
0x80000000 ~ ... | Linux內核空間 |
0x90000000 ~ ... | 用戶空間(應用程序、堆棧) |
保留區域 | GPU/VPU內存、DMA緩沖區 |
程序存儲與加載流程
- 存儲介質:eMMC、SD卡、NAND Flash等。
- 多級啟動過程:
- Boot ROM:固化在芯片內部,加載第一級引導程序(如U-Boot)到片內OCRAM。
- Bootloader(U-Boot):
- 初始化硬件(DDR、外設)。
- 從存儲設備加載內核鏡像(
zImage
)、設備樹(.dtb
)、根文件系統到DDR。
- Linux內核:解壓并初始化MMU、進程管理等,掛載根文件系統。
- 用戶程序:從文件系統加載到DDR用戶空間執行。
裸機程序處理
- 鏈接腳本示例:
MEMORY {RAM (rwx) : ORIGIN = 0x80000000, LENGTH = 512M } SECTIONS {.text : { *(.text) } > RAM /* 代碼段 */.data : { *(.data) } > RAM /* 初始化數據 */.bss : { *(.bss) } > RAM /* 未初始化數據 */ }
3. STM32與i.MX6ULL的關鍵差異對比
特性 | STM32(Cortex-M) | i.MX6ULL(Cortex-A) |
---|---|---|
核心定位 | 實時控制(微控制器) | 復雜應用(應用處理器) |
指令執行位置 | 直接在Flash中執行 | 必須加載到RAM執行 |
內存管理 | 無MMU,直接訪問物理地址 | 支持MMU和虛擬內存 |
啟動流程 | 單階段啟動(Flash → 運行) | 多階段啟動(Boot ROM → U-Boot → Kernel) |
典型存儲介質 | 片內Flash | eMMC、SD卡、NAND Flash |
典型應用場景 | 實時控制、傳感器處理 | 嵌入式Linux、GUI應用、多媒體處理 |
4. 總結與適用場景
STM32的適用場景
- 實時性要求高(如電機控制、工業自動化)。
- 資源受限(小內存、低功耗)。
- 無需復雜操作系統支持。
i.MX6ULL的適用場景
- 需要運行Linux/Android等操作系統。
- 處理多媒體、網絡通信等復雜任務。
- 外設接口豐富(如GPU、攝像頭接口)。
設計哲學差異
- STM32:簡單直接,強調實時性和確定性。
- i.MX6ULL:通過多級抽象(MMU、虛擬內存)支持復雜應用,犧牲部分實時性換取靈活性。
相關技術點擴展:
- STM32啟動文件(startup.s)詳解
- i.MX6ULL U-Boot移植實戰
- ARM Cortex-M與Cortex-A架構對比
關注作者,獲取更多嵌入式開發干貨!
版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。