En la arquitectura ARM, los registros de un periférico se asignan a la RAM para que podamos acceder al registro utilizando la RAM.
En la arquitectura ARM, los registros de un periférico se asignan a la RAM para que podamos acceder al registro utilizando la RAM.
En primer lugar, para ser precisos, en algunos microcontroladores, los registros periféricos pueden asignarse al mismo espacio de direcciones que la RAM, y por lo tanto aparecer como si estuvieran en la RAM. Pero no son físicamente parte de la memoria RAM. Esto se denomina E / S mapeada en memoria y fue utilizada por primera vez por Motorola en la década de 1970 en microprocesadores como el 6800, 6809 y 68000.
Por lo tanto, puede haber un bloque de 16K de direcciones de memoria en un microcontrolador que comienza en 0x0000, y el primer 1K está reservado para E / S. Las direcciones de E / S se ejecutarían de 0x0000 a 0x03FF y la memoria RAM de 0x0800 a 0x4000.
Si la RAM era externa al chip, entonces en este ejemplo realmente había 16K de RAM, el primer 1K de RAM se "perdería" ya que no se pudo solucionar.
Entonces, la desventaja de la E / S asignada en memoria es que "come" en el espacio de direcciones del procesador. Para los pequeños microcontroladores que tienen solo un par de KB de espacio de direcciones RAM, esto puede convertirse en un problema real.
En los microcontroladores que usan direccionamiento de puertos, todavía hay registros periféricos, pero se puede acceder a ellos mediante instrucciones IN (lectura) o OUT (escritura). Cada registro de E / S tendrá una dirección de puerto, al igual que la dirección de memoria utilizada en las E / S asignadas en memoria. Pero estas direcciones están separadas de las direcciones utilizadas para RAM. Puede tener una dirección de memoria 0x55 y una dirección de puerto 0x55 y no interfieren entre sí.
Intel introdujo el direccionamiento de puertos en la década de 1970, con microprocesadores como el 8008, 8080, 8085 y 8086. (El 8051, por otro lado, utiliza E / S mapeadas en memoria).
Los 8080 y 8085, por ejemplo, solo podían dirigirse a 256 puertos (0x0000 a 0x00FF); el byte superior de la dirección de 16 bits fue ignorado. El 8086 utilizó un verdadero direccionamiento de puerto de 16 bits y podría, en teoría, direccionar 65536 direcciones de puerto.
La desventaja del direccionamiento de puertos utilizando las instrucciones IN y OUT, es que solo funcionaron con los registros AL o AX, y luego solo para cargar o almacenar desde el registro. por ejemplo, puede leer un valor de 8 bits de un puerto a AL, o un valor de 16 bits a AX utilizando la instrucción IN. Pero no se pudieron realizar operaciones aritméticas ni lógicas, ya que el valor se leyó desde el puerto como se puede hacer con las E / S asignadas en memoria.
Los procesadores que utilizan direccionamiento de puertos también pueden tener direccionamiento de E / S asignados en memoria, siempre que la RAM y los periféricos de E / S sean externos al chip del microprocesador.
Con la arquitectura X86, los registros de periféricos se pueden asignar a direcciones RAM o a direcciones de puertos de E / S.
Las instrucciones de ENTRADA y SALIDA pueden dirigirse a muchos puertos de E / S: 256 en el 8085, si recuerdo correctamente, probablemente más en el X86.
Lea otras preguntas en las etiquetas microcontroller arm embedded linux x86