Introducción al lenguaje C

Anuncio
Sistemas Embebidos para Tiempo Real
Laboratorio 1 - Introducción al lenguaje C (básico)
Resumen
Este laboratorio es introductorio al lenguaje C. El énfasis estará en los conceptos y no en las herramientas.
Se realizarán aplicaciones sencillas para fijar los conceptos básicos vistos en clase. Éstas correrán en la
propia computadora (no en hardware embebido).
El laboratorio debe ser completado por cada participante de la clase. Si bien se recomienda el intercambio
de ideas entre compañeros, es obligatorio que cada uno realice los trabajos en forma individual en su
computadora. Aquellos que ya posean conocimientos de lenguaje C y desarrollo de aplicaciones, podrán
asistir a sus compañeros.
Importante
•
Todo código generado debe seguir las pautas de estilo C, prestando particular atención a los
comentarios. En https://www.cs.swarthmore.edu/~newhall/unixhelp/c_codestyle.html se resumen
estos lineamientos.
•
La descripción de los laboratorios se hace en torno a la máquina virtual según se describe en el
instructivo en el EVA del curso.
•
La máquina virtual debe ser activada ANTES del laboratorio.
Objetivos
Objetivos generales
1. Describir conceptos básicos del lenguaje C.
2. Escribir correctamente programas simples.
3. Emplear herramientas para compilar y ejecutar dichos programas.
Objetivos particulares
1. Describir las diferentes etapas del proceso de compilación.
2. Utilizar los diferentes tipos de variables, asignando los modificadores y tipo de almacenamiento
apropiados.
3. Utilizar los diferentes operadores.
4. Emplear los diferentes tipos de formas de control de flujo.
5. Describir las diferentes partes de una función y la forma de llamada.
Material
•
•
Máquina virtual con las herramientas de software necesarias instaladas.
En caso de no querer trabajar con la máquina virtual del curso, es necesario contar con un editor de
texto (Notepad++, Gedit, Geany...) y con el compilador gcc
Actividades a Realizar
Comienzo del laboratorio
1. Inicie la máquina virtual del curso
2. Si todavía no lo ha hecho, cree una carpeta para guardar el trabajo de este laboratorio.
Creación/Edición de un programa sencillo.
1. Utilice el editor de texto incluído (Notepad++) para escribir un programa. Por ejemplo:
#include <stdio.h>
main()
{
printf("Hola mundo!\n");
}
2. Guardar el archivo con el nombre primer.c en la carpeta anteriormente creada.
Compilación/Ejecución de un programa
1. Abrir Cygwin Terminal, desde donde podremos ejecutar herramientas GNU
2. Posicionarse en la carpeta donde guardó el archivo primer.c. Gygwin replica la estructura del
disco C en el directorio /cygwin/c
3. Realizar la compilación (preprocesado/compilación/ensamblado/enlazado). Para ello escriba en
línea de comandos:
• gcc primer.c -o primer
4. Ejecutar el programa.
• ./primer
5. Verificar el correcto funcionamiento del mismo inspeccionando la salida. En nuestro caso se
imprimirá en pantalla:
• Hola mundo!
Observación:
•
No profundizaremos en el uso de la herramienta gcc ya que será utilizada solamente en los
laboratorios 1 y 2.
Nota: En las actividades siguientes se repetirá el procedimiento anterior para escribir, compilar y ejecutar los
programas indicados.
Variables
1. Considere el siguiente fragmento de código:
int a = 3;
int b = 10;
int sum;
sum = a + b;
printf("la suma de %d y %d da: %d",a,b,sum);
a) Incluir el fragmento anterior en un programa. Compilar y ejecutar el mismo.
b) Deducir como imprimir texto y números enteros.
c) Agregar la variable float div. Realizar la división de a entre b, guardando el resultado en div.
Para imprimir números flotantes utilizar %f en lugar de %d.
d) Verificar el funcionamiento del programa.
•
•
¿El resultado es el esperado?. En caso negativo busque una explicación y corrija el código
para obtener el resultado correcto.
¿Por qué es necesario realizar la conversión de int a float? ¿Es necesario en el caso
inverso?
2. Escriba un programa que reciba desde la entrada estándar (teclado en este caso) y ponga en la
salida estándar (pantalla) el carácter presionado, el carácter siguiente y el carácter precedente del
código ASCII. Utilizar las funciones char getchar() y putchar(char c)de la biblioteca stdio.
Luego imprimir el carácter ingresado con la función printf(), para ello utilizar %c. Finalmente
probar utilizar %d en lugar de %c. ¿Qué puede concluir?
Operadores
•
Los operadores binarios permiten manipular bits en tipos de dato enteros. Escribir un programa para
mostrar como poner a 1 o a 0 bits individuales de una palabra utilizando una máscara. Imprimir los
resultados en pantalla en hexadecimal (averiguar como). Conformar la máscara de dos maneras
diferentes:
1. utilizando un entero donde solamente está en 1 el bit a modificar.
2. especificando el bit mediante un entero y usando el operador << .
Arreglos
Escribir un pequeño programa que defina un arreglo y asigne valores a los elementos del mismo. Por
ejemplo, definir un arreglo de enteros y asignar a cada valor el índice del mismo, utilizando un for. Cambiar
el bucle for para modificar valores más allá de los límites del arreglo.
1. ¿Al compilar se indica un error del tipo “Arreglo fuera de rango”?
2. Pensar en la ubicación en memoria del arreglo y en función de ello trate de mostrar qué sucede al
escribir fuera del arreglo.
Control de flujo
Escriba un programa que modifique un arreglo de números flotantes según se especifique en un segundo
arreglo de enteros. Cada número flotante se divide por el número entero correspondiente (igual indice) y en
caso de ser nulo (el número entero) se deja incambiado. Los arreglos iniciales se definen explícitamente en
su declaración. Realizar dos versiones:
3. utilizando un ciclo while.
4. utilizando un ciclo for.
Funciones
Todo código ejecutable en C reside dentro de una función. La función main() es el punto de entrada al
programa, es decir, la ejecución del programa comienza siempre en la primera línea de dicha la función. El
primer programa escrito contenía una función main(), que a su vez llamaba la función printf() de la
biblioteca estándar stdio. El primer paso hacia escribir programas más legibles es descomponer su
funcionalidad en funciones (luego serán agrupadas en módulos).
1. Escribir una función que devuelva el máximo de dos números enteros: int maximo(int a, int b).
2. En el mismo archivo (funcion.c), escribir la función main() que defina dos enteros (darles
cualquier valor) y luego llamar la función para hallar el máximo. Imprimir el resultado.
3. Mover la función maximo a un archivo diferente. Guardar este nuevo archivo con el nombre
auxiliares.c. Escribir el archivo de encabezado correspondiente (.h).
4. Compilar sin enlazar, por separado los archivos funcion.c y auxiliares.c.
• gcc -c auxiliares.c y gcc -c funcion.c
5. Enlazar (link) ambos archivos objeto
• gcc auxiliares.o funcion.o -o funcion
6. Verificar el funcionamiento del programa.
Preprocesado
En el programa de "control de flujo"
1. Definir el tamaño de los arreglos utilizando #define TAM 10 (si no ha hecho aún, en este caso el
tamaño es 10).
2. Compilar deteniendo el proceso luego del preprocesado (para ejemplificar supondremos que el
archivo se llama control.c).
•
gcc -E control.c -o control.i
3. Inspeccionar la salida del preprocesdor control.i e identificar las ocurrencias de TAM.
Sugerencia: Si desea que la salida sea más sencilla, no incluya <stdio.h> y elimine los printf.
Tipos definidos
1. Escriba un programa para deducir el tamaño de las variables de tipo int, short int y long int
en el PC que esté trabajando.
2. Buscar información sobre los diferentes tipos de enteros en los microcontroladores MSP430.
(buscar por MSP430 data types)
3. Responda una de las siguientes preguntas:
1. ¿Qué ocurriría si un programa que usa una variable de tipo int es compilado para ambas
plataformas y dicha variable puede llegar a tomar valores tan altos como 40.000?
2. Considere un programa para un PC que lee un valor de un periférico de 32 bits y se guarda
en una variable de tipo int. ¿Que sucede si el mismo programa se compilara para
MSP430F2274?
4. Escriba dos archivos encabezados, uno para cada plataforma, donde se definan tipos enteros de
largo fijo (por ejemplo un tipo uint32_t para enteros sin signo de 32 bits.
5. Finalmente investigue la existencia y el uso de una biblioteca stdint.h para su plataforma.
Lecturas recomendadas
•
•
•
•
Brian W. Kernighan, Dennis M. Ritchie, "El Lenguaje de Programación C", Pearson Education, ISBN:
968-880-205-0, 1991.
Jack G. Ganssle, “A Firmware Development Standard”, The Ganssle Group, 2007.
The Sherrill Group Georgia Institute of Technology, "C Programming Tutorial", accesible en:
http://vergil.chemistry.gatech.edu/resources/programming/c-tutorial/toc.html.
Brian W. Kernighan , "Programming in C: A Tutorial", accesible en: http://www.lysator.liu.se/c/bwktutor.html.
Notas:
1. Algunos de los ejercicios fueron tomados y adaptados de los laboratorios correspondientes del
curso "Procesadores Digitales de Señal".
Descargar