Compilador PCW CCS

Vamos a ver en este tutorial algunas características que presenta el compilador PCW CCS y que hacen de él una buena opción para elegirlo como compilador de C para programar Micro controladores PIC. Descripción de la publicación.

MICROCONTROLADORES

Biblioman

3/18/20097 min read

Algunas de esas características son:

  • Al compilar genera un código máquina muy compacto y eficiente.

  • Se integra perfectamente con MPLAB y otros simuladores/emuladores como PROTEUS para el proceso de depuración.

  • Incluye una biblioteca muy completa de funciones precompiladas para el acceso al hardware de los dispositivos (entrada/salida, temporizaciones, conversor A/D, transmisión RS-232,bus I2C….,etc.

  • Incorpora drivers para dispositivos externos, tales como pantallas LCD, teclados numéricos, memorias EEPROM, conversores A/D, relojes en tiempo real, etc.(los drivers son pequeños programas que sirven de interfaz entre los dispositivos hardware y nuestro programa).

  • Permite insertar partes de código directamente en Ensamblador, manteniendo otras partes del programa en C.

Características del lenguaje C para este compilador

El lenguaje C estándar es independiente de cualquier plataforma. Sin embargo, para la programación de microcontroladores es necesario disponer de determinados comandos que se refieran a partes específicas de su hardware, como el acceso a memoria, temporizadores, etc. Por este motivo, además de los comandos, funciones y datos del lenguaje ANSI C, el compilador PCW incluye bibliotecas que incorporan determinados comandos que no son estándar, sino específicos para la familia de microcontroladores PIC. Éstos son básicamente de dos tipos: directivas del preprocesador y funciones precompiladas

Directivas del preprocesador.

El compilador PCW dispone de 7 tipos básicos de directivas:

  • Directivas derivadas del estándar de C, que permiten, entre otras funciones, un control básico del código y del flujo en el proceso de compilación:

#DEFINE

#ELIF

#ELSE

#ENDIF

#ERROR

#IF

#IFDEF

#IFNDEF

#INCLUDE

#LIST

#NOLIST

#PRAGMA

#UNDEF

  • Directivas asociadas a las bibliotecas precompiladas, que proporcionan al compilador información relacionada con estas bibliotecas:

#USE DELAY

#USE FAST_IO

#USE FIXED_IO

#USE I2C

#USE RS232

#USE STANDARD_IO

  • Directivas relacionadas con la especificación del dispositivo, por un lado, para definir los mapas de memoria y el juego de instrucciones, y por otro, incluir información necesaria para la programación del dispositivo en los ficheros de salida de la compilación:

#DEVICE

#ID

#FUSES

#TYPE

  • Directivas de cualificación de funciones, para identificar características especiales de una función:

#INLINE

#INT_DEFAULT

#INT_GLOBAL

#INT_xxxxx

#SEPARATE

  • Directivas de control del compilador, para definir opciones referidas a la compilación del código del programa:

#CASE

#OPT

#ORG

#PRIORITY

  • Directivas de control de la memoria del microcontrolador, para gestionar y reservar el uso de determinadas zonas de memoria para variables:

#ASM

#BIT

#BYTE

#ENDASM

#LOCATE

#RESERVE

#ROM

#ZERO_RAM

  • Identificadores predefinidos. Todas las directivas citadas hasta ahora, son comandos destinados a ser interpretados por el compilador, no por el microcontrolador. Dentro del término genérico de directiva se incluyen, además de estos comandos, unas variables que contienen información sobre el proceso de compilación. Estas variables son lo que se denominan identificadores predefinidos del compilador:

DATE

DEVICE

PCB

PCH

PCM

En un programa, las directivas se reconocen fácilmente porque comienzan por el símbolo #, mientras que los identificadores empiezan y acaban por doble subrayado (__).

Funciones precompiladas.

Se puede facilitar considerablemente la tarea de programación si no es necesario construir por nosotros mismos aquellas funciones que son de utilización más frecuente, como leer la entrada de un teclado o imprimir un determinado mensaje en una pantalla LCD conectada como salida.

Existen funciones en C incluidas en el compilador PCW para manejar los diferentes recursos del microcontrolador, desde el bus I2C hasta el conversor A/D.

Utilidades adicionales

El entorno PCW incluye, además del IDE y del compilador, una serie de utilidades adicionales con las que se amplían las posibilidades de éste, y que se encuentran en los menús View y Tools de la barra de menús, veamos algunas de ellas:

  • Monitor del puerto serie: Consiste en un terminal que monitoriza la entrada y la salida del puerto serie del computador.

  • Selección de dispositivos (Device Selection Tool): Esta utilidad consta de una base de datos con los dispositivos que puede programar el compilador, incluyendo todas sus características hardware, de manera que se puede emplear para buscar aquellos dispositivos que cumplan una serie de propiedades comunes.

  • Editor de dispositivos (Device Editor): Este programa también emplea la base de datos de dispositivos, y permite editar los componentes para modificar sus características hardware, así como añadir nuevos dispositivos o eliminar algunos de ellos.

  • Conversor numérico: Esta utilidad realiza conversiones entre los tipos de datos unsigned, signed, hex y float.

  • Extracción de datos de calibrado: Esta opción permite leer los datos de calibración existentes en la memoria de programa de un determinado dispositivo. Estos datos contienen información particular de cada microcontrolador a su salida de fábrica, y se refieren a posibles problemas especiales que pudieran haber tenido lugar durante el desarrollo y fabricación. Mediante esta opción es posible leer estos datos y grabarlos en un fichero .H o .C que incorporará una directiva #ROM para dicho dispositivo, con lo que cada vez que se programe el microcontrolador se incluirán estos datos de calibrado.

  • Desensamblador: Esta opción lee un fichero en Código máquina y lo traduce a su equivalente en Ensamblador, con lo que se podría insertar este código en un programa en C, mediante las directivas #ASM y #ENDASM.

Puede que haya alguna herramienta de mas o de menos, eso dependerá de la versión de compilador que estemos utilizando


Ahora vamos a ver alunas consideraciones a tener en cuenta cuando vayamos a programar:


En el tutorial que estamos siguiendo sobre programación de Microcontroladores en lenguaje C Hemos visto como hacer algunos ejemplos en C (la verdad es que pocos de momento), pero no hemos visto nada sobre aspectos de optimización de los programas. La optimización suele ser necesaria en muchas ocasiones, puesto que la memoria del microcontrolador es un recurso escaso, y puede ocurrir que un programa que en un principio ocupa una cantidad de memoria mayor que la disponible, tras una optimización del código reduzca su tamaño de manera que sí pueda programarse. A continuación se indican algunas de las características que incorpora el compilador sobre este aspecto:

  • Inserción de código Ensamblador: Mediante las directivas #ASM y #ENDASM es posible insertar código Ensamblador directamente en el código C, con lo que determinados procedimientos se pueden implementar directamente en Ensamblador, con el ahorro de código y tiempo de ejecución que ello implica.

  • Gestión automática de páginas de código: los microcontroladores PIC disponen de varias páginas de memoria de programa, lo que en la programación manual supone tener en cuenta si los saltos se producen a otra página de código diferente de la activa, y modificar las páginas de código según corresponda, ( y si no que se lo digan a los que programan en Ensamblador). Este aspecto es gestionado de manera automática por el compilador, el cual, de manera transparente al usuario, insertará las instrucciones necesarias para el cambio de página de código. Además, durante el proceso de enlazado se analiza el código objeto, de manera que aquellas funciones que son llamadas frecuentemente son situadas en la misma página de código que la función que las llama, disminuyendo de este modo el tamaño del código y el retardo producido por la llamada a la función.

  • Gestión automática de bancos de memoria: El compilador también gestiona de manera automática el cambio entre bancos de memoria RAM, y trata de minimizar el cambio entre bancos, intentando agrupar las variables locales utilizadas en cada función dentro de un mismo banco.

  • Mapeo de la memoria del microcontrolador desde el código C: Las directivas #BIT y #BYTE permiten asignar variables del código C a determinadas direcciones de la memoria del microcontrolador, evitando de este modo que el compilador asigne automáticamente variables a zonas de memoria que interesa mantener libres. Esta característica también se puede realizar con otros tipos de datos, como las estructuras.

  • Mapeo de tipos de datos de tamaño bit: El compilador permite utilizar datos de tamaño 1, 8 y 16 bits, y 32 bits en notación de coma flotante. De estos datos, especial interés tienen los datos de tamaño 1 bit (tipo Short Int), que permite utilizar de manera muy eficiente la memoria del microcontrolador. Por ejemplo, en lugar de utilizar una variable de tipo #BYTE para implementar un indicador o flag, es posible utilizar una variable de tipo #BIT, con lo que la memoria ocupada es menor y el código relacionado con esta variable se optimiza. Además, las estructuras y uniones también permiten definir campos de bits, optimizando el almacenamiento de información de estos tipos de datos.

  • Almacenamiento de constantes en memoria de programa: Los tipos de datos constantes, las cadenas de texto y las matrices o arrays son almacenados en la memoria de programa del microcontrolador, en lugar de en la memoria de datos. Como consecuencia, y debido a la arquitectura Harvard de los PIC, en la que los segmentos de memoria de programa y datos son independientes, no es posible tratar las zonas de memoria de programa como datos, por lo que no se permite el empleo de punteros a arrays de constantes, ni tampoco a funciones, una nota a tener en cuenta para los que saben programar en C, pero desconocen las características de este compilador.

  • Soporte de punteros y referencias: El compilador PCW permite el uso de punteros de 8 y 16 bits. Además, también permite el paso de parámetros por referencia de variables, lo que proporciona la misma potencia que los punteros, mejorando al mismo tiempo la legibilidad del código (esto lo veremos con ejemplos en el curso de C).

  • Eficiente implementación de variables y funciones: La eficiencia de los algoritmos de optimización empleados en este compilador permite que, en el caso de las variables, éstas sean asignadas a zonas de memoria que se emplee la menor memoria posible de forma global, reutilizando para ello posiciones de memoria. Por ejemplo, el compilador asigna de manera automática a una misma dirección de memoria varias variables definidas como locales en funciones diferentes a main, ya que en ningún momento podrá existir más de una de estas variables de manera simultánea, pues su valor dejará de existir al salir de la función donde se encuentran definidas. En cuanto a las funciones, es posible realizar anidaciones de funciones en niveles más profundos que el permitido por la pila hardware, debido a una implementación eficiente de las llamadas a estas funciones.

  • Generación del código estrictamente necesario: En la compilación del código objeto final sólo se incluyen aquellas funciones de las bibliotecas precompiladas que son utilizadas en el programa. De la misma forma, las funciones de usuario que no son llamadas nunca y las sentencias que no se pueden utilizar debido a la lógica del programa no son incluidas en el código precompilado.

Bibliografía utilizada en este articulo:

C Compiler Reference Manual Version 4 podeis descargarlo desde aquí

Apuntes Diseño y programación de Microrrobots (UPCT).