Assembly 端口映射,内存映射

Assembly 端口映射,内存映射,assembly,embedded,microcontroller,firmware,Assembly,Embedded,Microcontroller,Firmware,谁能给我解释清楚,什么是映射? 端口映射? 内存映射? 在固件开发中 我浏览了许多其他网站,但问题仍然不清楚 在固件开发者的采访中被问到 实际的问题是“如何使用C访问控制器寄存器/内存中的数据?”(他给出了一些线索,你知道内存映射I/O、端口映射I/O吗?就像这样 我知道问题可能是这样的 如果微控制器的SPI/I2C/ADC内存缓冲区中存在数据,如何访问该数据? 石墨烯半导体提出的问题 谢谢内存映射I/O允许向I/O设备写入/读取,与向普通内存读取/写入相同(使用相同的机器代码/asm)。 内存

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

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

在固件开发者的采访中被问到

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

我知道问题可能是这样的

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


谢谢

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

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

这是一种很好的访问I/O的方法,但它会占用内存空间


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

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

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


端口映射和内存映射完全不同。 端口映射是指分配要使用的端口。例如,要用于串行通信的端口是UART1、UART2还是USB

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

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

gpio_for_led=0x1234;//隔离io(汇编代码有输入、输出指令)

输出端口B(gpio_用于_led,1)


这让你明白了吗?

你应该提供更多关于你在哪里遇到这个术语的上下文。映射只是指在某种表格或目录中查找一个值,以获得另一个值。你在谈论什么样的微控制器,以及你想用它实现什么?我是这个主题的学习者,有些时候在这个问题上我问了问。我一般都在问。你可以考虑ATMEGA128控制器。你问的实际问题是什么?实际问题是“你如何使用C访问登记/内存中的数据持有?”(他给出了线索,你知道内存映射I/O,端口映射I/O吗?像这样。石墨烯半导体公司提出的问题。谢谢你的回答,你能简单地告诉我,我们如何使用C程序在微控制器上实现这一点吗?后者将是一个特殊的IO地址空间(某种程度上是哈佛体系结构对另一个特殊地址空间的扩展),而不是端口映射IO。端口映射IO类似于使用GPIO访问DAC,模拟总线(使用软件定义的地址空间),或通过SPI/i2C或QSPI闪存,该闪存未完全集成在正常地址空间中,并且需要接口的中间驱动程序。@G_G“实现什么?”如何使用C映射内存?@Lokesh:您不“映射内存”在C语言中,内存映射是你在电线中定义的东西。你设计了地址解码逻辑,让CPU访问RAM和I/O设备。在C语言中,你只访问内存位置,如果你访问了属于I/O设备的一些内存空间,你就会读/写该I/O设备,而不是RAM。我不确定你使用的
为内存映射的I/O设备设置物理内存地址空间。
。也许我错了,但我认为可能会将某些地址空间间隔映射到I/O设备,而该地址空间甚至可能不是物理内存,例如,MCU通过将10kB-20kB间隔的地址映射到其外围设备而拥有10kB的物理内存空间。我错了吗?我错了洛克什沃达:所以你投了反对票?我显然回答了这个问题(你当时为什么接受这个问题)
#define REGX (*(volatile uint16_t *)0x1234)