Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Octubre - 2011
Octubre - 2011
1 / 57
Indice I
1 2
Introducci on Conceptos b asicos del lenguaje C Hello, world! Directivas de pre-procesador Variables y tipos de datos Generalidades Tipos de datos Derivados Tama nos de los tipos de datos Operadores Generalidades Precedencia de operadores Estructuras de control de ujo Condicionales Repetitivas Funciones
Conceptos b asicos del lenguaje C Octubre - 2011 2 / 57
Indice II
Forma general Retorno Parametros
Strings Denici on
Octubre - 2011
3 / 57
Introducci on
Introducci on
El objetivo de esta clase es repasar los conceptos claves del lenguaje C que utilizaremos a lo largo del Seminario de Sistemas Embebidos. Para una referencia completa del lenguaje se recomienda consultar: The C Programming Language: Kernighan; Dennis M. Ritchie (March 1988)
En esta presentaci on solo se utilizar an aquellas funciones y estructuras del lenguaje que se utilizan con m as frecuencia para la programaci on de microcontroladores. No es una denici on completa del lenguaje desde ning un punto de vista.
Octubre - 2011
4 / 57
Hello, world!
Hello, World!
La estructura b asica de un programa en C se puede ver en el siguiente ejemplo:
Octubre - 2011
5 / 57
Hello, world!
Hello, World!
Donde lo primero que nos encontramos es una directiva del pre-procesador: el Include.
#i n c l u d e < s t d i o . h>
Esta directiva, insertar a de manera exacta el contenido del archivo stdio.h al comienzo de nuestro programa. Notar la diferencia de utilizar: Par entesis angulares <> Comillas dobles
Octubre - 2011
6 / 57
Hello, world!
Hello, World!
Luego nos encontramos con la implementaci on de una funci on. En este caso el main que debe existir en toda aplicaci on escrita en lenguaje C. Una funci on se declara de la siguiente manera:
[ t i p o de d a t o de r e t o r n o ] nombre ( [ param1 ] , [ param2 ] , . . . ) { // I m p l e m e n t a c i o n }
Octubre - 2011
7 / 57
Hello, world!
Hello, World!
Y por u ltimo nos encontramos con una llamada a una funci on a la que se le pasa un par ametro, comentarios, y la sentencia return. Algunas cosas importantes a tener en cuenta: Los bloques de c odigo deben ir entre llaves { } Las sentencias deben terminarse en punto y coma ; Unicidad del main()
Octubre - 2011
8 / 57
Directivas de pre-procesador
#i n c l u d e
l e d D r i v e r s . h
Octubre - 2011
9 / 57
Generalidades
Las variables son los elementos son los elementos b asicos contenedores de datos de un programa. Deben tener un tipo especico seg un el contenido que almacenaran y con los operadores podremos actuar sobre ellas.
Octubre - 2011
10 / 57
Tipos de datos
Existen pocos tipos de datos nativos desde la primera versi on del lenguaje. Luego se agregaron nuevos para facilitar su uso. char: puede almacenar un caracter (ASCII). int: puede almacenar un numero entero. oat: almacena un numero real representado en punto otante de precisi on simple. double: similar al oat pero de doble precisi on.
Octubre - 2011
11 / 57
Tipos de datos
Modicadores y calicadores
Los modicadores permiten alterar el tipo de variables de alguna u otra manera. Algunos com unmente usados son: signed y unsigned long y short Los calicadores son: const: signica que su contenido no se podr a alterar. volatile: le indican al compilador que tiene propiedades especiales para tener en cuenta en la optimizaci on.
Octubre - 2011
12 / 57
Tipos de datos
Declaraci on de variables
Se pueden utilizar las siguientes formas de declaraci on con y sin inicializaci on:
int valor ; unsigned i n t valor2 , v a l o r 3 ; f l o a t Kp = 0 . 4 5 4 ; i n t a , b =5; char l e t r a = Z ;
Octubre - 2011
13 / 57
Tipos de datos
Alcance (scope)
Una variable se dice que puede ser: Local si est a declarada dentro de una funci on o bloque de c odigo
Global si est a declarada fuera de toda funci on. Las variables globales pueden ser accedidas por cualquier funci on o bloque de c odigo, mientras que las locales, solo dentro del entorno que fue creada.
Octubre - 2011
14 / 57
Derivados
Derivados
Existen tambi en los tipos derivados. Estos son: Arreglos (arrays) Estructuras Tipos enumerativos Punteros
Octubre - 2011
15 / 57
Derivados
Arreglos
Los arreglos son contenedores de m ultiples variables contiguas del mismo tipo. Son de acceso aleatorio y se los puede acceder f acilmente en cualquier posici on. Su declaraci on es la siguiente:
Octubre - 2011
16 / 57
Derivados
Estructuras
Las estructuras son tipos de datos creados por el usuario que contienen uno o m as tipos de datos (nativos o creados por el usuario). Por ejemplo, si queremos almacenar diferentes datos de una persona, ser a u til posiblemente tener un tipo de dato persona que tenga los siguientes atributos: nombre edad altura peso
Octubre - 2011
17 / 57
Derivados
Estructuras
Para declarar este tipo de datos nuevo, se debe utilizar la siguiente sintaxis:
typedef struct { c h a r name [ 1 0 0 ] ; u n s i g n e d i n t a ge ; float height ; f l o a t weight ; }user t ;
En realidad, el typedef y el struct no necesariamente deben ir juntos, pero por comodidad se lo suele utilizar as .
Alan Kharsansky (akharsa@gmail.com) () Conceptos b asicos del lenguaje C Octubre - 2011 18 / 57
Derivados
Tipos enumerativos
Los tipos enumerativos solo admiten una cantidad nita de posibles valores. Se los suele utilizar cuando se busca que una variable solo pueda tomar determinados valores como ser: TRUE y FALSE, los d as de la semana, colores, etc. Para declararlos se usa la siguiente sintaxis:
t y p e d e f enum {TRUE, FALSE } b o o l e a n t ;
El compilador utilizar a alguna representaci on para el TRUE y otra para el FALSE, pero el programador no debe preocuparse por ello. Para declarar una variable se puede usar el siguiente fragmento de c odigo:
b o o l e a n t showDebug = FALSE ;
Octubre - 2011
19 / 57
Derivados
Punteros
Los punteros son variables que no contienen datos sino posiciones de memoria, muy com unmente de otras variables. Para declararlas se utiliza el s mbolo asterisco * y se declaran de la siguiente manera:
i n t p1 ; c h a r msg ; // p1 e s un p u n t e r o a un i n t // msg e s un p u n t e r o a un c h a r
Octubre - 2011
20 / 57
Es l ogico pensar que si un char debe contener un caracter ASCII entonces el mismo debe poder almacenar 8 bits. Un oat que cumpla con la norma IEEE-754 debe tener 32 bits para simple precisi on y 64 bits para doble precisi on. El int generalmente se reere a que usa la palabra del sistema entera. Entonces es esperable que en un microcontrolador de 32 bits, el int ocupe 32 bits. Pero en uno de 8?
Octubre - 2011
21 / 57
En general este problema no es tomado muy en cuenta cuando se dise na software para PC, pero en embebidos esto puede traer problemas de portabilidad. Los tama nos de las variables no son necesariamente respetadas por los compiladores, por eso surge en en el standard C99 el stdint.h
Octubre - 2011
22 / 57
stdint.h
En el archivo de cabecera stdint.h se declaran los siguientes tipos de datos de tama no exacto de bits y que son respetados por todos los compiladores C99:
Tipo int8 t uint8 t int16 t uint16 t int32 t uint32 t int64 t uint64 t Singado Signed Unsigned Signed Unsigned Signed Unsigned Signed Unsigned Bits 8 8 16 16 32 32 64 64 Bytes 1 1 2 2 4 4 8 8
Octubre - 2011
23 / 57
Operadores
Generalidades
Operadores
Los operadores permiten operar, modicar y consultar el valor de las variables. Una manera de categorizarlos es por su funci on: aritm eticos de asignaci on l ogicos y relacionales operadores de bits de acceso pperadore de punteros
Octubre - 2011
24 / 57
Operadores
Generalidades
y = m x + b ; b++; m;
Octubre - 2011
25 / 57
Operadores
Generalidades
Operadores de asignaci on
Octubre - 2011
26 / 57
Operadores
Generalidades
L ogicos y relacionales
Estos operadores se eval uan y pueden devolver solo verdadero o falso mediante un 1 o un 0 respectivamente.
Octubre - 2011
27 / 57
Operadores
Generalidades
Operadores de bits
Los operadores de bit operan bit a bit de cada variable, sin importar su tipo. Estos son: & (AND), | (OR), (XOR), << (left shift), >> (right shift), (NOT)
int flags ;
Octubre - 2011
28 / 57
Operadores
Generalidades
Operadores de acceso
Los operadores punto (.) y llaves ([ ]) permiten acceder a miembros de una estructura y de un arreglo respectivamente. Por ejemplo:
user t user ; float coefs [10]; u s e r . age = 4 3 ; user . height = 1.89; c o e f [ 0 ] = u s e r . age u s e r . h e i g h t ;
Octubre - 2011
29 / 57
Operadores
Generalidades
Operadores de punteros
Los operadores * y & son utilizados para punteros. *: lo apuntado por &: la direcci on de memoria de Por ejemplo:
int a = 10; i n t pa ; pa = &a ; pa = 2 0 ;
Octubre - 2011
30 / 57
Operadores
Precedencia de operadores
Precedencia de operadores
34+5 17 o 27?
Octubre - 2011
31 / 57
Operadores
Precedencia de operadores
Precedencia de operadores
Todos sabemos que primero se eval ua lo que esta entre los operadores + y - y luego estos u ltimos. Pero, esta sintaxis Qu e pregunta?
i f ( x & MASK == 0 x55 )
Si no sabemos que orden de precedencia (evaluaci on) tienen los operadores, no podemos estar seguros de que se va a evaluar x&MASK y luego se preguntar a si es igual a 0x55 o primero se preguntara si la mascara MASK es 0x55 y luego se hace una AND con x.
Octubre - 2011
32 / 57
Operadores
Precedencia de operadores
Precedencia de operadores
La soluci on m as segura es utilizar siempre par entesis en las expresiones para evaluarlas. Esto no agrega ning un peso (overhead) adicional al c odigo, y permite estar seguros de la evaluaci on.
i f ( ( x & MASK) == 0 x55 )
Octubre - 2011
33 / 57
Operadores
Precedencia de operadores
Precedencia de operadores
El estandar C tiene denida una tabla de precedencias:
Operators () [] > . ! ++ + - *(type)sizeof *, /, % +, <<, >> <, <=, >, >= == != & && || ?: = += -= *= /= %= &= = = <<= >>=
Alan Kharsansky (akharsa@gmail.com) () Conceptos b asicos del lenguaje C
Associativity left to right right to left left to right left to right left to right left to right left to right left to right left to right left to right left to right left to right right to left right to left
Octubre - 2011 34 / 57
Control de ujo
Mediante el control de ujo, el programador puede hacer que el c odigo ejecute de manera condicional o repetitiva diferente a una ejecuci on secuencial pura.
Octubre - 2011
35 / 57
Condicionales
Estructuras condicionales - If
La estructura IF permite evaluar la condici on de verdad de una expresi on (que devuelve verdadero (1) o falso (0)). Su sintaxis en su forma m as general es:
i f ( CONDICION1 ) { \\ B l o q u e a e j e c u t a r } else i f ( CONDICION2 ) { s i s e cumple l a c o n d i c i o n 2 s i s e cumple l a c o n d i c i o n 1
\\ B l o q u e a e j e c u t a r } else i f ( CONDICION3 ) {
\\ B l o q u e a e j e c u t a r } else { \\ B l o q u e a e j e c u t a r }
Alan Kharsansky (akharsa@gmail.com) ()
s i s e cumple l a c o n d i c i o n 2
s i no s e cumplen l a s c o n d i c i o n e s 1 , 2 n i 3
Octubre - 2011
36 / 57
Condicionales
Estructuras condicionales - If
Por ejemplo:
i f ( ( a >= 6 5 ) && ( a <=90){ printf ( la } else l e t r a es mayuscula ) ;
printf ( la }
Octubre - 2011
37 / 57
Condicionales
El comando Switch permite comparar una variable contra diferentes valores enteros de manera m as compacta. Su sintaxis es:
switch ( expression ) { case expr : statements case expr : statements default : statements }
Para terminar un bloque, se utilza el comando break pero est e puede ser omitido si se quiere que dos condiciones utilicen el mismo c odigo.
Octubre - 2011
38 / 57
Condicionales
Para terminar un bloque, se utiliza el comando break pero est e puede ser omitido si se quiere que dos condiciones utilicen el mismo c odigo.
Octubre - 2011
39 / 57
Repetitivas
El While permite ejecutar un bloque de c odigo siempre que se cumpla una condici on. Su sintaxis es:
w h i l e ( CONDICION ) { // c o d i g o a e j e c u t a r }
Octubre - 2011
40 / 57
Repetitivas
Por ejemplo:
while (! pulsador ()){ prenderLed ( ) ; delay (100); apagarLed ( ) ; delay (100); }
Octubre - 2011
41 / 57
Repetitivas
La estructura for permite ejecutar un c odigo de manera similar al while, siempre que se cumpla una codici on pero agrega la posibilidad de incluir una inicializaci on que se realizar a una sola vez, y una operaci on luego de cada ciclo. Su sintaxis es:
f o r ( INIT ; CONDICION ; ACCION ) { // B l o q u e de c o d i g o a e j e c u t a r }
Octubre - 2011
42 / 57
Repetitivas
Por ejemplo:
for ( i = 0 ; i < 10 ; i++ ) { p r i n t f ( \% i \ r \ n , i ) ; }
Octubre - 2011
43 / 57
Funciones
Forma general
Funciones
Las funciones permiten dividir tareas grandes en peque nas partes. Algunas caracter sticas de las mismas son: Permiten la modularizaci on Separan la implementaci on del uso
Octubre - 2011
44 / 57
Funciones
Forma general
Funciones
En el lenguaje C, las funciones pueden y/o deben tener: un nombre u nico un tipo de valor de retorno par ametros Por ejemplo:
int value ; v a l u e = readAdcChannel ( 4 ) ;
readAdcChannel es el nombre de una funci on que recibe un solo par ametro (aparentemente entero) y devuelve por nombre un valor.
Octubre - 2011
45 / 57
Funciones
Forma general
Funciones
El prototipo de una funci on nos permite saber todos los datos necesarios para el usuario de la funci on. Para este caso podr a ser:
i n t readAdcChannel ( i n t ) ;
Y la implementaci on de la misma:
i n t r e a d A d c C h a n n e l ( i n t chan ) { ( ( chan >=0) \&\& ( chan <=9){ r e t u r n ADCVal ; } else { r e t u r n 1; } if }
Octubre - 2011
46 / 57
Funciones
Retorno
Funciones - Retorno
El retorno es la salida de una funci on: Cuando una funci on se dice que devuelve un valor por nombre signica que su nombre (m as los par ametros) se eval uan tomando un valor. El tipo de dato de retorno puede ser cualquier tipo de dato valido en el sistema (nativos y/o denidos por el usuario). La funci on debe usar la instrucci on return para devolver un resultado.
Octubre - 2011
47 / 57
Funciones
Parametros
Una funci on com unmente recibir a par ametros con los cuales operar. Estos par ametros pueden ser de cualquier tipo y una funci on puede tener la cantidad de par ametros que uno necesite. Conceptualmente existen dos maneras de pasarle un par ametro a una funci on: Por copia Por referencia (punteros)
Octubre - 2011
48 / 57
Funciones
Parametros
la variable a se copia a x y la variable b se copia a y. x e y son variables locales de la funci on y modicarlas no afecta el valor de a y b.
Alan Kharsansky (akharsa@gmail.com) () Conceptos b asicos del lenguaje C Octubre - 2011 49 / 57
Funciones
Parametros
Octubre - 2011
50 / 57
Funciones
Parametros
Octubre - 2011
51 / 57
Funciones
Parametros
Octubre - 2011
52 / 57
Punteros
Punteros y arrays
Punteros y arrays
Cuando se declara un arreglo de cualquier tipo, el nombre del arreglo es autom aticamente un puntero al primer elemento. Por ejemplo:
c h a r welcomeMsg [ ] = { System i s UARTSend ( welcomeMsg ) ; starting . . . };
Octubre - 2011
53 / 57
Punteros
Punteros a estructuras
Punteros a estructuras
Recordemos la estructura creada user t y supongamos una armemos una funci on que imprime sus campos con cierto formato:
typedef struct { c h a r name [ 1 0 0 ] ; u n s i g n e d i n t a ge ; float height ; f l o a t weight ; }user t ; u s e r t admin={ Pedro G o n z a l e s , 4 2 , 1 . 7 5 , 8 3 . 5 } ; p r i n t U s e r I n f o ( &admin ) ;
Octubre - 2011
54 / 57
Punteros
Punteros a estructuras
Punteros a estructuras
O lo que es lo mismo:
p r i n t U s e r I n f o ( u s e r t u ){ UARTSend ( u>name ) ; }
Octubre - 2011
55 / 57
Strings
Denici on
Strings
Los strings o cadenas de caracteres, como tipo de dato en si no existen. Pero si hay un convenci on en cuanto a su utilizaci on y decimos que: Un String en C es simplemente una cadena de caracteres (chars) terminadas en el car acter \0 (0 decimal). En C, al declarar un array de chars e inicializarlo, autom aticamente el compilador le agrega un 0 al nal. Es decir:
c h a r msg [ ] = { H o l a } ;
Es un arreglo de 5 elementos y el 5to es el 0. Al no ser un tipo nativo, se deben usar funciones para trabajar con strings ya sea para comparar, asignar, concatenar, etc. Estas funciones est an incluidas en la biblioteca string de C y su archivo de cabecera es el string.h.
Alan Kharsansky (akharsa@gmail.com) () Conceptos b asicos del lenguaje C Octubre - 2011 56 / 57
Strings
Denici on
FIN
Octubre - 2011
57 / 57