Si un procesador de 32 bits puede manejar aproximadamente 4 GiB de RAM (es decir, ) bytes, ¿por qué mi Arduino Mega 2560 tiene 8 KiB de SRAM, si ser un procesador de 8 bits le permite manejar solo 256? bytes ( )? ¿O estoy leyendo mal la siguiente página?
arduino
microcontroller
microprocessor
sdram
ZaqueoAlejandro
fuente
fuente
Respuestas:
La mayoría de las CPU de 8 bits tienen buses de direcciones de 16 bits que les permiten direccionar 64kbytes, precisamente porque 256 bytes realmente no es suficiente para hacer mucho. Simplemente significa que necesitan cargar dos bytes en lugar de uno, cada vez que necesitan cargar una dirección. Ligeramente más lento pero tolerable teniendo en cuenta su tamaño.
(Y sí, hay muchas excepciones, desarrolladas principalmente cuando 64k se volvió demasiado pequeño, pero estamos hablando de la idea básica aquí).
fuente
El bus de direcciones y el bus de datos están separados, por lo que pueden tener diferentes tamaños. Para cualquier tamaño de bus de dirección específico, existen muchas técnicas para direccionar más memoria que el ancho de bit de registro
La forma más común es aumentar el ancho del bus de direcciones de alguna manera
usando múltiples registros para la dirección
X
,Y
yZ
datos de direccionamiento registros para permitir el máximo de 64 KB de RAM. Los que a su vez se puede combinar conRAMPX
,RAMPY
,RAMPZ
para acceder a las direcciones de memoria RAM más altos en las versiones aún más grandes. También tieneSPH
para los bytes altos del puntero de la pila, además de lasSPL
variantes con más de 256 bytes de RAM 1H
&L
,B
&C
,D
yE
que se pueden usar juntos como un registro de dirección de 16 bitsutilizando un único registro especial grande más grande que el tamaño natural para abordar
utilizando un registro especial para la parte alta de la dirección . Al direccionar alguna memoria, de manera predeterminada, los 8 bits bajos de la dirección se tomarán del registro inmediato de 8 bits o del registro de 8 bits en un microcontrolador de 8 bits, mientras que los bits altos se reemplazarán por el valor del otro registro de dirección.
call
ogoto
instrucción, 8 o 9 bits bajos de la dirección se indican por el inmediato y el resto se toma del contador del programa actual. Por lo tanto, acceder a cualquier cosa que no esté muy cerca del segmento actual usa solo 1 instrucción, mientras que otras direcciones necesitarán 2 instrucciones (para establecer los bits altos).PC
mientras salta incondicionalmente.Otra forma de lograr esto es la memoria bancaria . Este es un método útil que todavía se usa en algunas arquitecturas hoy en día. En este modelo, la memoria se divide en múltiples bancos . Cada vez solo puede dirigirse a un banco específico. A menudo hay un banco global o un rango de direcciones que siempre están visibles en cualquier momento, pero para otras partes debe cambiar de banco cuando sea necesario.
También hay una técnica no bastante común, pero se puede encontrar en el Intel 8051 . Como microcontrolador con dirección de datos de 8 bits, puede tener como máximo 256 direcciones. La mitad del espacio (la parte alta) se usa para registros de funciones especiales ( SFR ), lo que limita la RAM real direccionable a solo 128 bytes. Sin embargo, los fabricantes modernos de la serie 8051 encontraron una manera inteligente de superar esto separando el acceso a la memoria . El direccionamiento directo accederá al SFR mientras que el direccionamiento indirecto, aunque los registros accederán a la parte alta de RAM, lo que significa que ahora tiene 256 + 128 = 384 bytes direccionables.
1 https://en.wikipedia.org/wiki/Atmel_AVR_instruction_set#Memory_addressing_instructions
fuente
Casi todos los procesadores de 8 bits tienen cierta capacidad para formar una dirección de 16 bits a partir de una parte de orden inferior y una parte de orden superior. En algunos procesadores, incluido el 8080 original, hay registros dedicados a mantener la parte superior e inferior de una dirección (aunque desde el punto de vista del programador puede haber algunos registros como el puntero de pila del 8080 que no ofrecen instrucciones para abordarlos por separado). En algunos otros procesadores, no hay registros dedicados a la mitad superior o inferior de una dirección, sino que las direcciones se ensamblan "sobre la marcha". Por ejemplo, en el 6502, la instrucción "LDA $ 1234, X" carga el acumulador con la dirección formada al agregar $ 1234 al registro X de 8 bits [supongamos que contiene $ F0]. La ejecución de esa instrucción procedería en 4 o 5 pasos:
La transferencia del byte de lectura al acumulador se superpondrá a la obtención de la siguiente instrucción. Además, para muchas operaciones, si el paso 3 no generó un carry, el paso 4 habría leído la dirección correcta y la ejecución podría pasar directamente del paso 4 a la siguiente instrucción, sin pasar por el paso 5.
Si uno examina la secuencia de operaciones, notará que una arquitectura little-endian tiene una ventaja definitiva sobre una big-endian, en la mayoría de los casos (aunque no la que se muestra), aunque la ALU toma un ciclo para realizar Además, es posible leer un byte de la dirección calculada sin esperar el resultado de la ALU, ya que normalmente el byte alto que se obtuvo será el byte alto del operando de destino. En una máquina big-endian con una ALU de 8 bits, una carga indexada tomaría al menos 5 ciclos (ya que la mitad inferior de la dirección no se leería hasta el paso 3 y, por lo tanto, se calcularía en el paso 4).
fuente
Las líneas de datos (pines) y las líneas de direcciones (pines) están completamente separadas. En pocas palabras, las líneas de bus de datos determinan el número máximo de bits que se pueden transferir de a uno por vez (y se almacenan en la memoria), mientras que las líneas de dirección determinan el número máximo de "celdas" de memoria que se pueden seleccionar.
Era principalmente una cuestión de marketing que las CPU x86 de 32 bits no podían abordar más de 4 GB de RAM. Recuerdo en alguna parte que había pines A33-34 en las CPU Pentium 4.
fuente
A menudo es cierto que existe alguna relación entre el tamaño de memoria direccionable y el tamaño del registro interno, aunque la relación varía por diferentes razones. 256 bytes de espacio de direcciones se consideraban demasiado pequeños incluso en los primeros días de los microprocesadores, por lo que la mayoría de los procesadores de ocho bits producían direcciones de 16 bits (dos bytes), que se dirigían a 64 kilobytes. Sin embargo, con el cambio de banco (esencialmente usando ciertas líneas de E / S para producir aún más líneas de dirección), era posible tener mucho más.
En los primeros procesadores de 16 y 32 bits, no siempre había suficientes pines en el dispositivo para alcanzar todo el espacio que sus registros de direcciones internas podían abordar. Por ejemplo, en el Motorola 68000, solo había suficientes pines de dirección (24) para direccionar 16 megabytes de RAM, aunque los registros de direcciones internas tenían 32 bits de ancho.
fuente
Contestaré esta pregunta específicamente para los controladores AVR que mencionaste. El principio básico también es válido para muchas otras arquitecturas de 8 bits.
Los AVR son núcleos de 8 bits. Esto significa que tienen registros de 8 bits. Sin embargo, 8 bits no son suficientes para acceder a una cantidad de memoria utilizable. Por lo tanto, el núcleo AVR puede usar un conjunto específico de registros combinados como registros de puntero de 16 bits. Los registros r30 y r31 (también alias como ZL y ZH) son un ejemplo de esto. Juntos forman el Z Pointer.
En la asamblea, leer un byte en la dirección 0x1234 se vería así:
La familia AVR tiene 3 pares de registros que pueden usarse para esto. Están específicamente diseñados en hardware para permitir tales operaciones.
Al programar en un lenguaje de nivel superior como C, el compilador maneja estas cosas.
Nota: Algunos AVR incluso admiten tamaños de memoria mayores que 64k. Estos controladores tienen un registro de función especial en el que se escriben bits adicionales de la dirección antes del acceso. Por lo tanto, la dirección consta de los siguientes bits (MSB a LSB):
Registro de funciones especiales (generalmente 1 byte), ZH (8 bits), ZL (8 bits).
fuente
Los AVR de 8 bits de Atmel en realidad usan una dirección de datos de 16 bits. Tienen muchos otros registros de 16 bits e incluso algunos temporizadores de 16 bits. Como solo es un procesador de 8 bits, generalmente utiliza dos ciclos de reloj para cargar un registro de 16 bits.
fuente
Wikipedia lo explica bastante bien:
fuente
La noción de que el "ancho de bits" de un procesador establece la cantidad máxima de RAM que el procesador puede abordar es uno de los mitos más generalizados en la informática. De hecho, la historia de la industria está llena de CPU para las cuales esta relación no se mantuvo.
HP 21MX, HP 1000: CPU de 16 bits, memoria hasta 16 MB
PDP-11: CPU de 16 bits, memoria de 4 MB
VAX-11/780: CPU de 32 bits, memoria a 512 MB
etcétera etcétera.
fuente