任何人都可以清楚地解释我,映射是什么? 端口映射? 内存映射? 在固件开发中。
我经历了很多其他网站,但问题还不清楚。
在接受固件开发人员的采访时被问及。
实际问题是"如何使用C访问控制器的寄存器/存储器中的数据?" (他给出了线索你知道内存映射I / O,端口映射I / O吗?就像那样。
我明白这个问题可能是这样的,
如果SPI / I2C / ADC中有数据,如微控制器的内存缓冲区,您如何访问该数据? Graphene Semiconductors提出的问题。
谢谢
答案 0 :(得分:3)
内存映射I / O允许写入/读取I / O设备与读取/写入普通内存(使用相同的机器代码/ asm)相同。 耗尽物理内存地址空间用于内存映射的I / O设备。
通常在CPU和RAM之间存在一些地址解码逻辑,因此当您点击属于I / O设备的存储器位置时,地址解码逻辑会启动并将CPU地址线连接到该I / O设备(而不是RAM)。
这是访问I / O的一种巧妙方式,但它占用了内存空间。
端口映射I / O允许使用特殊的asm指令(x86汇编中的in
和out
)写入/读取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)