E/S asignada en memoria frente a E/S asignada en puerto en microcontroladores

He estado leyendo sobre el mapeo de periféricos externos a microcontroladores.

Entiendo que IO mapeado en memoria significa que el mismo espacio de direcciones en el microcontrolador se puede usar para la memoria interna y también para mapear periféricos externos. Por lo tanto, las mismas instrucciones que usamos normalmente pueden usarse para comunicarse con dispositivos externos.

La E/S mapeada en puertos significa que hay un determinado espacio de direcciones que se usa especialmente para mapear periféricos externos. A veces, es necesario utilizar instrucciones específicas para acceder a los periféricos a través de este espacio de direcciones.

Obviamente, aquí podemos ver las ventajas de la E/S mapeada en memoria. Sin embargo, leí en el siguiente enlace que

"La desventaja del método de E/S mapeado en memoria es que todo el bus de direcciones debe decodificarse por completo para cada dispositivo. Por ejemplo, una máquina con un bus de direcciones de 32 bits requeriría puertas lógicas para resolver el estado de las 32 líneas de direcciones correctamente. decodificar la dirección específica de cualquier dispositivo. Esto aumenta el costo de agregar hardware a la máquina".

¿Puede alguien explicar esto porque no puedo entender esto? ¿Por qué el microcontrolador necesita decodificar el bus de direcciones de 32 bits de esta manera?

https://www.bogotobogo.com/Embedded/memory_mapped_io_vs_port_mapped_isolated_io.php

¿Estás familiarizado con lo que es la decodificación de direcciones?
Bueno, no tiene que decodificar todo el bus, pero luego termina con un espacio de direcciones no disponible (un periférico en particular puede tener más de una dirección).

Respuestas (2)

La declaración tal como está es falsa o al menos incompleta.

Normalmente, una instrucción de E/S activa algunos pines especiales en el controlador para distinguir la operación de E/S de una operación de memoria.

La declaración anterior parece suponer que la instrucción de E/S usa solo una parte del bus de direcciones de 32 bits y, por lo tanto, se necesita menos decodificación de direcciones. Sin mencionar esto, la declaración es, en sí misma, falsa.

Tenga en cuenta que, especialmente en los primeros días de los microcontroladores, secciones enteras del mapa de direcciones se asignarían a unos pocos periféricos mediante el uso de unas pocas líneas de dirección para seleccionar todos los periféricos. por ejemplo, las líneas de dirección 15 y 14 seleccionarían uno de los tres periféricos dejando 16K como espacio de direcciones.

Esta técnica todavía es muy utilizada.
Actualmente, un procesador de 32 bits tiene un espacio de direcciones de 2G, pero muchos microcontroladores tienen menos de 1 M de memoria (en Flash y RAM), lo que requiere solo 20 líneas de dirección. Esto deja muchas líneas de dirección libres para este tipo de decodificación escasa.

No creo que sus declaraciones sobre la "descodificación escasa" sean aplicables más. Por ejemplo, los procesadores Cortex-M con los que trabajo tienen miles de registros de dispositivos de E/S y acceder a ellos requiere que, de alguna manera, se decodifiquen los 32 bits de la dirección.
@ElliotAlderson Esos son dispositivos en chip y, por lo tanto, decodificación en chip. Estaba hablando de las prácticas de decodificación fuera del chip. La lógica de decodificación en chip para 32 bits es solo una pequeña fracción de las puertas necesarias para implementar, por ejemplo, el protocolo AXI. Habiendo construido SOC con buses ARM AXI, mi estimación es que la lógica de decodificación es menos del 0.1% del bus AXI, que a menudo es menos del 1% de las puertas de chip.

¿Por qué el microcontrolador necesita decodificar el bus de direcciones de 32 bits de esta manera?

Con la E/S mapeada en memoria, la dirección debe decodificarse lo suficiente como para separar las áreas de E/S y de memoria. Cuantas menos líneas de dirección se utilicen para seleccionar cada bloque, más grande será el bloque y más espacio podría desperdiciarse. En una MCU de 32 bits, simplemente podría decodificar A31, por ejemplo. ponga memoria en los primeros 2GB y E/S en los segundos 2GB. Con 2 GB de espacio de memoria todavía disponible, probablemente no sea un problema, pero en una MCU con 16 bits de dirección o menos, reduciría severamente el espacio de memoria disponible.

Con un espacio de E/S separado, las instrucciones de E/S hacen que se active una línea de habilitación diferente, por lo que los dispositivos de memoria no responden incluso si están en la misma dirección. Ahora los dispositivos de E/S pueden usar un subconjunto de las líneas de dirección e ignorar las demás, y las instrucciones de E/S no necesitan especificar una dirección de ancho completo.

Históricamente, la mayoría de las primeras MCU se diseñaron en torno a una CPU existente con periféricos integrados, con una ROM interna pequeña (o sin ella) y la capacidad de usar memoria externa. Los basados ​​en Intel 8080, etc. tenían un espacio de E/S separado, mientras que los basados ​​en Motorola 6800 tenían E/S mapeada en memoria. Estas primeras MCU tenían pocos transistores y poco espacio de memoria, por lo que los ahorros de tener un espacio de E/S separado podrían ser significativos. Significaba que el espacio de memoria máximo estaba disponible sin 'agujeros', y los dispositivos de E/S necesitaban menos lógica de decodificación.