端口映射、内存映射

PORT Mapping, Memory Mapping

谁能给我解释清楚,什么是映射? 端口映射? 内存映射? 固件开发中。

我浏览了很多其他网站,问题仍然不清楚。

在固件开发人员的面试中被问到。

实际问题是 "How does you access data holding in the register/memory of a controller using C?"(他给出了线索​​,你知道内存映射 I/O、端口映射 I/O 吗?像那样。

我理解问题可能是这样的,

如果 SPI/I2C/ADC 微控制器的此类内存缓冲区中有数据,您如何访问该数据? 石墨烯半导体提出的问题

谢谢

内存映射 I/O 允许 writing/reading 到 I/O 设备与 reading/writing 到普通内存相同(使用同一台机器 code/asm)。 您用完了内存映射 I/O 设备的物理内存地址 space。

通常 CPU 和 RAM 之间存在一些地址解码逻辑,因此当您访问属于 I/O 设备的内存位置时,地址解码逻辑将启动并连接 CPU 地址线到 I/O 设备(而不是 RAM)。

这是一种访问 I/O 的巧妙方法,但它会消耗内存 space。

端口映射 I/O 允许 writing/reading 到 I/O 设备使用特殊的 asm 指令(x86 汇编中的 inout)。你不消耗内存地址 space.

对于端口映射 IO,您需要一个额外的接口驱动程序。这将完全定义如何寻址外部设备。它可以像 GPIO 一样简单,只需驱动带有选通脉冲或 SPI 的外部寄存器。所有这些主要是软件定义的或由界面提供的。但是,它与CPU地址和数据总线无关。

内存映射IO就好像寄存器是普通地址中的一个变量space。但是,您需要确保编译器既不会优化访问,也不会重新排序它们(对同一变量或其他此类寄存器)。由于此类寄存器的地址由硬件固定,因此可以通过链接器(-脚本)或如下设置(对于地址为 0x1234 的 16 位 read/write 寄存器):

#define REGX (*(volatile uint16_t *)0x1234)

端口映射和内存映射完全不同。 端口映射就是指定使用哪个端口。例如,您要使用哪个端口进行串行通信,UART1 还是 UART2 还是 USB?

内存映射 IO 为 IO 共享相同的内存地址 space(相同 space 但地址唯一)。但是,内存隔离 IO 已将内存和 IO 分开 space。

*gpio_for_led = 1; // 内存映射 io

gpio_for_led = 0x1234; //隔离io(汇编代码有in,out指令)

outportb(gpio_for_led, 1);

看清楚了吗?