端口映射,内存映射

时间:2015-05-27 05:08:26

标签: assembly embedded microcontroller firmware

任何人都可以清楚地解释我,映射是什么? 端口映射? 内存映射? 在固件开发中。

我经历了很多其他网站,但问题还不清楚。

在接受固件开发人员的采访时被问及。

实际问题是"如何使用C访问控制器的寄存器/存储器中的数据?" (他给出了线索​​你知道内存映射I / O,端口映射I / O吗?就像那样。

我明白这个问题可能是这样的,

如果SPI / I2C / ADC中有数据,如微控制器的内存缓冲区,您如何访问该数据? Graphene Semiconductors提出的问题。

谢谢

3 个答案:

答案 0 :(得分:3)

内存映射I / O允许写入/读取I / O设备与读取/写入普通内存(使用相同的机器代码/ asm)相同。 耗尽物理内存地址空间用于内存映射的I / O设备。

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

这是访问I / O的一种巧妙方式,但它占用了内存空间。

端口映射I / O允许使用特殊的asm指令(x86汇编中的inout)写入/读取I / O设备。你不会占用内存地址空间。

答案 1 :(得分:1)

端口映射和内存映射完全不同。 端口映射是指定要使用的端口。例如,您要用于串行通信的端口,UART1或UART2或USB?

内存映射IO共享IO的相同内存地址空间(相同的空间但唯一的地址)。但是,内存隔离IO具有分离的内存和存储空间。 IO

* gpio_for_led = 1; // mem映射io

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

outportb(gpio_for_led,1);

这会让你清楚吗?

答案 2 :(得分:0)

对于端口映射IO,您需要一个额外的接口驱动程序。这将完全定义如何寻址外部设备。它可以像GPIO一样简单,只需用闪光灯或SPI驱动外部寄存器即可。所有这些大部分都是软件定义的或由界面给出。但是,它与CPU地址和数据总线无关。

内存映射IO就像寄存器是普通地址空间中的变量一样。但是,您需要确保编译器既不优化访问,也不重新排序(对同一个变量或其他类似的寄存器)。由于硬件修复了这种寄存器的地址,可以通过链接器(-script)或如下设置(对于地址0x1234的16位读/写寄存器):

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