Test de Compiladores para microcontroladores PIC de gama media

La idea de realizar esta prueba a los compiladores más conocidos para microcontroladores PIC de gama media surgió hace unos meses, en el grupo de facebook Electrónica y Microcontroladores, ante la curiosidad por comprobar si el compilador experimental PicPas era tan eficiente como suponíamos. Entendiéndose como más eficaz, el que consiga un tamaño del ejecutable menor y usar menos memoria RAM del microcontrolador.

Cuanto mayor sea esta eficacia del compilador, más sencillo y económico será el microcontrolador necesario para ejecutar el código generado.

Para poder comparar la eficiencia de los distintos compiladores (comerciales y gratuitos) a los que teníamos acceso, se utilizó un código que podríamos denominar «patrón de medida«, mucho más complejo que el usado para manejar la típica secuencia de encendido y apagado de uno o varios diodos LED que a modo de demostración suelen utilizar todos los compiladores.

El programa (patrón de medida) se debe traducir de la manera más literal posible a cada uno de los lenguajes de programación (C, Pascal, BASIC) y los «dialectos» o particularidades específicas de cada compilador, de manera que no influya en la prueba el tipo de algoritmo más o menos eficaz, o la genialidad del programador para codificarlo en un determinado lenguaje. Por eso se trata de un «programa patrón de medida«, y es el compilador evaluado el que deberá, automáticamente, generar el código ejecutable más optimizado o que menos recursos del microcontrolador requiera.

Este programa consiste en un Reloj Digital totalmente operativo y funcional, con reconocimiento de años bisiestos, corrección automática de errores en valores numéricos de ajuste manual, etc., compilado para los microcontroladores PIC16F877A (el más popular) y PIC16F84A (el «padre» de todos los PICs de la familia). Este último, sólo cuando el compilador sea capaz de generar un ejecutable de menos de 1.75 KB (su máxima capacidad de almacenamiento de programa).

Las funciones básicas del reloj las realiza de manera extraordinariamente precisa el integrado DS1307, que se comunica mediante protocolo I2C con el microcontrolador. Dispone de tres pulsadores como dispositivos de entrada, para modificar la fecha y hora del reloj, y de un display LCD como salida.

La comunicación I2C se realiza mediante software (no se hace uso del posible hardware I2C integrado en el microcontrolador), por lo que es aplicable a cualquier PIC de gama media. Se utilizan instrucciones básicas para optimizar el tamaño del código. No se hace uso de las librerías que puedan acompañar a los distintos compiladores, ya que invalidarían la prueba debido a que no se conoce su nivel de optimización, y en ese caso, lo que se evaluaría sería la eficacia de la propia librería.

Si dispone de ella, la única librería del compilador utilizada por el programa es la que contiene la instrucción de espera delay_ms() o similar, por estar muy estandarizada en todos los compiladores y generar con todos ellos un código muy similar.

Para comprobar el correcto funcionamiento de los ejecutables generados por los distintos compiladores se ha empleado el simulador de Proteus. Podemos ver la simulación en el siguiente vídeo.

Descarga de ficheros con esquema y simulación en Proteus para PIC16F877A y para PIC16F84A.


Compiladores evaluados

En este repositorio están publicados los ficheros de código fuente y ejecutables .HEX generados por cada uno de los compiladores para los microcontroladores PIC16F877A y PIC16F87A.

Los resultados obtenidos han sido los siguientes (Memoria RAM + FLASH usada = Puntuación)

PIC16F877A

NOTA: Pulsa sobre el nombre del compilador para ver el código fuente, y sobre la puntuación para ver el ejecutable .HEX

PIC16F84A

  • XC8 (pago) (RAM: 27 / FLASH: 725 words) : 752
  • PICPAS (RAM: 33 bytes / FLASH: 809 words) : 842
  • PROTON IDE (RAM: 31 bytes / FLASH: 828 words) : 859
  • PIC MICRO PASCAL (RAM: 33 bytes / FLASH: 828 words) : 861
  • CCS C (RAM: 26 bytes / FLASH: 836 bytes) : 862
  • MIKROPASCAL (RAM: 35 bytes / FLASH: 935 words) : 970
  • GCBASIC (RAM: 45 bytes / FLASH: 925 words) : 970
  • MIKROC (RAM: 37 bytes / FLASH: 973 words) : 1010
  • XC8 (free) (No válido. FLASH > 1000 words) : 1092 (máxima RAM + FLASH)
  • SDCC (No válido. FLASH > 1000 words) : 1092 (máxima RAM + FLASH)


Resultado

Para obtener el resultado se ha sumado las memoria total RAM y FLASH usada por cada compilador en los dos microcontroladores evaluados (PIC16F877A y PIC16F84A). El ganador es el que obtiene un número menor (usa menos recursos = mayor optimización).

Clasificación Final:

  1. PICPAS v.0.8.1 (GRATUITO) : 1722    <— EL MEJOR
  2. XC8 v.1.35 (DE PAGO – Versión REGISTRADA) : 1757
  3. CCS C v.5.0.74 (DE PAGO) : 1767
  4. MIKROPASCAL v.7.1.0 (DE PAGO) : 1967
  5. GCBASIC v.0.97.01 (GRATUITO) : 1968
  6. PROTON IDE v.3.6.0.0 (GRATUITO para PIC más usuales) : 1981
  7. PIC MICRO PASCAL v.2.1.4 (GRATUITO) : 2045
  8. MIKROC V.7.0.0 (DE PAGO) : 2047
  9. XC8 v.1.43 (Versión FREE – GRATUITO) : 2542
  10. SDCC v.3.6.0 (GRATUITO) : 2977      <— EL PEOR


Conclusiones

  1. PicPas ha sido el ganador, aunque a mínima distancia de otros compiladores profesionales y mucho más completos. Sus competidores en la gama gratuita serían GCBASIC y Proton IDE (aunque este no es gratis para todos los PICs)
  2. Acaba con el mito de que la versión gratuita de XC8 funciona igual que la registrada (de pago). Tal y como anuncia el fabricante, es una mala opción para trabajos profesionales. Si quieres obtener buenos resultados tendrás que registrarlo y pagar.
  3. Programar microcontroladores en lenguaje C no tiene por qué ser más eficiente que hacerlo en Pascal o BASIC.
  4. Los autores del compilador SDCC para PIC, ya advierten de que se trata de una versión preliminar con el único objetivo de que funcione correctamente, y que dejan la optimización del código generado para próximas versiones.

NOTA: Más información y comentarios originales en: Segunda Comparativa de Compiladores Frente a PICPAS.

ACTUALIZACIONES:
10/03/2018: La versión 3.7 de SDCC no consigue ninguna mejora en el test. 😦
SDCC 3.7 (RAM: 45 bytes / FLASH: 1871 words) : 1916
SDCC 3.6 (RAM: 43 bytes / FLASH: 1842 words) : 1885
11/03/2018: La versión 0.8.4 de PicPac aumenta su ventaja. 🙂
PICPAS 0.8.4 (RAM: 26 bytes / FLASH: 770 words) : 796
PICPAS 0.8.1 (RAM: 33 bytes / FLASH: 847 words) : 880

Deja un comentario