SOPORTE PARA LA UNIDAD MATEMÁTICA DEL 80C517/537
Los Siemens 80C537 y 80C517A poseen una unidad matemática especial, la MDU, pensada para acelerar las aplicaciones que hagan un uso intensivo de las operaciones aritméticas con números.
Para facilitar la multiplicación y división de números de 16 y 32 bits (int y long), los Siemens 80C517 disponen de un co-procesador matemático (MDU) integrado en la CPU. También tiene operaciones de normalización y desplazamiento de 32 bits para soportar las operaciones con números en coma flotante. Además posee 8 registros apuntadores de datos (8 DPTRs) para facilitar el acceso a RAM externa.
El compilador puede sacar partido de estas mejoras del hardware si se utiliza el switch "MOD517", en la línea de comandos, o por medio de un #pragma. Así se hará uso de la MDU en las multiplicaciones y divisiones de más de 8 bit. Sin embargo el linker necesita una librería especial proporcionada por Keil.
El empleo de la MDU proporciona mejoras de 6 a 9 veces superiores a las del 8051 en la aritmética de enteros sin signo de 32 bits.
Una vez utilizado el switch MOD517 se puede deshabilitar el uso de la MDU mediante los #pragmas NOMDU and NODP. La opción NOMDU inhibe el uso de la unidad matemática, mientras que NODP evita el uso de los 8 DPTRs.
El 517A tiene 8 DPTRs que pueden acelerar el movimiento de bloques en memoria externa. El compilador C51 utiliza los DPTR únicamente con las funciones de librería memcpy() y strcpy().
Para utilizarlos el switch "MOD517" debe encontrarse activo. Notar que la función strcat() no utiliza los DPTR adicionales.
Si se utilizan los DPTR extra en el programa principal y en las funciones de interrupción, el registro DPSEL se almacena en la pila automáticamente al entrar en la interrupción utilizándose un nuevo valor en DPSEL mientras dure la función.
La MDU del 80C517 se usa como una subrutina hardware, ya que no forma parte de la CPU del 8051. Como tal, está sujeta a las reglas normales sobre re-entrancia de las subrutinas. Si por ejemplo, el programa principal y las rutinas de interrupción utilizan simultáneamente la MDU, los cálculos del programa principal serán erróneos. Esto se debe a que los registros de entrada y salida de la MDU ocupan posiciones fijas que pueden ser sobre-escritas por las rutinas de interrupción.
Para que el programa principal pueda detectar la sobre-escritura de los registros de la MDU, se utiliza el bit MDEF del registro ARCON. Si este bit se encuentra a "1" el cálculo debe repetirse. Otra solución consiste en hacer un uso apropiado del #pragma NOMDU.
Nota: el compilador no hace esto - el usuario debe añadir lo que sigue para superar el problema:
#pragma MOD517 #include "reg517.h" long x,y,z ; func() { while(1) { x = y / z ; /* cálculo de 32-bit */ if(MDEF == 0) /* Repetir si los datos */ { break ; } /* han sido sobre-escritos */ } /* Salir en caso contrario */ } |