Por Tom Thompson – la programación integrada es un acto de equilibrio en la cuerda floja. A menudo, usted está tratando de lograr lo más que pueda, y luchando para conservar todos los ciclos del procesador posibles y de bytes de almacenamiento. Esto se debe a un sistema integrado de memoria flash, o tiene poco menos de RAM, y es a menudo alimentado por una batería.
De vez en cuando, puede que tenga un proyecto donde la aritmética de punto flotante sería muy útil, excepto que la mayoría de procesadores de bajo costo implícitos no tiene una unidad de punto flotante (FPU). En tales casos, hábilmente podría escalar los datos, utilice aritmética de punto fijo, o como un último recurso, tener el éxito de los ciclos y el almacenamiento mediante el uso de una biblioteca de software de punto flotante para hacer el trabajo. En este último caso, como hacer malabares con los ciclos y los recursos (lo que nos lleva de nuevo a ese acto de equilibrio en la cuerda floja), usted podría desear fervientemente que el silicio tenía un FPU.
Me complace informar de que para ciertas unidades de Freescale ARM Kinetis microcontrolador (MCU), su deseo ha sido concedido. El K70 Kinetis viene de serie con una FPU, y es una opción para Kinetis K10, K20, K60 y piezas que trabajan a frecuencias superiores a 100 MHz. La FPU ejecuta un solo punto flotante de precisión aritmética utilizando un conjunto de registros dedicados. Se basa en el mismo de baja potencia, alto rendimiento ARM Cortex-M4 tecnología básica como el MCU, por lo que usar la FPU no debe soplar su presupuesto de alimentación.
Vamos a profundizar en la aplicación de FPU para ver lo que trae a la caja de herramientas del programador incrustado.
El Kinetis K70 FPU de cerca
El FPU Kinetis implementa la extensión de punto flotante del perfil de la arquitectura ARMv7-M. Esta extensión agrega las instrucciones de un solo punto flotante de precisión para el conjunto del pulgar ARMv7-M de instrucciones.
La FPU se compone de un banco de registros dedicados compuesto de 32 registros. El acceso a estos registros está disponible sólo a través de las instrucciones de punto flotante. Los registros son de 32 bits de tamaño y se puede acceder a las palabras (32 bits), o una combinación de dos en dos para formar dieciséis doble (64 bits) registros. Véase la figura 1. El uso ARMv7-M instrucciones registros S0 a S31 para realizar con precisión simple (32 bits) aritmética de punto flotante en hardware. La precisión de un solo operaciones de coma flotante y tipos de datos cumplen con el estándar IEEE 754 estándar de punto flotante.
La palabra doble registro de configuración (registros D0 a D15) puede contener de 64 bits con signo y sin signo, y las instrucciones de carga / almacenamiento apoyar las transferencias de enteros de 64 bits y la memoria. Sin embargo, la FPU Cortex-M4 no ofrece soporte de hardware para punto flotante de doble precisión de las operaciones.
Figura 1. El FPU Kinetis registros.
Cuando la precisión numérica de un diseño no es tan riguroso, el FPU también es compatible con una media de precisión de formato (16-bit) de punto flotante que se ajusta a la norma IEEE 754-2008 estándar. Tenga en cuenta que el FPU realiza todas las operaciones aritméticas de punto flotante de precisión simple de precisión, y luego las instrucciones de conversión de gestionar las traducciones entre los enteros, de media, y de precisión simple de formatos. Algunas de las características poco utilizadas que no se apliquen por la norma, como el resto, binario a decimal, y las operaciones de decimal a binario. Para obtener información detallada sobre este comportamiento y otras características de FPU, consulte la Guía de Cortex-M4 Dispositivos de usuario genérico o el ARMv7-M Arquitectura Reference Manual , que está disponible para usuarios registrados del Centro de Información de ARM .
Modelo de programador
La FPU se desactiva cuando el MCU se reinicia. Para activarlo, debe escribir código privilegiado los bits apropiados en el Registro de Control de Acceso coprocesador (CPACR). Estos bits permiten la FPU, y especificar si es accesible sólo para el código de privilegio o de los códigos privilegiados y no privilegiados.Detalles sobre el procedimiento se puede encontrar en el Centro de Información ARM aquí .
A 32-bit de punto flotante de estado y de control de registro (FPSCR) controla la FPU, monitorea los resultados de las operaciones aritméticas, y ayuda a responder a las excepciones que se producen. Por ejemplo, puede especificar el modo de redondeo (hay cuatro tipos) que las instrucciones de punto flotante de uso durante los cálculos aritméticos. Véase la figura 2. Tenga en cuenta que los indicadores de código de condición en este registro se refieren sólo al resultado de instrucciones de punto flotante, para la aritmética convencional entero es necesario comprobar los indicadores de código de condición en el estado de la solicitud Registro de programa (APSR). El FPSCR no es de asignación de memoria, y en cambio se accede mediante instrucciones especiales de FPU.
Figura 2. Los detalles de la FPSCR, que se utiliza para controlar y supervisar las operaciones de FPU.
No se dedican de punto flotante de procesamiento de datos que manejan las instrucciones de las operaciones aritméticas habituales, tales como sumar, restar, multiplicar, dividir y raíz cuadrada. Un conjunto de multiplicaciones (MAC) y multiplicar-restar las instrucciones, además de cargar / guardar las instrucciones que pueden transferir un máximo de dieciséis palabras consecutivas a la vez, se puede acelerar y simplificar la escritura de ciertas funciones de procesamiento de señales.
Mientras que usted puede utilizar estas instrucciones de montaje para escribir algoritmos de coma flotante, el CodeWarrior para MCUs Kinetis proporcionar herramientas de construcción de alto nivel C / C + + lenguaje de programación para apoyar la FPU. El compilador admite un solo punto flotante de precisión los tipos de datos y la aritmética. Sólo tiene que escribir el algoritmo en C o C + +, compruebe que el compilador de punto flotante opción de soporte está en generar las instrucciones de hardware, y luego construir su aplicación.Tenga en cuenta que hay que añadir la "F" a cualquier sufijo constantes numéricas en su código (por ejemplo, 2.71828F) para que el compilador los trata como valores de precisión simple. Si no lo hacen, el nivel C requiere que sean tratados como valores de doble precisión, lo que genera las llamadas a las bibliotecas de software en lugar de utilizar el nativo de instrucciones FPU.
La extensión ARMv7-M admite el control de FPU no interceptadas de punto flotante de excepciones. Es decir, cuando un error aritmético plantea una bandera de excepción en el FPSCR, no desencadena un controlador de excepciones basadas en hardware. Esto es útil cuando se produce un desbordamiento o inexacta excepción se produce durante un cálculo en curso. En estos casos, el cálculo todavía puede dar un resultado válido, a pesar de que tiene menos precisión. Cuando sea necesario, por ejemplo para una división por cero excepción, puede escribir código que detecta la excepción y se invoca una llamada al sistema (SVC) de instrucciones. La instrucción SVC se inicia un controlador de excepciones. El núcleo ARMv7-M en práctica su manejo de excepciones como estándar de C / C + +, lo que le permite escribir el código del controlador que responde a la excepción en un lenguaje de alto nivel.
Resultados rápidos
Por supuesto, mientras todo esto suena bien en teoría, ¿en qué medida la FPU resultados en la práctica? Un ejemplo de aplicación fue escrita en C que utiliza varias técnicas diferentes para calcular el valor de pi. El primer método es simplemente dividir dos números (355/113) para obtener un valor cercano a pi. El segundo utiliza la serie de Gregory-Leibniz con 32 términos para el cálculo de pi. La tercera técnica utiliza una versión modificada de Gregory-Leibniz serie con 26 términos acelerarse utilizando el método de Euler para las sumas parciales y la transformación de Van Wijngaarden. El CodeWarrior para MCUs v10 Kinetis compilador tiene su nivel de optimización establece en 4. El tiempo transcurrido se mide por el número de relojes de bus MCU necesario para completar el cálculo. El programa de ejemplo ejecutado en 120 MHz MCU K70. Los resultados se muestran en la tabla 1.
Huelga decir que la FPU se acelera en coma flotante de manera significativa. Como de costumbre, a veces hay ventajas y desventajas, incluso cuando una FPU ofrece una asistencia. Como la cuenta del reloj MCU indica, mientras que la técnica de Euler tuvo un algoritmo de procesamiento más complejo, el resultado fue mucho más preciso que el de la serie de Leibnitz, que converge gradualmente hacia el valor de pi. Sin embargo, la FPU podado más de 9000 ciclos de la técnica de Euler, lo que incrementa el rendimiento del algoritmo en seis ocasiones.
Otro beneficio de la FPU, además de la velocidad de procesamiento es que puede reducir el consumo de energía. Debido a que el MCU termina el trabajo más rápidamente, puede entrar en un modo de ahorro de bajo consumo de energía antes. Por último, tenga en cuenta que todas las partes Kinetis mencionados aquí vienen equipados con un DSP como una parte estándar del núcleo. Si la exactitud de sus cálculos son modestas pero requieren un alto rendimiento, el DSP puede ser ejercida sobre el problema. Lo importante es que el Kinetis rentable partes MCU ofrecen una amplia variedad de opciones en términos de soluciones que requieren de extensos cálculos aritméticos. A pesar de que la aritmética de las necesidades de los diferentes diseños de productos puede variar, como se puede ver que hay una parte de Freescale que pueden satisfacer sus necesidades.
No hay comentarios:
Publicar un comentario