TEMA 7 SECUENCIADOR DEL PROGRAMA CURSO 2010/2011 SECUENCIADOR DEL PROGRAMA 1. 2. Introducción • Ciclo de Instrucción • Arquitectura del Secuenciador del Programa • Registros del Secuenciador y Registros del Sistema Operaciones del Secuenciador del Programa • Flujo Secuencial de Instrucciones • Acceso a datos en Memoria de Programa • Bifurcaciones • Bucles 3. Ejecución Condicional de Instrucciones 4. Bifurcaciones • Bifurcaciones Retrasadas y no Retrasadas • Pila del PC 1 SECUENCIADOR DEL PROGRAMA 5. 6. Bucles • Restricciones y Bucles Cortos • Pila de Direcciones de Bucles • Pila de Contadores de Bucles Timer • Habilitar/Inhabilitar el Timer • Interrupciones del Timer • Registros del Timer 7. Flags de las Pilas 8. Instrucciones IDLE e IDLE16 9. Caché de Instrucciones INTRODUCCION ¾ En los procesadores de la familia ADSP-2106x el flujo del programa es la mayor parte del tiempo lineal, el procesador ejecuta las instrucciones del programa de forma secuencial. ¾ Las alteraciones de este flujo secuencial vienen dadas por estructuras de programación tales como: 9 Bucles: una secuencia de instrucciones se ejecuta varias veces. 9 Saltos: el flujo del programa se transfiere de forma permanente a otra zona de la memoria de programa. 9 Subrutinas: el procesador interrumpe temporalmente el flujo secuencial para ejecutar instrucciones contenidas en otra zona de la memoria de programa. 9 Interrupciones: es un caso especial de las subrutinas en el cual la ejecución de la subrutina es desencadenada por un evento que ocurre en tiempo de ejecución, no por una instrucción del programa. 9 Instrucción Idle: es una instrucción especial cuya ejecución produce que el procesador cese sus operaciones manteniendo su estado actual. 2 INTRODUCCION INTRODUCCION ¾ Manejar estas estructuras de programación es la tarea del Secuenciador de Programa que poseen los procesadores ADSP-2106x. ¾ El Secuenciador de Programa selecciona la dirección de la siguiente instrucción y realiza también un amplio rango de funciones relacionadas como son: 9 Incrementar la dirección de búsqueda. 9 Mantenimiento de las Pilas. 9 Evaluar condiciones. 9 Decrementar el contador de bucles. 9 Calcular nuevas direcciones. 9 Mantenimiento de la caché de instrucciones. 9 Manejo de Interrupciones. 3 CICLO DE INSTRUCCION ¾ Los procesadores de la familia ADSP-2106x procesan las instrucciones en tres ciclos de reloj: 1. En el Ciclo de Búsqueda, el procesador lee la instrucción de la caché de instrucciones interna o de la memoria de programa. 2. Durante el Ciclo de Decodificación, la instrucción es decodificada generándose las condiciones que controlan la ejecución de la instrucción. 3. En el Ciclo de Ejecución, el procesador ejecuta la instrucción,se realizan todas las operaciones especificadas por la instrucción. ¾ Estos ciclos se solapan o segmentan “pipeline”. ¾ Cuando el flujo del programa es secuencial, mientras se busca una instrucción, la instrucción leída en el ciclo anterior está siendo decodificada y la instrucción buscada dos ciclos antes está siendo ejecutada. Por tanto la tasa de ejecución es de una instrucción por ciclo. CICLO DE INSTRUCCION 4 CICLO DE INSTRUCCION ¾ Cualquier alteración del flujo secuencial puede potencialmente disminuir esta tasa de ejecución de instrucciones. ¾ Operaciones del programa no secuenciales incluyen: 9 Acceso a datos en memoria de programa que entran en conflicto con búsquedas de instrucciones. 9 Saltos. 9 LLamadas y Retornos de subrutinas. 9 Interrupciones y Retornos. 9 Bucles. AQUITECTURA DEL SECUENCIADOR ¾ El Secuenciador selecciona el valor de la siguiente dirección de búsqueda de entre diversas posibles fuentes. ¾ El registro de dirección de búsqueda, registro de dirección de decodificación y el contador de programa (PC) contienen respectivamente las direcciones de las instrucciones que en el ciclo actual van a ser buscadas, decodificadas y ejecutadas. ¾ El PC está asociado con la Pila del PC, la cual es utilizada para almacenar direcciones de retorno y direcciones de comienzo de los bucles. ¾ El controlador de interrupciones realiza todas las funciones relacionadas con el procesamiento de las interrupciones, tales como determinar cuándo una interrupción está enmascarada y generar la dirección del vector de interrupción apropiada. ¾ La caché de instrucciones es la que posibilita que los procesadores de la familia ADSP-2106x puedan acceder a datos en memoria de programa y buscar una instrucción en la caché en el mismo ciclo. 5 AQUITECTURA DEL SECUENCIADOR ¾ El Generador de Direcciones DAG2 genera las direcciones de los datos contenidos en memoria de programa. ¾ El Secuenciador evalúa las instrucciones condicionales y las condiciones de terminación de los bucles usando la información contenida en los registros de estado. ¾ La Pila de direcciones de bucles y la Pila de contadores de bucles permiten los bucles anidados. ¾ La Pila de estado almacena los registros de estado para implementar rutinas de atención a interrupciones anidadas. AQUITECTURA DEL SECUENCIADOR 6 REGISTROS DEL SECUENCIADOR ¾ Todos los registros del Secuenciador de Programa son registros universales y, por tanto, accesibles desde otros registros universales así como también desde memoria de datos. ¾ Todos los registros y las cimas de las pilas se pueden leer. Todos los registros excepto el registro de dirección de búsqueda, registro de dirección de decodificación y el registro PC se pueden escribir. ¾ En la pila del PC se pueden introducir y sacar datos escribiendo en el puntero de pila del PC, el cual se puede leer y escribir en él. ¾ En las pilas de direcciones de bucles y de estado se introducen y sacan datos mediante instrucciones explícitas. ¾ Las instrucciones de manipulación de bits de registros del sistema (Grupo IV) se pueden usar para poner a uno, poner a cero, cambiar o comprobar bits específicos de los registros del sistema. REGISTROS DEL SECUENCIADOR ¾ Debido a la estructura segmentada o ”pipeline”, las escrituras en algunos de estos registros no tienen efecto en el siguiente ciclo, por ejemplo, si escribimos en el registro MODE1 en el bit correspondiente que habilita el modo saturación de la ALU, el cambio de modo no tendrá lugar hasta dos ciclos después de la escritura. ¾ También algunos registros no se actualizan en el ciclo inmediatamente después de la escritura, necesitan un ciclo extra antes de que pueda ser leído el nuevo valor. ¾ En la tabla se resume el número de ciclos extra para que una escritura tenga efecto (effect latency) y para que el nuevo valor aparezca en el registro (read latency). ¾ Un “0” indica que la escritura tiene efecto o aparece en el registro en el siguiente ciclo después de que la instrucción de escritura sea ejecutada. Un “1” indica un ciclo extra. 7 REGISTROS DEL SECUENCIADOR OPERACIONES DEL SECUENCIADOR ¾ En este apartado se pretende dar una visión general del modo de operación del Secuenciador de Programa, para ello se definen los diferentes tipos de flujo del programa que serán descritos más detalladamente en los siguientes apartados. FLUJO SECUENCIAL DE INSTRUCCIONES ¾ EL Secuenciador de Programa determina la dirección de la siguiente instrucción a ejecutar, examinando por un lado la instrucción que en el ciclo actual está siendo ejecutada y el estado actual del procesador. Si no existen condiciones, el procesador ejecuta instrucciones almacenadas en la memoria de programa en orden secuencial simplemente incrementando la dirección de búsqueda. ACCESO A DATOS EN MEMORIA DE PROGRAMA ¾ Normalmente el procesador busca una instrucción en la memoria en cada ciclo. Cuando el procesador ejecuta una instrucción que necesita leer o escribir un dato en el mismo bloque de memoria en el que está almacenada la instrucción, se produce un conflicto en el acceso a este bloque. 8 OPERACIONES DEL SECUENCIADOR ¾ El procesador utiliza su caché de instrucciones para disminuir los retrasos ocasionados por este tipo de conflictos. ¾ La primera vez que el procesador encuentra una búsqueda de instrucción que entra en conflicto con un acceso a dato en memoria de programa, debe esperar a realizar la búsqueda de instrucción en el siguiente ciclo, ocasionando un retraso. Entonces el procesador automáticamente escribe la instrucción buscada en la caché para evitar que el mismo retraso se produzca otra vez. ¾ En cada acceso a datos en memoria de programa el procesador comprueba la caché de instrucciones, si la instrucción necesitada está disponible en la caché, la búsqueda de la instrucción ocurre en paralelo con el acceso al dato en memoria de programa, sin incurrir en ningún retraso. BIFURCACIONES ¾ Una bifurcación ocurre cuando la dirección de búsqueda no es la dirección siguiente a la dirección de búsqueda previa. OPERACIONES DEL SECUENCIADOR ¾ Los tipos de bifurcaciones que los procesadores de la familia ADSP-2106x soportan son saltos y llamadas y retornos de subrutinas. ¾ En el Secuenciador de Programa la única diferencia entre un salto y una llamada a subrutina es que antes de ejecutar la llamada a subrutina se guarda en la Pila del PC la dirección de retorno que está disponible, por tanto, cuando más tarde se ejecuta una instrucción de retorno. (Las instrucciones de salto transfieren el flujo a una nueva posición sin permitir el retorno). BUCLES ¾ Los procesadores de la familia ADSP-2106x implementan los bucles mediante la instrucción DO UNTIL. ¾ Esta instrucción da lugar a que una secuencia de instrucciones se repita hasta que al evaluar la condición especificada sea verdadera. 9 EJECUCION CONDICIONAL ¾ El Secuenciador de Programa evalúa condiciones para determinar cuando ejecutar una instrucción condicional o cuando terminar un bucle. ¾ Las condiciones se basan en la información proveniente del registro de estado aritmético (ASTAT), del registro de modo (MODE1), los flags de entrada y el contador de bucles. ¾ Cada condición que puede evaluar el procesador tiene asociado un nemónico en lenguaje ensamblador y un código que es usado en el código de operación de las instrucciones condicionales. ¾ Para la mayoría de las condiciones el secuenciador de programa puede comprobar los estados verdadero y falso, es decir, igual a cero o distinto de cero. ¾ El flag BTF (bit test flag) es el bit 18 del registro ASTAT. Este flag se modifica en función de los resultados generados por las instrucciones BIT TST o BIT XOR (subgrupo de instrucciones de manipulación de bits de los registros del sistema) que se usan para comprobar el contenido de los registros del sistema. EJECUCION CONDICIONAL ¾ Una vez que este flag BTF ha sido modificado por una de estas instrucciones (BIT) puede ser usado como condición en una instrucción condicional. ¾ Las dos condiciones que no tienen complementaria son LCE/NOT LCE y TRUE/FOREVER. El significado de estas condiciones viene determinado por el contexto; TRUE y NOT LCE se usan en instrucciones condicionales; FOREVER y LCE en condiciones de terminación de bucles. ¾ La estructura IF TRUE crea una instrucción incondicional, es decir, produce el mismo efecto que quitar completamente la condición. ¾ La estructura DO FOREVER ejecuta un bucle indefinidamente hasta que ocurre una interrupción o un reset. ¾ En la instrucción DO UNTIL la condición normalmente usada es LCE (esta condición comprueba el valor del contador de bucles CURLCNTR). ¾ La condición Bus Master (BM) indica cuando el procesador funcionando en un sistema multiprocesador, es actualmente el Bus Master. Para habilitar el uso de esta condición es necesario que los bits 17 y 18 del registro MODE1 sean ambos igual a cero, en caso contrario la condición es siempre evaluada como falsa. 10 EJECUCION CONDICIONAL BIFURCACIONES ¾ Tanto los saltos como las llamadas a subrutinas transfieren el flujo del programa a otra dirección de memoria, pero una llamada a subrutina almacena en la Pila del PC la dirección de retorno, por ello esta dirección está disponible cuando más tarde se ejecuta la instrucción de retorno de subrutina. ¾ El retorno da lugar a que el procesador salte a la dirección almacenada en la cima de la Pila del PC. Hay dos tipos de instrucción de retorno: retorno de subrutina (RTS) y retorno de interrupción (RTI). ¾ La diferencia entre los dos radica en que la instrucción RTI no solamente saca de la Pila del PC la dirección de retorno sino que además: 1) Saca de la Pila de Estado los valores guardados de los registros de estado ASTAT y MODE1 si han sido guardados en la pila (esto ocurre con las interrupciones IRQ2-0, la interrupción asociada al timer y la interrupción VIRPT). 2) Borra el bit apropiado en el registro IRPTL (latch de interrupciones) y en el puntero a la máscara de interrupciones (IMASKP). 11 BIFURCACIONES ¾ En los saltos se pueden especificar una serie de parámetros: 1) Los saltos y las llamadas y retornos pueden ser condicionales. El Secuenciador de Programa puede evaluar una serie de condiciones de estado para decidir cuando el salto será ejecutado o no. Si no se especifican condiciones el salto será siempre ejecutado. 2) Los saltos y las llamadas a subrutinas pueden ser indirectos, directos y relativos al PC. Un salto indirecto salta a una dirección generada por el Generador de Direcciones DAG2. Los saltos directos saltan a una dirección de 24 bits especificada en un campo inmediato en la propia instrucción de salto. Los saltos relativos al PC también utilizan un valor especificado en la propia instrucción, pero el Secuenciador suma este valor al valor actual del PC para calcular la dirección de salto. 3) Los saltos y las llamadas a subrutinas pueden ser retrasadas y no retrasadas. En un salto retrasado, las dos instrucciones colocadas inmediatamente después de la instrucción de salto se ejecutan; en un salto no retrasado el Secuenciador de programa suprime la ejecución de estas dos instrucciones (en su lugar se ejecutan NOPs). BIFURCACIONES 4) La instrucción JUMP (LA) produce que automáticamente se aborte el bucle, si está dentro de un bucle. Cuando se aborta el bucle se extrae un dato de las Pilas de PC y de Direcciones de Bucles, por tanto si el bucle era anidado, las pilas aún contienen los valores correctos del bucle exterior. JUMP (LA) es similar a la instrucción “Break” disponible en el lenguaje C, que es utilizada para terminar la ejecución de un bucle de forma prematura. (La instrucción JUMP (LA) no puede ser usada en las últimas tres instrucciones del bucle). 12 BIFURCACIONES RETRASADAS Y NO RETRASADAS ¾ El modificador de instrucción (DB) indica que el salto es retrasado, en caso contrario no es retrasado. ¾ Si el salto es no retrasado las dos instrucciones después del salto que están en las etapas de búsqueda y decodificación no se ejecutan. ¾ En una llamada a subrutina la dirección de decodificación (que es la dirección de la instrucción colocada después de la de llamada a subrutina) es la dirección de retorno. ¾ Durante los dos ciclos de No Operación, la primera instrucción colocada en la dirección de salto es buscada y decodificada. ¾ En un salto retrasado el procesador continua ejecutando las dos instrucciones siguientes al salto, mientras la instrucción almacenada en la dirección del salto es buscada y decodificada. ¾ En el caso de una llamada a subrutina la dirección de retorno es la dirección de la tercera instrucción después de la instrucción de llamada. BIFURCACIONES RETRASADAS Y NO RETRASADAS 13 BIFURCACIONES RETRASADAS Y NO RETRASADAS BIFURCACIONES RETRASADAS Y NO RETRASADAS ¾ Un salto retrasado es más eficiente pero dificulta la comprensión del programa debido a estas dos instrucciones entre la instrucción de salto y el salto real. ¾ Debido a la estructura segmentada o “pipeline” una instrucción de salto retrasado y las dos instrucciones siguientes deben ser ejecutadas en orden secuencial. ¾ Por tanto, las instrucciones que se pueden colocar en las dos posiciones siguientes a un salto retrasado no pueden ser las siguientes: ¾ Otros saltos, llamadas a subrutinas o retornos. ¾ Introducir o sacar datos de la Pila del PC. ¾ Escrituras en el Puntero de la Pila del PC. ¾ Instrucción DO UNTIL. ¾ Instrucciones IDLE e IDLE16. 14 BIFURCACIONES RETRASADAS Y NO RETRASADAS ¾ Además estos procesadores no procesan una interrupción que se produzca entre una instrucción de salto retrasado y las dos instrucciones siguientes, puesto que estas tres instrucciones deben ser ejecutadas secuencialmente. ¾ Cualquier interrupción que ocurra durante la ejecución de estas instrucciones es guardada como pendiente y no se inicia su procesamiento hasta que no se completa el salto. ¾ Después de una llamada o retorno de subrutina retrasado si está permitido leer la Pila del PC o el Puntero de Pila del PC, pero estas lecturas muestran que la dirección de retorno ha sido ya introducida o sacada de la Pila del PC a pesar de que el salto aún no se ha ejecutado. PILA DEL PC ¾ La Pila del PC almacena las direcciones de retorno de las subrutinas software, de las subrutinas de atención a interrupción y las direcciones de comienzo de los bucles. ¾ La Pila del PC tiene 30 posiciones cada una de las cuales almacena una dirección de 24 bits. ¾ Se saca un dato de la Pila del PC cada vez que se ejecuta la instrucción de retorno de subrutina de atención a interrupción (RTI) de retorno de subrutina software (RTS) y de terminación de un bucle. ¾ La Pila está llena cuando todas sus posiciones están ocupadas, vacía cuando todas sus posiciones están libres y se produce overflow cuando se ejecuta una instrucción de llamada a subrutina y la Pila está ya llena. ¾ Los flags de vacía y llena están almacenados en el registro de adhesivos (STKY). El flag de pila llena da lugar a una interrupción enmascarable. 15 PILA DEL PC ¾ Esta interrupción ocurre cuando están ocupadas 29 posiciones de la Pila del PC, puesto que al saltar a la subrutina de servicio se almacena una nueva dirección de retorno en la pila que es la que da lugar a pila llena. Por eso la interrupción es pila llena aunque realmente la condición que provoca la interrupción es pila casi llena. ¾ Las otras pilas del secuenciador, la pila de direcciones de bucles, la pila de contadores de bucles y la pila de estado, también provocan interrupciones cuando se produce overflow, pero estas interrupciones se inician cuando se introduce un nuevo dato en ellas y las pilas están ya llenas. ¾ El puntero de Pila del PC (PCSTKP) es un registro que contiene la dirección de la cima de la pila y que puede leerse o escribirse en él. ¾ El valor del puntero PCSTKP es cero cuando la pila está vacía, 1, 2, …30 cuando la pila contiene datos y 31 cuando se produce overflow. ¾ Los datos escritos en el puntero PCSTKP tienen efecto un ciclo después. Si ha ocurrido overflow y escribimos un nuevo valor en el puntero no tiene efecto. BUCLES ¾ La instrucción DO UNTIL proporciona una forma eficiente de implementar los bucles software sin instrucciones adicionales para saltar, comprobar la condición o decrementar el contador: Ejemplo: LCNTR = 30, DO label UNTIL LCE; R0 = DM(I0, M0), F2 = PM(I8,M8); R1 = R0 – R15; label: F4 = F2 + F3; ¾ Cuando el procesador ejecuta la instrucción DO UNTIL, el secuenciador de programa almacena la dirección de la última instrucción del bucle y la condición a comprobar para salir del bucle (ambos especificados en la instrucción) en la pila de direcciones de bucles. ¾ También el procesador almacena la dirección de comienzo del bucle, que es la dirección de la instrucción siguiente a la instrucción DO UNTIL en la Pila del PC. 16 BUCLES BUCLES ¾ Debido a la estructura segmentada o “pipeline” (ciclos de búsqueda, decodificación y ejecución), el procesador comprueba la condición de terminación y, si el bucle es con contador decrementa el contador, antes del final del bucle, por tanto la siguiente búsqueda tanto si es fuera del bucle como si vuelve al comienzo del bucle, está basada en el resultado de la comprobación de la condición. ¾ Concretamente la condición se comprueba cuando se ejecuta la instrucción colocada dos posiciones antes de la última instrucción del bucle (en la posición e-2, siendo e la dirección del final del bucle). ¾ Si la condición de terminación no es verdadera, el procesador busca la instrucción en la dirección de comienzo del bucle, almacenada en la cima de la Pila del PC. ¾ Si la condición de terminación es verdadera, el secuenciador busca la siguiente instrucción en la dirección después del final del bucle y saca un dato de la pila de direcciones de bucles y de la Pila del PC. 17 BUCLES RESTRICCIONES Y BUCLES CORTOS ¾ En esta sección vamos a describir algunas restricciones de programación de los bucles. También explicaremos restricciones que afectan únicamente a los bucles cortos (con una o dos instrucciones) los cuales requieren una consideración especial debido al pipeline de tres etapas: búsqueda, decodificación y ejecución. RESTRICCIONES GENERALES 1) Los bucles anidados no pueden terminar en la misma instrucción. 2) Las tres últimas instrucciones de un bucle no pueden ser una bifurcación (jump, call o return); en caso contrario el bucle puede no ser ejecutado correctamente. Esto también debe aplicarse a los bucles de una única instrucción y los bucles de dos instrucciones con una única iteración. ¾ Hay una excepción a esta regla, una llamada a subrutina no retrasada (sin el modificador DB) seguida de retorno RTS (LR) de subrutina sin abortar el bucle. La llamada a subrutina no retrasada se puede usar como una de las tres últimas instrucciones del bucle (pero no en bucles de una única instrucción o de dos instrucciones y con una única iteración). 18 RESTRICCIONES Y BUCLES CORTOS ¾ La instrucción RTS (LR) asegura el retorno dentro del bucle de forma correcta. En bucles basados en contador, por ejemplo, la condición de terminación del bucle se comprueba decrementando el contador actual del bucle (CURLCNTR) durante la ejecución de la instrucción colocada dos posiciones antes del final del bucle. ¾ Una llamada a subrutina no retrasada se puede colocar en una de las dos últimas instrucciones del bucle siempre que se utilice la instrucción RTS (LR) como retorno de la subrutina. Este modificador (LR) asegura el retorno correcto dentro del bucle, evitando que el contador del bucle se decremente de nuevo, es decir, dos veces en la misma iteración del bucle. BUCLES CON CONTADOR ¾ En los bucles basados en contador, la tercera instrucción desde el final del bucle (e-2) no puede ser una escritura en el contador desde memoria. ¾ Los bucles cortos, con menos de tres instrucciones terminan de una forma especial debido a la estructura segmentada o pipeline de tres etapas. RESTRICCIONES Y BUCLES CORTOS ¾ Los bucles basados en contador con solamente una o dos instrucciones no son suficientemente largos para que el secuenciador compruebe la condición de terminación dos instrucciones antes del final del bucle. ¾ En estos bucles cortos el secuenciador está ya otra vez dentro del bucle cuando se comprueba la condición de terminación. ¾ Para evitar los ciclos adicionales un bucle con una única instrucción debe ser ejecutado al menos tres veces y un bucle con longitud dos instrucciones debe ser ejecutado al menos dos veces. ¾ Los bucles con una única instrucción y una única iteración o dos iteraciones y los bucles con dos instrucciones y una única iteración, incurren en dos ciclos adicionales (NOP) puesto que es necesario abortar dos instrucciones después de la última iteración para limpiar el pipeline. ¾ El procesamiento de una interrupción que ocurre durante la última iteración de un bucle de una única instrucción que se ejecuta una o dos veces o de un bucle de dos instrucciones que se ejecuta una vez o en el ciclo siguiente a estos bucles, es retrasado un ciclo. 19 RESTRICCIONES Y BUCLES CORTOS RESTRICCIONES Y BUCLES CORTOS 20 RESTRICCIONES Y BUCLES CORTOS ¾ De forma similar, en un bucle de una única instrucción con al menos tres iteraciones, el procesamiento de la interrupción es retrasado un ciclo si la interrupción ocurre durante la antepenúltima iteración. BUCLES SIN CONTADOR ¾ Los bucles no basados en contador son aquellos en los cuales la condición de terminación de los bucles es distinta de LCE. ¾ Cuando un bucle sin contador es el bucle externo de una serie de bucles anidados, la dirección del final del bucle externo debe estar localizada al menos dos direcciones después de la dirección final del bucle interno. ¾ La instrucción JUMP (LA) se usa para abortar de forma prematura un bucle. Cuando esta instrucción se coloca en un bucle interno de una serie de bucles anidados y el bucle externo es sin contador, la dirección de salto no puede ser la dirección de la última instrucción del bucle externo. La dirección de salto puede ser, sin embargo, la siguiente a la última o cualquiera más próxima. RESTRICCIONES Y BUCLES CORTOS ¾ Los bucles cortos no basados en contador terminan de una forma especial debido al pipeline de tres etapas: búsqueda, decodificación y ejecución. 1) En un bucle de tres instrucciones la condición de terminación del bucle se comprueba cuando se ejecuta la instrucción de comienzo del bucle. Cuando la condición es verdadera, el secuenciador realiza una iteración completa del bucle antes de salir. 2) En un bucle de dos instrucciones, la condición de terminación del bucle se comprueba durante la ejecución de la segunda y última instrucción. Si la condición se hace verdadera cuando se ejecuta la primera instrucción, se evalúa como verdadera durante la ejecución de la segunda y se realiza una iteración completa antes de salir del bucle. Si la condición se hace verdadera durante la ejecución de la segunda instrucción, se realizan dos iteraciones completas antes de salir del bucle. 3) En un bucle con una única instrucción la condición de terminación se comprueba en cada ciclo de instrucción. Cuando la condición se hace verdadera, el bucle se ejecuta tres veces más antes de salir. 21 PILA DE DIRECCIONES DE BUCLES ¾ La pila de direcciones de bucles tiene 6 posiciones, cada una de las cuales almacena un dato de 32 bits. ¾ Una palabra de 32 bits almacenada en una posición consta de 24 bits correspondientes a la dirección de terminación del bucle, un código de 5 bits que codifica la condición de salida del bucle y un código de 2 bits que codifica el tipo de bucle. PILA DE DIRECCIONES DE BUCLES ¾ La dirección de terminación del bucle, el código de condición de salida del bucle y el código de tipo de bucle son introducidos en la pila de direcciones de bucles cuando se ejecutan las instrucciones DO UNTIL o PUSH LOOP. ¾ Se saca un dato de la pila de direcciones de bucle dos instrucciones antes del final en la última iteración o cuando se ejecuta la instrucción POP LOOP. ¾ Ocurre overflow en la pila de direcciones de bucles cuando se introduce un dato y todas sus posiciones están ocupadas. La pila está vacía cuando no está ocupada ninguna posición. ¾ Los flags de overflow y pila vacía están en el registro de adhesivos. La condición de overflow genera una interrupción enmascarable. ¾ El registro LADDR contiene el valor de la cima de la pila de direcciones de bucles. Este registro se puede leer y se puede escribir a través del bus DM. ¾ Las operaciones de lectura y escritura en el registro LADDR no modifican el puntero de la pila de direcciones de bucles. Sin embargo si se introduce o saca un dato de esta pila mediante instrucciones explícitas si se modifica el puntero. 22 PILA DE DIRECCIONES DE BUCLES ¾ Puesto que la condición de salida del bucle se comprueba dos instrucciones antes del final del bucle, se saca una palabra de la pila de direcciones de bucles antes del final del bucle en la última iteración. Si se lee el registro LADDR en estas últimas instrucciones ya no contiene la dirección de terminación del bucle. ¾ Si se ejecuta una instrucción de salto a una dirección fuera de un bucle especificando el modificador de “abortar bucle” JUMP (LA), esta instrucción saca un dato de la pila de direcciones de bucles (y también de la pila de contadores de bucles si es un bucle basado en contador). Esto permite que el mecanismo de los bucles continue funcionando correctamente. ¾ Es importante tener en cuenta que el modificador (LA) de la instrucción de salto únicamente saca un dato de la pila de direcciones de bucles, por tanto no se puede utilizar para saltar más de un nivel en bucles anidados. PILA DE CONTADORES DE BUCLES ¾ La pila de contadores de bucles tiene 6 posiciones, cada una de las cuales almacena un dato de 32 bits. ¾ La pila de contadores de bucles trabaja sincronizada con la pila de direcciones de bucles; ambas pilas tienen siempre el mismo número de posiciones ocupadas. Por tanto, los flags de overflow y pila vacía son los mismos para estas dos pilas. ¾ El secuenciador de programa de los procesadores ADSP-2106x mantiene dos contadores de bucles independientes: el contador de bucles actual (CURLCNTR) que mantiene las iteraciones para el bucle que está siendo ejecutado y el contador de bucles (LCNTR) que mantiene el valor del contador antes de que comience a ejecutarse el bucle. ¾ Ambos contadores son necesarios para mantener el valor del contador de un bucle externo cuando se inicializa el contador de un bucle interno. 23 PILA DE CONTADORES DE BUCLES CURLCNTR ¾ La cima de la pila de contadores de bucles siempre contiene el valor del contador del bucle que actualmente se está procesando. Este valor es el del registro CURLCNTR, el cual se puede leer y escribir a través del bus DM. ¾ Si se efectúa una lectura del registro CURLCNTR cuando la pila de contadores de bucle está vacía, el valor leído es 0xffffffff. ¾ El secuenciador de programa decrementa el valor del registro CURLCNTR en cada iteración del bucle. Puesto que la condición de salida del bucle se comprueba dos instrucciones antes del final del bucle, el contador del bucle también se decrementa antes del final del bucle. Si en las dos últimas instrucciones del bucle se lee el valor del registro CURLCNTR, el valor leído es el valor del contador en la siguiente iteración. ¾ Se saca una palabra de la pila de contadores de bucles dos instrucciones antes del final del bucle en la última iteración. PILA DE CONTADORES DE BUCLES ¾ Cuando se saca un dato de la pila de contadores de bucles, el valor que queda en la cima de la pila se convierte en el nuevo CURLCNTR, el contador del bucle que en este momento se está ejecutando. Si no se está ejecutando ningún bucle, el valor del registro CURLCNTR es 0xffffffff. ¾ Una escritura en el registro CURLCNTR no provoca que se introduzca un nuevo dato en la pila de contadores de bucles. Por esta razón si escribimos un nuevo valor en el registro CURLCNTR estamos cambiando el valor del contador del bucle que está actualmente en ejecución. Si esta escritura tiene lugar cuando no hay ninguna instrucción DO UNTIL LCE ejecutándose no tiene ningún efecto. ¾ Puesto que estos procesadores utilizan el registro CURLCNTR para implementar los bucles basados en contador, existen ciertas restricciones cuando se quiere escribir en este registro: la antepenúltima instrucción de un bucle basado en contador no puede ser una escritura desde memoria en el registro CURLCNTR y la siguiente instrucción a una escritura desde memoria en el registro CURLCNTR no puede ser una instrucción IF NOT LCE. 24 PILA DE CONTADORES DE BUCLES LCNTR ¾ LCNTR es el valor de la cima de la pila más uno, es decir, es el valor de la pila que tendrá efecto cuando se introduzca un nuevo dato en la pila. ¾ Para inicializar el contador de un bucle anidado sin afectar al valor del contador del bucle que actualmente se está procesando, se escribe el nuevo valor en LCNTR. Si LCNTR se inicializa con el valor cero provoca que el bucle se ejecute 232 iteraciones. ¾ La instrucción DO UNTIL LCE coloca el valor del registro LCNTR en la pila de contadores de bucles, de esta forma se convierte en el nuevo CURLCNTR. El valor anterior del registro CURLCNTR queda almacenado una posición más abajo en esta misma pila. ¾ Si leemos el registro LCNTR cuando la pila de contadores de bucles está llena, el valor leído no es válido. Además cuando la pila de contadores de bucles esta llena las escrituras sobre LCNTR no tienen efecto. PILA DE CONTADORES DE BUCLES 25 TIMER ¾ La familia de procesadores ADSP-2106x incluye un programable capaz de generar interrupciones periódicas. temporizador ¾ El control de la operación del timer se realiza mediante un bit del registro MODE2 y la programación del intervalo de tiempo que debe generar se realiza escribiendo determinados valores en sus dos registros asociados, TPERIOD y TCOUNT. ¾ El valor almacenado en el registro TPERIOD determina la frecuencia de las interrupciones del timer. El número de ciclos entre interrupciones es TPERIOD+1. El máximo valor de TPERIOD es 232-1 (por ejemplo, si el ciclo de reloj es de 50 ns, el máximo intervalo entre interrupciones es 214,75 segundos). ¾ Una señal de salida externa, TIMEXP, informa a los dispositivos externos que la temporización programada en el timer ha finalizado. TIMER ¾ El registro TCOUNT es el contador del timer. El timer decrementa el registro TCOUNT con cada ciclo de reloj. Cuando el registro TCOUNT llega a cero, el timer genera una interrupción y pone a 1 la salida TIMEXP durante 4 ciclos de reloj (cuando el temporizador está habilitado). En el siguiente ciclo de reloj después de que TCOUNT haya llegado a cero, el temporizador automáticamente recarga TCOUNT con el contenido de TPERIOD. 26 TIMER HABILITAR/INHABILITAR EL TIMER ¾ Para iniciar y parar el timer se debe habilitar e inhabilitar mediante el bit TIMEN del registro MODE2. ¾ Con el timer inhabilitado, se debe cargar un valor inicial en el registro TCOUNT y TPERIOD con el número de ciclos correspondiente en función del intervalo de tiempo deseado. Cuando se habilita el timer comienza la temporización. ¾ Al salir de reset el bit que habilita el timer del registro MODE2 está a cero, por lo que el timer está inhabilitado (no decrementa el registro TCOUNT y no genera interrupciones). Cuando el bit de habilitación del timer se pone a 1, el timer comienza a decrementar TCOUNT al final del siguiente ciclo de reloj. Si posteriormente este bit se borra, el timer se inhabilita y deja de decrementar después del siguiente ciclo de reloj. TIMER 27 TIMER INTERRUPCIONES DEL TIMER ¾ Cuando TCOUNT llega a cero, el timer genera dos interrupciones, una con una prioridad relativamente alta y otra con una prioridad relativamente baja. Después de reset, las dos interrupciones están enmascaradas. ¾ Se debe desenmascarar únicamente la interrupción que tiene la prioridad requerida, dejando enmascarada la otra. (La prioridad de las interrupciones determina qué interrupción va a ser atendida primero cuando se producen dos interrupciones en el mismo ciclo. También afecta a las interrupciones anidadas, cuando el anidamiento está habilitado, sólo las interrupciones con mayor prioridad pueden interrumpir a una subrutina de atención a interrupción que se está ejecutando). TIMER INTERRUPCIONES DEL TIMER ¾ Al igual que el resto de interrupciones, la interrupción del timer requiere dos ciclos de reloj para buscar y decodificar la primera instrucción de la subrutina de atención. La subrutina de atención comienza por tanto a ejecutarse cuatro ciclos de reloj después de que el contador haya llegado a cero. 28 TIMER REGISTROS DEL TIMER ¾ Los dos registros del timer, TCOUNT y TPERIOD se pueden leer y escribir mediante las transferencias con registros universales. ¾ La lectura de estos registros no interfiere con el timer. ¾ Una escritura explícita en el registro TCOUNT tiene prioridad sobre tanto la carga de TCOUNT desde TPERIOD como sobre el decremento de TCOUNT. ¾ Ninguno de los dos registros, TCOUNT y TPERIOD, toman valores iniciales después de reset, por ello se deben siempre inicializar ambos después de reset y antes de habilitar el timer. FLAGS DE LAS PILAS ¾ El registro de adhesivos contiene los flags de pila llena y pila vacía para la pila del PC, así como también flags de overflow y flags de pila vacía para las pilas de estado y de bucles. ¾ Al contrario que otros bits del registro de adhesivos, varios de estos flags no son adhesivos: se ponen a uno cuando se activa la condición correspondiente y se ponen a cero cuando la condición cambia (mediante una operación push o pop o por un reset del procesador). ¾ Los flags asociados a la pila de estado son únicamente de lectura. Las escrituras en el registro de adhesivos no tienen efecto sobre estos bits. ¾ La utilidad de los flags de overflow y pila llena es únicamente como ayuda al diagnóstico ya que no es posible recuperar datos cuando se produce overflow. ¾ Cuando se produce overflow en las pilas de estado y de bucles o se llena la pila del PC, esto genera una interrupción en el procesador. 29 FLAGS DE LAS PILAS ¾ Los flags que indican pila vacía facilitan la tarea de salvar las pilas en memoria. Monitorizando los flags de pila vacía cuando se está salvando una pila en memoria, podemos conocer cuando todos los valores almacenados en la pila has sido salvados. ¾ Los flags que indican pila vacía no generan interrupciones puesto que una pila vacía es una condición de funcionamiento aceptable. INSTRUCCIONES IDLE & IDLE16 ¾ Las instrucciones IDLE & IDLE16 son dos instrucciones especiales que paran el núcleo del procesador y lo introducen en un modo de bajo consumo hasta que se active una interrupción externa (IRQ2-0), la interrupción interna asociada al timer, una interrupción DMA o la interrupción del modo multiprocesador VIRPT. ¾ Cuando el procesador ejecuta una instrucción IDLE, busca una instrucción más en la dirección actual de búsqueda y después suspende las operaciones. ¾ El procesador de E/S de la familia ADSP-2106x no se ve afectado por la ejecución de la instrucción IDLE, cualquier transferencia DMA desde o hacia memoria interna no se ve interrumpida. ¾ El reloj interno del procesador continua funcionando durante la ejecución de la instrucción IDLE, así como también el timer, si está habilitado. ¾ Cuando ocurre una interrupción externa (IRQ2-0), la interrupción interna asociada al timer, una interrupción DMA o la interrupción del modo multiprocesador VIRPT el procesador responde normalmente. 30 INSTRUCCIONES IDLE & IDLE16 ¾ Una vez transcurridos los dos ciclos de reloj necesarios para buscar y decodificar la primera instrucción de la subrutina de servicio, el procesador continua ejecutando instrucciones normalmente. ¾ Solamente en el procesador ADSP-21061, la instrucción IDLE16 ejecuta un NOP e introduce al procesador en un modo de bajo consumo. IDLE16 es una versión de menor consumo de IDLE. ¾ La instrucción IDLE16 detiene la ejecución de instrucciones en el procesador, igual que IDLE, y además en este caso el reloj interno funciona a una frecuencia 1/16 la frecuencia de CLKIN. El procesador de E/S continua funcionando, pero todas las operaciones se realizan a una frecuencia 1/16 (todas las transferencias con memoria interna requieren 15 ciclos extra). ¾ El procesador permanece en este modo de bajo consumo hasta que se activa una interrupción. ¾ Después del retorno de la interrupción, la ejecución continua en la instrucción siguiente a IDLE o IDLE16. CACHE DE INSTRUCCIONES ¾ Los procesadores de la familia ADSP-2106x disponen de una memoria caché interna, asociativa, capaz de almacenar hasta 32 instrucciones. El modo de funcionamiento de la caché es totalmente transparente al programador. ¾ La memoria caché almacena únicamente las instrucciones cuya búsqueda entra en conflicto con el acceso a datos en memoria de programa ( a través del bus PMD y con direcciones generadas por el DAG2 sobre el bus PMA). Esta característica hace que la caché sea considerablemente más eficiente que si almacenara todas las instrucciones, puesto que, normalmente sólo un conjunto reducido de instrucciones acceden a datos almacenados en memoria de programa. ¾ Debido a la estructura segmentada en tres etapas, si la instrucción almacenada en la dirección n accede a un dato en memoria de programa, se producirá un conflicto con la búsqueda de la instrucción almacenada en la dirección n+2, suponiendo ejecución secuencial. La instrucción almacenada en la dirección n+2 es la que se guarda en la caché y no la instrucción que accede a un dato en memoria de programa. 31 CACHE DE INSTRUCCIONES ¾ Si la instrucción que se busca está disponible en la caché, ésta proporciona la instrucción mientras se realiza el acceso al dato en memoria de programa. Si la instrucción que se busca no está disponible en la caché entonces está búsqueda se realiza en el ciclo siguiente al acceso al dato en memoria de programa, incurriendo en un ciclo de penalización. Esta instrucción se almacena en la caché, si la caché esta habilitada y no congelada y, por tanto, estará disponible la próxima vez que se ejecute. ¾ La caché consta de 32 entradas y cada entrada consta de un par de registros que contienen una instrucción y su dirección. Cada entrada tiene asociado un bit de validación, si este bit está a 1 indica que dicha entrada contiene una instrucción válida. ¾ Las entradas están divididas en 16 grupos (numerados de 0 a 15) de dos entradas cada uno (entrada 0 y entrada 1). Cada grupo tiene asociado un bit LRU (Least Recently Used) que indica cual de las dos entradas contiene la instrucción más recientemente usada. ¾ Habitualmente el funcionamiento de la caché y su eficiencia es transparente al programador, sin embargo algunas situaciones pueden degradar la eficiencia de la caché y pueden ser fácilmente corregidas modificando el programa adecuadamente. CACHE DE INSTRUCCIONES 32