Microprocesadores/Microcontroladores - ¿Los registros tienen direcciones?

Mi profesor de Sistemas Embebidos sigue refiriéndose a las ubicaciones de memoria de los registros como sus respectivas "direcciones". Estoy confundido por esto; Siempre tuve la impresión de que en cualquier microprocesador, los registros de la CPU no tienen direcciones ya que no residen en la memoria principal (residen en el propio microprocesador). También estoy confundido acerca de a qué nos referimos cuando decimos la "ubicación de memoria del registro"; nuevamente, no está en la memoria principal.

Dicho esto, ¿por qué nos referimos a las ubicaciones de los registros de la CPU por "direcciones"? ¿Todos/algunos registros tienen direcciones?

Pensé en esto y razoné que tal vez estén "conectados" a ciertas ubicaciones de la memoria principal, lo que permite el acceso a los valores almacenados en los registros. Para extender este pensamiento, ¿es esto lo que es el mapeo de memoria?

También debo agregar que estamos trabajando específicamente con el microcontrolador LPC1768 de NXP, que utiliza el microprocesador ARM Cortex-M3.

Respuestas (9)

Depende del procesador en particular si los "registros" están en el mismo espacio de direcciones que la memoria de datos normal o separados. En cualquier caso, si hay varios de ellos, cada uno todavía necesita una dirección.

Digamos que el procesador tiene 16 registros que están estrechamente acoplados a la CPU y se implementan por separado de la memoria de datos. Esos registros todavía tienen que ser identificados de alguna manera. En este caso, se necesitaría una dirección de 4 bits para distinguir registros individuales. En una arquitectura RISC, la dirección de 4 bits de cualquier registro en el que haya trabajado una instrucción se incluiría en el código de instrucción. Por ejemplo, la instrucción ADD puede agregar el valor de un registro de origen en un registro de destino. Esa instrucción incluiría 4 bits para identificar el registro de origen y otros 4 bits para identificar el registro de destino. La documentación puede hacer referencia a estos registros por "número" del 0 al 15, pero esa es realmente la dirección donde viven los registros en una pequeña memoria especial de la CPU.

Además de lo anterior, incluso cuando un procesador tiene registros dedicados especiales, esos registros pueden asignarse al espacio de direcciones de datos de propósito general. Las referencias a esas direcciones quedan atrapadas y se remiten a los registros internos.

Hay muchos esquemas por ahí, pero si tiene más de un registro, esos registros deben distinguirse entre sí de alguna manera, y dentro del hardware que estará con una "dirección", ya sea que se llame así en la documentación o no.

Ah, ahí está el problema. Siempre he asociado la memoria principal/RAM con direcciones de memoria, exclusivamente ; Nunca hubiera pensado en asociar las direcciones de memoria con otra cosa. ¡Gracias por aclarar eso!
Además, ahora tengo curiosidad; ¿Qué componente es el responsable de localizar y acceder a estas direcciones de registro?
Si son registros dedicados habrá hardware solo para seleccionar un registro. Dado que hay tan pocos registros, se puede usar más hardware para decodificar y actuar sobre los bits de dirección que podría usar en una memoria grande normal. Esto puede hacer que la decodificación sea más rápida, permitir múltiples puertos, etc. Por lo general, cualquier registro puede controlar cualquier entrada de ALU y puede guardar la salida de ALU. En alguna arquitectura (dsPIC es un ejemplo) tres registros separados pueden hacer estas cosas por separado en la misma instrucción.

La fuente de la confusión es que hay (en general) dos tipos de cosas que pueden llamarse "registros".

El primero es probablemente con el que está familiarizado: en ARM, son registros R0, R1, R2, ... R12, SP, LR, PCy en x86 es eax, ebx, ecx, edx, ebp, y así sucesivamente. Estos también pueden llamarse " registros de núcleo " o " registros de procesador ". No tienen direcciones en el espacio de la memoria del sistema y solo se puede acceder mediante instrucciones específicas.

El otro son los registros que pueden controlar varios bloques de hardware (periféricos), en la propia CPU o fuera de ella. En LPC1768 y muchos otros procesadores integrados, normalmente están asignados a la memoria y es por eso que tienen direcciones. Por ejemplo, el bloque UART0 está en la dirección 0x4000C000 y ahí es donde necesita leer o escribir para comunicarse con él. Para distinguirlos de los registros centrales, se les puede llamar " registros periféricos " o " registros de hardware ".

En algunos microcontroladores de 8 bits de gama baja como 8051 o PIC, es posible que no haya ningún registro central además de quizás un acumulador, y todos los demás registros se asignan a varias áreas de memoria como "RAM interna" (para almacenamiento/cálculo temporal) o Memoria de "Registros de funciones especiales" (SFR) para los registros de control y periféricos. En ellos, los "registros" casi siempre tienen una dirección.

Los ARM más grandes también tienen registros de coprocesador , que se pueden usar para controlar varias funciones centrales (por ejemplo, MMU o caché) con instrucciones como MRCo MCR. Estos registros son similares a los registros centrales en que no tienen una dirección de memoria sino solo un número.

Además, en x86 puede tener puertos de E/S , a los que se accede mediante instrucciones iny out, que se pueden usar para controlar algunos bloques de hardware. Estos son similares en función a los registros periféricos, pero por lo general no se les llama así.

¿Los registros del procesador son accesibles de alguna manera?
@ ProSteve037: por supuesto, de lo contrario no tendría sentido tenerlos :) Por lo general, la mayoría de las instrucciones funcionan con registros del procesador. Por ejemplo, en ARM: MOV, LDR, STR, ADD, SUB, etc.
@ ProSteve037 En cierto sentido, los registros del procesador tienen una especie de dirección, pero se usa en register fieldel código de operación (la palabra de instrucción del código de máquina) y no se puede confundir con las direcciones de memoria (sus posiciones en el formato del código de operación son distintas y los campos son de diferentes tamaños).

Tiene razón en que algunos registros no están ubicados dentro de la memoria principal, sino en el propio microprocesador, y que esos registros están asignados a la memoria en ciertas ubicaciones.

El microcontrolador LPC1768 tiene solo 64 kB de RAM (lo que creo que quiere decir con memoria principal), sin embargo, un bus de direcciones de 32 bits y 4 GB de espacio total de direcciones. El resto de este espacio de direcciones contiene la memoria flash que almacena su programa y los registros de todos los periféricos (por ejemplo, los estados de los pines de salida o el ADC).

Por lo general, cuando intenta acceder a una ubicación mapeada en la memoria, la lógica dentro del microcontrolador identificará dónde se encuentra físicamente la dirección de la memoria y operará las líneas de control para que los datos lleguen a donde estaban destinados, independientemente de si está en la RAM, un Puerto GPIO o un registro de control periférico.

Esto simplifica la escritura de software, ya que no necesita preocuparse demasiado por la ubicación física de los registros, y hace que la compilación de lenguajes de alto nivel (como C) sea mucho más fácil.

En el caso específico del LPC1768, mirando la hoja de datos ( http://www.nxp.com/documents/data_sheet/LPC1769_68_67_66_65_64_63.pdf ) podemos ver el mapa de direcciones en la página 20 (Figura 4), que muestra dónde están todos los los periféricos están asignados en la memoria.

Por supuesto, el procesador también contiene un puñado de registros internos que no están asignados a la memoria, a los que se puede acceder mucho más rápido que cualquier cosa en el espacio de direcciones, ya que la lógica de administración de la memoria es lenta en comparación con el núcleo y se utilizan como almacenamiento temporal. durante las operaciones. Parte del trabajo de un compilador es manejar el almacenamiento de datos en registros y moverlos de/a la memoria por usted.

Como han dicho otros, depende de la familia de microcontroladores. Y depende de lo que entiendas por registro.

El msp430, por ejemplo, tiene dos conjuntos de "registros". El primero es el archivo de registro RISC, con 16 registros de 16 bits. Estos incluyen los registros de contador de programa, puntero de pila, estado y generador constante, y 12 de uso general. Estos son registros en el uso de la palabra en la arquitectura tradicional.

Registrar archivo

El segundo conjunto de registros son todo lo demás. Puertos, periféricos, interrupciones, etc. Estos son parte del archivo de memoria única y comparten espacio con el uso general RAM y Flash (Code Space)

Mapa de memoria

Por ejemplo, el msp430g2231 tiene un registro de salida del puerto 1 en la dirección de memoria 0x21.

Detalles específicos

Puede acceder al registro con el nombre de registro p1out, pero eso es solo un puntero a la dirección de memoria de 8 bits 0x21. Lo más importante, así es como lo ve el compilador. El archivo de encabezado, en este caso msp430g2231.h, define "p1out" como 0x0021. Además del archivo de registro RISC, el uso común de Registro solo significa una dirección de memoria para una opción específica x. Lo que ve como Register p1out, es solo la forma en que un lenguaje superior le facilita la programación, en lugar de memorizar mapas de memoria.

Si usa un puntero a la dirección de memoria 0x27f, estaría leyendo desde la RAM. Puntero a la dirección de memoria 0xffdf, y en su lugar estaría leyendo su código compilado. Todo lo que es un registro es una dirección de memoria para una función especial.

Como término genérico, "registrarse" solo significa un lugar donde puede almacenar información ("registrarse"), nada más.

La mayoría de las arquitecturas reservan el término registro para las ubicaciones dentro de la CPU que se identifican mediante bits en una instrucción y que, a menudo, son accesibles mucho más rápido que la memoria masiva general ("RAM"). (Y a menudo se puede acceder a 2 o 3 registros en paralelo en un ciclo de ejecución).

Sin embargo, la documentación de Microchip PIC, por ejemplo, se refiere a todas las ubicaciones direccionables como registros, incluida la RAM. Cuando su profesor copie este uso del término, en mi opinión, debería informarle que esta no es la forma en que el término "registro" se usa comúnmente en la actualidad. (Como espero haberlo hecho en mis clases de ensamblador PIC).

No solo microchip: mire el 8051 para ver un ejemplo mucho más antiguo, e incluso eso puede tener predecesores.
@ChrisStratton: Estoy bastante seguro de que el PIC de General Instruments (en el que se basó el 16C54 de Microchip) es anterior al 8051, e incluso podría ser anterior a su predecesor, el 8048.
Sí, parece que precede al 8048 por alrededor de un año.

Los registros tienen direcciones, aunque generalmente no residen en la memoria.

Piénselo un minuto: una dirección denota una ubicación en algún espacio, donde la memoria es solo una instancia de un espacio. La E/S a menudo tiene su propio espacio de direcciones; en algunas arquitecturas de microcontroladores, la memoria de código y la memoria de datos son espacios separados.

Y así, los registros también pueden tener su propio espacio: a veces, los registros FP y de enteros (y en el 68000, creo, los registros de direcciones) tienen cada uno su propio espacio separado.

Una pregunta es: ¿cómo sabemos si la dirección 1 se refiere al byte 1 en la memoria, al puerto de E/S 1 o al registro 1? Por lo general, del contexto: en una instrucción IN o OUT, obviamente un puerto. En una instrucción de registro a registro, es una dirección de registro. En una instrucción de carga, habrá una dirección de memoria (grande) y una dirección de registro (pequeña), y así sucesivamente.

En un núcleo ARM, una dirección de memoria suele ser un número de 32 bits; una dirección de registro será un número de 5 bits.

Muchos procesadores tienen algunos registros a los que se accede "por número", pero también algunos registros a los que solo se puede acceder mediante instrucciones especiales. No sé cómo se podría describir significativamente el registro "S" del 6502 como si tuviera una dirección, por ejemplo. Aparte de push/pop/call/return, las únicas instrucciones que acceden son TSX/TXS (transferir S a X o X a S). El bit 4 del código de operación selecciona entre TSX y TAX, o entre TXS y TXA, pero no tiene sentido considerar los códigos de operación como "Transferir X al registro #b", ya que ninguna otra instrucción se refiere a que A es el registro #0 y S como registro #1.

Si se define una dirección como un conjunto de kbits que se pueden usar para seleccionar un elemento de un conjunto de hasta 2^kelementos, entonces es común que muchos registros en muchos procesadores y controladores tengan direcciones, pero también que los controladores tengan algunas direcciones. registros que son estroboscópicos por circuitos que detectan condiciones particulares, y no son identificables a través de ninguna forma de dirección. Sin embargo, es importante tener en cuenta que, en muchos casos, los cables de dirección que controlan los registros de la CPU no tendrán relación con los cables de dirección que están conectados a sistemas de memoria más grandes. Como tal, las "direcciones" de registro a menudo existirán en un "universo" completamente separado de las direcciones de memoria.

En la mayoría de los procesadores, las "direcciones" de registro siempre se generan internamente por la lógica del procesador, fuera del control del programador, o se extraen de ciertos bits en cada instrucción. La única forma en que el código de cambio podría afectar el software a qué registro debe obtener una instrucción en particular sería parchear los bits apropiados dentro de esa instrucción. En el PIC de General Instruments, cuyo diseño sigue vivo en la forma del PIC de Microchip, si un código de operación especificara todos ceros para una dirección, el hardware sustituiría el contenido de un registro diferente ubicado en la dirección 3. Esto permite que el código use cálculos para seleccionar Una dirección.

Quizás lo más importante que hay que entender acerca de las direcciones es que es posible que un sistema tenga diferentes espacios de direcciones que efectivamente existen en diferentes universos. En el 8051, por ejemplo, hay, dependiendo de cómo se cuente, al menos cuatro espacios de direcciones diferentes y posiblemente hasta seis; cuatro de ellos son totalmente independientes (las instrucciones:

mov a,80h  ; Direct address space
mov a,@r0  ; Assume R0 = 80h
movc a,@a+dptr ; Assume A = 0 and DPTR = 80h
movx a,@dptr ; Assume DPTR = 80h

todos recuperan datos de la "dirección 80h", pero leen cuatro cosas no relacionadas: una dirección en el espacio de E/S (creo que el registro de datos del puerto 0), registro de datos interno 80h, memoria de código en la dirección 0x0080 y memoria de datos externa en la dirección 0x0080 . En muchos sistemas, estas cosas de hecho no tendrían ninguna relación entre sí. El hecho de que un registro responda a una dirección particular en un universo dice poco o nada acerca de si responderá a esa oa cualquier otra dirección en un universo diferente.

RISC significa "Computadora con conjunto de instrucciones reducido". Parte de la forma de reducir el tamaño del conjunto de instrucciones es tener solo un tipo de ubicación de datos, que incluye registros, RAM o E/S.

Antes, cuando la gente se tomaba estas ideas en serio, las dos ventajas esperadas de los diseños RISC eran que podía hacer que el procesador fuera mucho más rápido si lo hacía mucho más simple y que podía optimizar el código de su programa si podía usar cualquier dirección de memoria para cualquier cosa. en lugar de forzar que todo se cargue y descargue pasando por el registro ALU para aritmética, el registro de dirección de memoria para direccionamiento de memoria, etc.

Dos remanentes de esa forma de pensar son: (1) Tenemos procesadores que PRETENDEN que todos los registros son iguales, mapeando registros en el espacio de la memoria, y (2) Tenemos profesores que PRETENDEN que todos los registros son iguales, llamando registros a ubicaciones de memoria.

Se tolerante. Fue un área importante de investigación para los estudiantes de doctorado, que tuvo un impacto significativo y duradero en la forma en que se diseñaron algunos procesadores.

No. RISC no tiende a significar la pérdida de distinción entre el archivo de registro y la memoria principal, ya que eso complicaría la decodificación de instrucciones, que es lo opuesto a los objetivos de RISC. RISC se trata clásicamente de instrucciones simples que hacen lo que hacen rápidamente y dejan que el programador/compilador las encadene. Por lo tanto, las versiones de instrucciones de registro y dirección de memoria tienen codificaciones diferentes en una arquitectura RISC clásica. Y el acceso a la memoria suele ser a una dirección proporcionada por un registro con un desplazamiento inmediato limitado ya que solo hay una cantidad determinada de bits disponibles en la palabra de instrucción.
Tienes eso correcto excepto la primera oración. La pérdida de distinción entre el archivo de registro y la memoria principal es una de las formas clásicas de decodificación de instrucciones simplificadas de RISC, que es uno de los objetivos de RISC. En la práctica, intervienen consideraciones prácticas. Por ejemplo, consulte The Ultimate RISC
Una palabra de instrucción RISC codifica de manera bastante explícita un número de registro o una referencia de memoria, lo que preserva la distinción en comparación con la situación contemplada aquí en la que un registro se codifica exactamente de la misma manera que una dirección de memoria.
Por favor, lea la referencia primero. Antes de publicar
La referencia es a una arquitectura académica excéntrica, no a diseños clásicos de riesgo tal como se construyeron en realidad.
¡Lo notaste! Ahora regresa y lee la publicación original y mi respuesta. Note la palabra "profesor" en ambas publicaciones. ¿Ver? Pregunta respuesta. Respuesta, Pregunta. Relación cercana. No elegí escribir sobre un tema diferente.

El 8051, si no recuerdo mal, podría acceder a los registros utilizando direcciones de memoria, pero este no es el caso general para todos los procesadores. Los procesadores ARM no tienen forma de hacer esto, no se puede acceder a los registros de propósito general r0-r15 en el bus de memoria.