He visto que, en el microcontrolador de 32 bits, cada dirección de memoria contiene solo 8 bits de datos; es lo mismo para un MC de 16 bits también. Para datos de 32 bits, utiliza una combinación de 4 direcciones. ¿Por qué no se puede hacer que una dirección contenga datos de 32 bits directamente (es decir, 32 bits o 16 cada uno en lugar de 8)?
microcontroller
flash-memories
Arun Joe Cheriyan
fuente
fuente
Respuestas:
Esta es efectivamente una opción de diseño, no hay una razón difícil por la que tenga que ser así. En los viejos tiempos, cuando los procesadores de productos básicos de alto volumen funcionaban con valores de 8 bits, el mapeo era más consistente 1: 1. Para mantener la coherencia a medida que los diseños evolucionaron hacia los procesadores modernos de 32 y 64 bits, tenía sentido mantener el mapeo más antiguo de direccionamiento de bytes a pesar de que aumentaron los buses de datos (con un cambio de costo de implementación cambiante). Algunas MCU de 32 bits aún pueden implementar buses de datos de solo 16 bits en alguna memoria, los procesadores de gama alta tendrán 256 bits o más y podrán cargar múltiples registros centrales en una sola transacción de memoria. Las interfaces anchas son buenas para operaciones de ráfaga o transmisión.
El pequeño tamaño de memoria direccionable es útil no solo en el caso de manejar valores de bytes en el código, sino también para trabajar con estructuras en la memoria como paquetes de ethernet donde los bytes específicos necesitan ser leídos o modificados. Con frecuencia, este tipo de operación necesita poder realizar operaciones pequeñas pero de manera muy eficiente.
También hay escenarios en los que es necesario operar con datos big-endian, little-endian o endian mixtos. Ahora a menudo hay soporte de hardware dedicado para esto, pero nuevamente, el direccionamiento de bytes de la memoria hará que este tipo de operación sea más eficiente en algunos escenarios.
Es bastante reciente que el número de bits de dirección en un registro ha sido un factor limitante para el espacio de direcciones, por lo que desperdiciar 2 bits para direccionar bytes en lugar de palabras de 32 bits no habría sido una gran preocupación hace 10-15 años (y ahora con punteros de 64 bits, es común implementar direcciones de bytes de 48 o 56 bits de ancho). La enseñanza introductoria de ciencias de la computación todavía está un poco estancada en la era de la unidad central recién publicada, y no siempre aborda los aspectos de evolución con mucha claridad. Se comenzó a utilizar mucha terminología (y definición) en el momento en que las arquitecturas de bajo costo y alto costo (en el sentido más general) comenzaron a complementarse con diseños de procesadores más limitados en recursos y más centrados en los productos básicos.
No he respondido específicamente para MCU, los límites arquitectónicos no son tan claros como podría suponerse. Incluso un diseño moderno de MCU desde cero tiene una buena posibilidad de integrarse junto con un procesador de servidor de muchos núcleos, o existir como un solo punto en un conjunto escalable de productos; De cualquier manera, un enfoque consistente para acceder a la memoria es beneficioso para el usuario final que necesita escribir o codificar el puerto.
Hice una pregunta sobre el SE de retrocomputación sobre los tamaños de registro para dar seguimiento a los aspectos históricos de esta pregunta.
fuente
int
ylong
), también x86, también ARM. Supongo que la mayoría de las CPU de 8 bits lo harían, ya que habría una demanda aún mayor que en un sistema con reglas más amplias. Oh, ¿Supercat dice que los primeros procesadores carecían de un ADC eficiente?Hay algunos DSP (por ejemplo, TI C54x) que no pueden abordar valores menores de 16 bits, y algunos DSP de audio usan 24 bits. Sin embargo, los valores de 8 bits se utilizan en casi todos los códigos de uso general, por lo que todas las CPU de uso general lo admiten.
Y el hecho de que la unidad más pequeña utilizada para las direcciones de memoria sea de 8 bits no significa que esta sea la unidad más grande que realmente se utiliza en el bus; la mayoría de las CPU usan su tamaño de palabra nativo (16/32 bits) o incluso un tamaño más grande para direccionar la memoria, y cuando usan accesos de bytes, extraen automáticamente el byte de la palabra más grande.
Por ejemplo, el bus PCI siempre utiliza transacciones de 32 bits, pero tiene señales de habilitación de bytes para el acceso que deben ser más pequeñas.
fuente
Un microcontrolador de 16 o 32 bits a menudo necesita manipular datos que solo tienen 8 bits de ancho (un byte). Por ejemplo, las cadenas de texto generalmente se almacenan con un solo carácter por byte. Al tener un esquema de direccionamiento de memoria que permite direccionar cada byte individual, el microcontrolador puede procesar eficientemente datos de 8 bits de ancho. Lo que esto significa es que los datos de 32 bits generalmente residen en direcciones que son múltiplos de 4 bytes, por ejemplo, 04, 08, 0C, etc. Pero si la memoria tiene 32 bits de ancho, entonces el microcontrolador puede leer 32 bits en un ciclo de lectura . Los micro a menudo tienen instrucciones de máquina que pueden operar con datos de diferente longitud, por lo que encontrará que una instrucción de datos de movimiento (MOV) puede tener 3 formas, MOV.B, MOV.W y MOV.L para mover 8, 16 y 32 bits de datos en una instrucción.
fuente
La respuesta básica es "porque es la longitud de un byte". Con un gran cuerpo de código establecido que hace esa suposición, romperlo causaría todo tipo de problemas.
En los primeros días, no había un cuerpo de código establecido. Los procesadores con frecuencia usarían toda clase de arquitecturas extrañas, como se muestra en otras respuestas. Sin embargo, cuando salieron los procesadores de 16 bits, había suficiente código asumiendo la disponibilidad de datos de 8 bits que no facilitarlo hubiera sido una verdadera barrera para la adopción.
Tener una palabra de 32 bits por dirección no da ninguna desventaja en la velocidad de la memoria. En un sistema de 32 bits, los 2 bits de dirección inferiores a menudo no van a la memoria. El procesador generalmente leerá toda la palabra de 32 bits y seleccionará (o enmascarará) el byte de 8 bits que necesita dentro de esa palabra. Mientras su espacio de direcciones pueda almacenar suficientes datos (limitados a 2 ^ 32 bytes con un sistema de 32 bits), no se preocupe. De hecho, en muchos procesadores de 16 bits / 32 bits se tarda más en procesar con valores de bytes que con valores de longitud de palabra nativa: leer una palabra de 32 bits y descartar parte de esa palabra claramente requerirá una operación adicional, en comparación con solo leer la palabra de 32 bits.
Por el contrario, si tiene un sistema en el que necesita usar la memoria de manera eficiente, debe poder acceder a bytes individuales. Si no puedes, te quedarás sin memoria. Con eso en mente, poder hacer referencia a bytes individuales es claramente necesario, por lo que tiene sentido tener su memoria fragmentada en bytes.
fuente
Esto es lo que se llama tener memoria direccionable por byte . Normalmente es algo bueno, a menos que se esté quedando sin espacio de direcciones (por ejemplo, 4 GB con punteros de 32 bits, en lugar de 16 GB con punteros de 32 bits donde cada dirección es una palabra separada de 32 bits).
fuente
Los DSP de 32 bits de Analog Devices Shark tienen 32 bits como la unidad más pequeña de memoria direccionable, por lo que sizeof (int) == sizeof (short) == sizeof (char) == 1 (Sí, tienen caracteres de 32 bits, perfectamente válidos por El estándar C).
Además, cosas como int_8, int_16 y demás no están definidas en, una desagradable sorpresa al portar código desde otras plataformas.
fuente
El tamaño de la unidad de memoria direccionable es esencialmente un compromiso entre la cantidad de memoria que puede abordar y la cantidad de memoria que perderá.
Memoria direccionable . Considere una CPU de 32 bits: si direcciona bytes, puede direccionar hasta 4 GB de memoria. Si aborda bits individuales, esa cantidad se reducirá a 512 MB, y si aborda palabras de 32 bits tendrá 16 GB. (su pregunta parece sugerir lo último).
Memoria desperdiciada . Si tiene una variable que puede representarse con X bits, y solo puede asignar unidades de N bits para ella, perderá (N-1) / 2 bits en promedio, suponiendo X> N.Si aborda bits individuales , usará la memoria con un 100% de eficiencia (al menos desde el punto de vista del direccionamiento). Con bytes, desperdiciará 3.5 bits por variable (56% de eficiencia), y con palabras de 32 bits, desperdiciará 15.5 bits (52% de eficiencia). Pero empeora: si la mayoría de sus variables son pequeñas (piense en caracteres, booleanos, indicadores de estado), terminará desperdiciando la mayor parte de la memoria si sus unidades direccionables son demasiado grandes.
Por ejemplo, supongamos que el tamaño promedio de una variable es de 8 bits.
512*1024*1024*100%
= 0,54 mil millones de variables.4096*1024*1024*56%
= 2.4 mil millones de variables. ¡Eso es casi 5 veces más en comparación con una computadora direccionable! Por supuesto, necesitarás comprar 8 veces más memoria.fuente
Probablemente ya dijo varias formas en las otras respuestas. En general hoy, pero no necesariamente históricamente, un byte es de 8 bits. La mayoría de las veces tratamos con "memoria direccionable por byte", lo que significa que lo más PEQUEÑO al que podemos acceder con una sola dirección es un byte. Pero eso no significa que sea lo ÚNICO que podamos abordar. Dependiendo de la plataforma, se puede usar una sola dirección para acceder a un byte, una media palabra / palabra (16 bits), una palabra / palabra doble (32 bits) y así sucesivamente 64 bits. La instrucción básicamente determina cuál es el tamaño del acceso deseado (8,16,32,64, etc.) generalmente en las unidades 8, 16, 32, 64. Pero eso no es difícil y rápido, "depende".
Además, según el diseño del procesador y / o sistema, no hay razón para suponer que el tamaño del acceso es el tamaño de la memoria o el tamaño del acceso más pequeño. Con requisitos cada vez mayores, cada vez tiene menos sentido implementar el sistema de memoria usando el tamaño más pequeño, la computadora en la que está leyendo esto probablemente use un bus de datos de 32 bits de ancho o un bus de datos de 64 bits de ancho para todos los accesos, usted desea leer un byte, hace una lectura de 64 bits y arroja el resto de los bits, por qué no cuesta nada adicional, mantenga el bus tan ancho hasta cerca del núcleo del procesador y el procesador selecciona el carril de bytes correcto. cuesta más lógica y / o relojes para hacer que el bus sea más estrecho o mover los bytes en los carriles de bytes (a veces se hace). así que los carneros internos en un microcontrolador pueden tener 32 bits de ancho, por ejemplo, si eso tiene sentido para el sistema. podría ser 16. Sí, para las escrituras que quemas más ciclos, tienes que leer, modificar y escribir en algún lugar a lo largo de la línea. Desea escribir un solo byte en su PC, en algún lugar ocurre una lectura de 64 bits, y luego se modifica un byte de esos 64 bits, dependiendo de lo que haga después de eso, esos 64 bits pueden volver a salir con solo esos 8 bits diferente de lo que había antes, el almacenamiento en caché y su código hacen que esta no sea una regla genérica. Sin embargo, las escrituras se disparan y se olvidan, el controlador de memoria puede recopilar la dirección y los datos del procesador y permitir que el procesador siga ejecutándose mientras eventualmente realiza los relojes de guardado de escritura, tal vez más relojes que se queman en una lectura-modificación-escritura (si en caché ya),
Incluso hoy en día existen excepciones a casi todo esto, tal vez hay instrucciones o tipos de acceso en algunos sistemas que son poco direccionables, hay algunos sistemas donde la dirección está en unidades de algo distinto de un byte. Un byte no siempre era de 8 bits y tal vez todavía hay sistemas funcionando que es cierto (solíamos usar octal y un byte de 9 bits, una palabra de 18 o 36 bits tiene mucho sentido para los programadores humanos y diseñadores de chips que piensan que octal, un 8 bit tiene mucho sentido para los pensadores hexadecimales).
Ahora, la computadora en la que está leyendo esto, a pesar de que el bus de datos para ese controlador dram puede tener 32 o 64 bits de ancho, el módulo dram en sí está compuesto de múltiples partes de 8 bits de ancho, que puede ver fácilmente. Si tiene 8 o 9 chips en un lado, probablemente sea un bus ancho de 64 o 72 bits (64 bits más 8 bits de ECC) implementado con partes de 8 bits de ancho. Si tiene 4 o 5 chips en un lado del módulo pero todavía tiene toneladas de pines, entonces tiene 32 bits de ancho (poco probable en estos días) o 4 de los chips tienen 16 bits de ancho y si hay un quinto puede tiene 16 bits de ancho y solo se utilizan 8 o es una parte de 8 bits de ancho. También hay partes de 32 bits de ancho, pero 8 bits de ancho es lo más común. Una práctica muy común que se remonta.
Necesitaríamos saber qué microcontrolador. Como menciona 32 bits, es muy probable (sin información detallada, aunque no podemos decir) que la memoria dentro de esa parte tiene 32 bits de ancho, y todos los accesos a ella tienen 32 bits de ancho. las instrucciones probablemente determinarían lo que el programa quiere, que probablemente ofrece un tipo de acceso de 8 bits, 16 bits y 32 bits, las más pequeñas en las escrituras requerirían una lectura-modificación-escritura en alguna parte, lee simplemente ignorando los carriles de bytes. Lo mismo ocurre con el flash, aunque las escrituras flash son otro tema. Pero el flash interno es más probable que tenga 32 bits de ancho y todas las lecturas están en unidades de 32 bits. Sin embargo, un flash externo, esa es otra historia, lo más probable es que tengan un bit de ancho (spi o i2c), aunque las partes spi a veces pueden admitir 1, 2 o 4 bits, pero un pin de miso es más común. Internamente están organizados en unidades de bytes, podría tener 8 bits de ancho o 16 o 32, o quién sabe, sin embargo, se desplaza y se dirige a ellas en unidades de bytes. con spi puede cambiar entre un byte y toda la memoria en una sola transacción, depende del diseño de la parte flash.
fuente
¡También puedes obtener procesadores de 1 bit!
El ancho de los datos seguirá el ancho del registro (acumulador). normalmente es el "ancho del procesador", mientras que los buses de direcciones pueden ser diferentes (generalmente más anchos), pero técnicamente podrían ser más estrechos dependiendo del uso.
8, por supuesto, es una potencia de dos números. Tenemos que agradecer la historia por el uso ubicuo de 8 bits y el costo / capacidad de la tecnología. Durante mucho tiempo se descartaron 8 bits, en parte porque el ancho de los buses y la dificultad de crear registros (y RAM) de más de 8 bits de ancho (no hay punto en datos de 16 bits si sus registros son todos de 8 bits). 8 bits es bastante ingenioso y tiene mucho sentido en Hex. 8 bits pueden contener su alfabeto, números, caracteres de dibujo y control (ASCII), o 0 a 255 o + -127 Acceder a más de 256 bytes de datos (bus de direcciones de 8 bits) es fácil con paginación, seleccione la página, luego el byte, por ejemplo 256 páginas de 256 te llevan a 64K (65536). Por lo general, la página cero sería un bloc de notas, ya que sería más rápido acceder ya que esto no requeriría que se configurara la página. ¡Mi primera computadora tenía 1k x 8bits de RAM estática! (RAM dinámica era más barata, pero necesitaba más hardware para actualizarlo). Con algunas banderas (c, nc, z, nz), sumar, restar, rotar a izquierda y derecha, puede hacer algunas matemáticas bastante complejas en una máquina de 8 bits. ¡No necesita una unidad aritmética de coma flotante! ¡No súper rápido, pero factible! Muchos de los primeros procesadores podían ser de un solo paso y usarse con RAM estática simple, lo que facilitaba la depuración; agregando algunos búferes octales y primeros LED rojos, podría ver cómo cambian la dirección y los buses de datos :)
fuente