Tuesday, August 19, 2014

Introducción a C/C++ (Embedded C)








Conceptos básicos


Para la programación de microcontroladores se utiliza una “extensión” del lenguaje C, conocido como Embedded C (término en inglés). Se puede distinguir a Embedded C como un lenguaje orientado a hardware, ya que la forma de programar, aunque es similar que a un programa para un ordenador personal, está orientado al manejo de los pines I/O (Entradas y Salidas) de sistemas digitales como lo son los microcontroladores. Este lenguaje no está ligado en especial a ningún tipo de hardware ni software, y ésta es una de las características principales que lo distinguen; aunque está catalogado como un lenguaje de nivel-medio, también combina elementos de lenguajes de alto-nivel con la funcionalidad del lenguaje ensamblador.

Un programa en embedded C es un conjunto de instrucciones, que a la vez forman funciones; dichas funciones se combinan para juntas formar un programa que puede ser ejecutado en el sistema digital o hardware que se está programando. En todo código en C siempre debe de incluirse la función main() que es, la que por simple traducción, se ejecuta al inicio del programa (o es la que inicia dicho programa). Todas las funciones creadas en el programa son invocadas por la función main() , ya sea directa o indirectamente. La función main() es considerada como la función de más bajo nivel, debido a que es a primera en ejecutarse al iniciar un programa; esta función también puede ser la más corta en cuanto a código, ya que puede llamar a otras funciones que se encarguen de todo el proceso que se necesita para el fin propuesto del programa.
Como ejemplo de la forma base de un programa en embedded C:




int main(void)
{
    while(1); //Do forever
}


Aunque el código del programa de arriba está estructurado de una manera correcta, jamás nos daremos cuenta si está funcionando o no, ya que simplemente no hará nada. Ahora agregando algunas líneas de código veremos que nuestro programa de alguna forma u otra está funcionando.


#include <stdio.h>
int main(void)
{ // main() function starts here
 printf("Hello world!"); // Prints Hello world!
 while(1) //  Do forever
 {
 }
} // main() function finish here


El código del programa anterior imprime la cadena de caracteres Hello world! una vez que sería a la salida estándar, que puede ser alguna salida por un puerto serial y entrara al ciclo infinito; aprovechando también comenzaremos a introducir algunos conceptos básicos de un programa en C (Embedded C en su caso).

El código while(1) es conocido como ciclo infinito, esto por el parámetro 1 que esta entre paréntesis, esto debido a que en lógica digital, 1 es verdadero y 0 es falso. Siempre que while() tome como parámetro algo que sea verdadero (1, 5>2, 0==0) ejecutara el código que esté entre sus llaves de apertura y cierre.

La línea int main(void), indica el inicio del código en C y es encerrado entre sus llaves de apertura y cierre. Esta es la función que simplemente da inicio al programa y mantiene el código ejecutándose con la ayuda de while(1).

Las directivas del preprocesador siempre están marcadas con el símbolo gato” (#) y por lo general van en la parte superior del código, esta directiva nos ayuda a incluir librerías de código (código reusable), definir palabras confusas con algunas mas familiares, entre otras. En este caso, estamos introduciendo el uso de la directiva #include que nos sirve para la importación de código reusable a nuestro programa actual, la librería stdio.h que esta incluida en nuestro anterior ejemplo (#include <stdio.h>) contiene la función printf() que utilizamos en nuestro código para imprimir la cadena de palabras Hello world!. Sin esta librería incluida, al momento de compilar nos generaría error en la línea donde se encuentra printf() ya que la definición de esta función no estaría disponible debido a la falta de dicha librería.


A continuación definiremos algunos elementos clave del código y que nos servirá como base para los futuros programas:

;
Punto y coma: siempre al final de cada línea de código se debe de terminar con un  punto  y coma, ya que sin él, el compilador generaría error en todas las líneas (no incluye funciones). Ejemplo:

printf("Hello world!");

{…}
Llaves de apertura y cierre: Estas llaves son indispensables para que el compilador reconozca el inicio y fin de cada función o ciclo (en caso de requerirlas). Para las funciones es necesario incluirlas ya que sin ellas el compilador generaría error; para el caso de los ciclos, en caso de que sean de más de una línea de código dentro de ellos también es necesario incluirlas; si sólo tendrán una línea para ejecutar, no son necesarias incluirlas (tenga en cuenta que un código bien estructurado, es también un código fácil de leer y comprender). Ejemplo:

while(1)
{
}

“Algún texto”
Por lo general, para representar cualquier cadena de texto, es necesario encerrarlo entre comillas, ya que será la única forma que el compilador reconocerá que se trata de un texto y evitara la generación de errores. Ejemplo:

printf("Hello world!");

//
O
 /*…*/
Doble diagonal o diagonal-asterisco-asterisco-diagonal: Esto nos ayuda a poner comentarios en nuestros programas, ayudara a que cuando después de algún tiempo regreses a revisar el mismo código sepas para que servía cada línea. La doble diagonal (//) sirve para comentar por línea, es decir, al dar ENTER o pasar a otra línea, ya dejara de ser comentario. Diagonal-asterisco-asterisco-diagonal (/*…*/) sirve para comentarios multi-lineas, es decir, Diagonal-asterisco (/*) marcara el inicio del comentario mientras que Asterisco-diagonal (*/) nos servirá para terminar dicho comentario. Estos comentarios son ignorados por el compilador y nunca generaran error usándolos adecuadamente. Ejemplos:

// Este es un comentario que terminará al terminar esta línea

/* Este es un comentario multi-linea
y puede servir para dar definiciones largas,
describir la forma de usar el programa, etc */


Nota: Los comentarios nos ayudan a entender bien nuestro propio código y cuando lo generamos para terceras personas, siempre se toma como buenas prácticas de programación el usarlos en las líneas que más confusas se vean o en funciones que hagan alguna actividad especial que no se puede distinguir con solo leer el código. En el lenguaje embedded C debemos de tener en cuenta que no todos los microcontroladores tendrán los mismos nombres de puertos, ni el mismo número de pines; por lo tanto es recomendable ser directo y conciso con los comentarios.

No comments:

Post a Comment