Professional Documents
Culture Documents
Clase I - Introducción A C
Clase I - Introducción A C
Sistemas
Electrónicos
Programables
Introducción al
lenguaje de programación C
2
Sistemas Electrónicos Programables - 2do semestre 2021
El lenguaje de programación C
● Creado por Dennis Ritche en Bell Labs, 1972-1973
● Nació de la mano con el sistema operativo UNIX
● Es uno de los lenguajes de programación más
populares
● Permite acceso de bajo nivel a la memoria
● Tiene muchas variantes
● Basado en lenguaje B
3
Sistemas Electrónicos Programables - 2do semestre 2021
Ventajas de C
● Es pequeño (sólo 32 keywords)
● Es muy común
● Es estable (no cambia mucho)
● Corre rápido
● Es la base de muchos otros lenguajes
● Es uno de los más fáciles de aprender
4
Sistemas Electrónicos Programables - 2do semestre 2021
C vs. lenguajes de más bajo nivel
● C es una elección adecuada si:
○ No necesito un control absoluto sobre todos los recursos del MCU
○ No me preocupa mucho la potencia o la eficiencia de recursos (memoria)
○ Quiero hacer más fácil la programación y reusar código
● Usaré assembly si:
○ Necesito mucha eficiencia en uso de recursos
5
Sistemas Electrónicos Programables - 2do semestre 2021
Terminología
● Código fuente (source code): es el código del programa, es lo que se escribe para
programar
● Compilar (compile/build): convertir el código fuente en algo que la máquina pueda
entender
● Directiva de preprocesador: pre-procesa el código antes que el compilador
● Ejecutable: Programa compilado que puede correr en la máquina
● Biblioteca (library): Funciones que pueden ser agregadas al programa para ejecutar
ciertas tareas
● Encabezado (header file): Archivo .h incluido al principio del código fuente
○ Incluyen declaraciones (no definiciones) de funciones y macros
○ El código del .h es agregado al código fuente al compilar
6
Sistemas Electrónicos Programables - 2do semestre 2021
Constantes al compilar
● Es una directiva del preprocesador
● Cada vez que el compilador lee el nombre de la constante, lo reemplaza por la
expresión
● El compilador no reserva espacio en memoria para estas constantes
● Usualmente las escribimos en mayúsculas
Ejemplo:
9
Sistemas Electrónicos Programables - 2do semestre 2021
Tipos de variables
● En C debemos declarar los tipos de todas las variables
○ Con eso indicamos cuánta memoria ocupa cada una
○ Además evitamos errores de tipeo en los nombres
● Cada variable tiene un tipo y un nombre
● Las declaraciones de los tipos de variable van todas juntas al principio de main o de
una función
● Hay varios tipos: int, double, float, char, signed, unsigned, short,
const
● Diferentes tipos tienen diferentes espacios reservados en memoria
○ Se profundizará más adelante
● Sólo el compilador puede acceder a los registros del MSP430
10
Sistemas Electrónicos Programables - 2do semestre 2021
Tipos de variables en C para MSP430
11
Sistemas Electrónicos Programables - 2do semestre 2021
Nombres de variables
● Usamos cualquier nombre que no sea palabra reservada, usando letras, números y _
● Es importante elegir nombres buenos
12
Sistemas Electrónicos Programables - 2do semestre 2021
Tipo char
● char guarda un caracter ASCII (8 bits, número de 0 a 255)
● Podemos imprimir un char usando %c
● Un char lleva comillas simples - no dobles
● Ejemplo:
int main()
{
char a, b;
a= 'x'; /* Set a to the character x */
printf ("a is %c\n",a);
b= '\n'; /* This really is one character*/
printf ("b is %c\n",b);
return 0;
}
13
Sistemas Electrónicos Programables - 2do semestre 2021
Otros tipos
● unsigned indica que el int o char es sólo positivo
○ signed indica que puede ser positivo o negativo
● long indica que int, float o double tienen más precisión
○ short, en cambio, indica menos precisión
● const indica un parámetro - una variable que no cambia
○ útil en constantes físicas como pi o e
14
Sistemas Electrónicos Programables - 2do semestre 2021
Variable tipo static
● Indica al compilador que esa variable existe durante toda la vida de la aplicación
○ No debe ser borrada nunca
○ Incluso guardan su valor entre llamados a una misma función
○ El compilador asigna RAM a esa variable y no reasigna a otra variable
15
Sistemas Electrónicos Programables - 2do semestre 2021
Variable tipo volatile
● Indica al compilador que el contenido de esa ubicación de memoria puede cambiar
repentinamente, por ejemplo, entre dos instrucciones consecutivas
○ Esto podría ocurrir si la variable es global (visible por cualquier función) y una interrupción
puede cambiar su valor
○ Entonces el compilador no debe optimizar el programa creando copias de esa variable en
registros
○ Las variables tipo volatile tienen una única copia que es accesada por funciones como main y
también ISRs
● El compilador no optimizará variables volátiles
● Usar variables volátiles sólo si se espera que éstas cambien fuera del flujo del
programa main
16
Sistemas Electrónicos Programables - 2do semestre 2021
++ y --
● ++ i significa incrementa i y luego úsalo
● i++ significa úsalo y luego incrementa i
int i= 6;
printf ("%d\n",i++); /* Prints 6 sets i to 7 */
int i= 6;
printf ("%d\n",++i); /* prints 7 and sets i to 7 */
17
Sistemas Electrónicos Programables - 2do semestre 2021
Operadores aritméticos
Además de +, -, * y /, también usamos:
+=, -=, *=, /=, -- y % (modulo)
18
Sistemas Electrónicos Programables - 2do semestre 2021
Operadores relacionales
● == comprueba si dos variables son iguales
● != comprueba si dos variables son distintas
● > comprueba si una variable es mayor que otra
● < comprueba si una variable es menor que otra
● >= comprueba si una variable es mayor o igual que otra
● <= comprueba si una variable es menor o igual que otra
● en cambio, = es para asignar, no para comprobar igualdad!!!
19
Sistemas Electrónicos Programables - 2do semestre 2021
Operadores lógicos y bit a bit
● && (AND lógico) es 1 sólo si ambos operadores son distintos de 0
● || (OR lógico) es 0 sólo si ambos operadores son 0
● ! (NOT lógico)
● & (AND bit a bit) realiza un AND bit a bit entre los operandos
● | (OR bit a bit) realiza un OR bit a bit entre los operandos
● ^ (XOR bit a bit) realiza un XOR bit a bit entre los operandos
● ~ (NOT bit a bit) complementa el operando (complemento 1)
● << (shift left) realiza shift left sobre una variable, ej: A<<2
● >> (shift right)
20
Sistemas Electrónicos Programables - 2do semestre 2021
Veamos si hemos aprendido
¿Qué hacen las siguientes instrucciones?
P1DIR |= 0X04;
P1OUT |= (1<<2);
¿Y estas otras?
P2OUT = 8;
P2OUT ˆ= (1<<5);
21
Sistemas Electrónicos Programables - 2do semestre 2021
Casting
● Cast es una forma de hacer que una variable de un tipo parezca temporalmente de
otro tipo.
● Una razón para hacer cast es evitar que una división redondee enteros.
int a= 3;
int b= 4;
double c;
c = (double)a/(double)b;
22
Sistemas Electrónicos Programables - 2do semestre 2021
Condicional if-else
if (expresión a ser probada)
{
// Instrucciones ejecutadas si expr. es verdadera
}
23
Sistemas Electrónicos Programables - 2do semestre 2021
switch-case-break-default
switch (expresión)
{
case constant1:
// instrucciones
break; // sin el break, las expresiones de abajo son ejecutadas
case constant2:
// instrucciones
break;
...
default:
// instrucciones por defecto, opcional
}
24
Sistemas Electrónicos Programables - 2do semestre 2021
Loop for
Mejor veamos un ejemplo:
25
Sistemas Electrónicos Programables - 2do semestre 2021
Loop while y do while
while (testExpression)
{
// Instrucciones en el cuerpo del loop
}
---------------------------------------------
do
{
// Instrucciones -- se ejecutan al menos una vez
}
while (testExpression);
26
Sistemas Electrónicos Programables - 2do semestre 2021
Funciones (functions)
● Una función es una sub-unidad de un programa, y que ejecuta una tarea específica
○ Es una subrutina
● Ya vimos una función de la biblioteca de C - printf
● Debemos aprender a escribir nuestras propias funciones
● Las funciones toman argumentos (variables) y pueden retornar un argumento
27
Sistemas Electrónicos Programables - 2do semestre 2021
Ejemplo de función - máx entre dos números
#include <stdio.h>
int maximum (int, int); /* Prototipo - ya lo veremos más adelante */
int main(int argc, char*argv[]) /* Argumentos son de la línea de comandos */
{
int i= 4;
int j= 5;
int k;
k= maximum (i,j); /* Llama a la función maximum */
printf ("%d es el mayor entre %d y %d\n",k,i,j);
printf ("%d es el mayor entre %d y %d\n",maximum(3,5), 3, 5);
return 0;
}
int maximum (int a, int b) /* Encabezado de la función */
/* Retorna el entero más grande */
{
if (a > b)
return a; /* Retorna el resultado a si a>b */
return b; /* Retorna el resultado b en cualquier otro caso */
}
28
Sistemas Electrónicos Programables - 2do semestre 2021
Funciones que llaman a otras funciones
● Una función puede llamar a otra función
○ Dividir y conquistar
29
Sistemas Electrónicos Programables - 2do semestre 2021
Funciones void
No toman argumentos o no entregan resultado
30
Sistemas Electrónicos Programables - 2do semestre 2021
Acerca de las funciones
● Una función puede tomar cualquier número de argumentos mezclados de cualquier
forma
● Una función puede devolver a lo más un resultado
○ Hay formas de meter varios datos en un resultado mediante el uso de arreglos y estructuras
● Cuando volvemos de una función, los valores de los argumentos no cambian
○ La función crea una copia de los argumentos y actúa sobre la copia
○ Los cambios sobre la copia no son visibles fuera de la función
● Podemos declarar variables dentro de la función de la misma forma en que lo hacemos
en main()
○ Estas variables serán borradas al retornar de la función
31
Sistemas Electrónicos Programables - 2do semestre 2021
¿Dónde ponemos las funciones?
● En general, da lo mismo dónde las ponemos
● main() es una función al igual que cualquier otra, y de hecho podemos llamar a
main() desde otras funciones
● Es común que main() sea la primera función del código
● Las funciones deben estar completamente separadas unas de otras
● Los prototipos de las funciones deben ir antes de usar la función
● Lo típico es poner todos los prototipos, luego main y luego otras funciones
32
Sistemas Electrónicos Programables - 2do semestre 2021
¿Qué son los prototypes?
● El prototipo de una función le dice al compilador de C qué esperar de la función
○ Argumentos
○ Tipo de dato del valor de retorno
● Mejor ponerlos antes de main()
● #include encuentra los prototipos para las funciones de biblioteca (e.g., printf)
● Una función DEBE retornar el mismo tipo de variable que declaramos en el prototipo
33
Sistemas Electrónicos Programables - 2do semestre 2021
Ámbito o scope de una variable
● El ámbito o scope de una variable es donde puede ser usada dentro del programa
● Normalmente las variables tienen ámbito local
○ Esto significa que sólo pueden ser usadas en la función donde son declaradas
○ Recordemos que main() es una función
● También podemos declarar variables globales
● Si declaramos una variable fuera de una función, puede ser usada en cualquier función
escrita debajo de donde fue declarada
● Hay que tener precaución al usar variables globales.
○ Pueden complejizar el flujo del programa
○ Podría ser más difícil de depurar.
○ Podría ser más difícil de reutilizar un código.
○ Ocuparlas solo si es necesario.
34
Sistemas Electrónicos Programables - 2do semestre 2021
Para hacer debugging
● Una buena forma de hacer debugging o depuración es pensar como un computador
● Debes ir por todos los loops del programa y preguntarte por el valor de cada variable
en cada momento
● Cada vez que vas por un loop pregúntate si la condición del loop es cumplida, y si
debes seguir avanzando en el programa
35
Sistemas Electrónicos Programables - 2do semestre 2021
Otras técnicas para depurar
● Comprobar cierre de paréntesis y comas
○ el editor puede ayudar con los paréntesis
● Comprobar punto y coma al final de cada línea que lo necesita
● Pon algunos printf para saber qué está haciendo el programa
○ En el caso de un micro, podemos usar LEDs o escribir al puerto serial
● Trata de explicar el programa a otra persona
36
Sistemas Electrónicos Programables - 2do semestre 2021
Lecturas y referencias sugeridas
● Compilador de C online
● C de Kernighan y Ritchie, 2a edición
● Libro del curso cap. 5
37
Sistemas Electrónicos Programables - 2do semestre 2021