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