
在嵌入式系统中,微控制器 (MCU) 和系统级芯片 (SoC) 的内存管理方式可能有所不同,具体取决于它们的设计和应用场景。
大多数微控制器 (MCU) 使用物理地址进行内存访问。MCU 通常是设计为简单、资源有限的嵌入式设备,目标是低功耗、低成本以及实时操作。这些设备一般没有复杂的内存管理单元 (MMU) 来处理虚拟地址到物理地址的映射。因此,程序代码和数据是直接通过物理地址访问的。
以常见的 STM32 系列微控制器为例:
在编程时,当开发者使用指针或访问某个变量时,实际操作的是物理地址。例如:
#define LED_PIN (*(volatile uint32_t*)0x48000814) // 指定 GPIO 端口的物理地址
int main(void) {
LED_PIN = 0x01; // 设置引脚电平为高
while (1);
}在这个例子中,0x48000814 是直接引用的物理地址,用于控制 MCU 上的 GPIO 引脚。
与 MCU 不同,系统级芯片 (SoC) 通常集成了更复杂的处理器内核(例如 ARM Cortex-A 系列),并且可能运行如 Linux 这样的操作系统。这些 SoC 通常具有内存管理单元 (MMU),能够将虚拟地址映射到物理地址。因此,虚拟地址是应用程序通常使用的地址空间。
以 Raspberry Pi 这类基于 ARM Cortex-A 系列处理器的 SoC 为例:
C 语言示例如下:
#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, 值: %d\n", (void*)ptr, *ptr);
free(ptr);
return 0;
}在这个例子中,malloc 函数返回的指针 ptr 是一个虚拟地址。操作系统会通过 MMU 将其映射到物理内存。应用程序无需了解这个过程,操作系统自动管理虚拟地址和物理地址之间的映射关系。
理解这两者的差异对于开发嵌入式系统的程序时至关重要,因为内存管理的复杂性和方式直接影响到程序的设计和调试方式。
作者:不脱发的程序猿。原文:https://handsome-man.blog.csdn.net/article/details/141789860 。原文日期:2025-01-01。转载遵循 CC BY-SA 4.0,保留署名与来源。
本文系转载,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。