Grupo_7_208006_SE
description
Transcript of Grupo_7_208006_SE
FASE 3
DESARROLLO DE SOFTWARE
PARA SISTEMAS EMBEBIDOS
SISTEMAS EMBEBIDOS
208006_7
Alejandro Cano Mosquera
Código: 16.375.904
Luis Humberto Morales González
Código: 6.115.356
Carlos Fernando Escalante Arciniegas
Código 94.476.240
Gustavo A. Zúñiga p.
87.064.660
Héctor F. Valenzuela V.
14.477.623
Tutor:
Oscar Iván Valderrama
Universidad Nacional Abierta y a Distancia (UNAD)
Programa de Ingeniería Electrónica
2015 – 1
1
INTRODUCCION
Mediante la estrategia de aprendizaje de trabajo colaborativo, se elabora la presente
actividad con el fin de crear un documento final que contenga los aportes, ideas y
discusiones de cada uno de los integrantes del grupo. Anexo a esto se realiza
interacción grupal, para consolidar el espíritu de compañerismo y colaboración que es
una de las metas de la UNAD, para formarnos como profesionales íntegros
Después de investigar acerca de la programación en assembler y en lenguaje C se
desarrolla un pequeño manual, el lenguaje ensamblador es el sistema alfanumérico
para escribir código máquina mediante expresiones abreviadas (mnemotécnicos). En
este la compilación es más complicada porque incluye la conversión de operaciones
matemáticas complejas, comandos de lenguaje natural o tipos de comandos complejos.
Cada ordenador tiene su propio lenguaje ensamblador. Es usado principalmente
porque hay aplicaciones o programas que deben tratar directamente con los registros
de la máquina, la memoria, dispositivos de E/S, entre otros.
Se realizó la práctica correspondiente a esta fase del aprendizaje, la cual se hizo con el
software CodeWarrior, extraído de: sicort.cloudapp.net/CodeWarrior.rar, se
siguieron los pasos que daba la guía, en la cual se presenta de manera resumida la
forma de crear, compilar y depurar un proyecto, con esto se adquieren los
conocimientos y competencias en uno de los lenguajes de programación de medio y
bajo nivel de mayor utilización en la programación de este tipo de dispositivos como lo
es el assembler, así como en el uso de las diferentes herramientas que pueden hacer
parte de un sistema de desarrollo enfocado a un determinado dispositivo, el cual fue el
MCU MC68HC908JL3.
El lenguaje C se conoce como un lenguaje de medio nivel, pues podríamos situarlo
entre los lenguajes de bajo nivel o de máquina (ensamblador) y los de alto nivel como
el PASCAL, por ejemplo. Ofrece un conjunto básico de sentencias de control y de
manipulación de datos que nos permitirá construir sentencias y estructuras de nivel
más alto. En la actualidad existen numerosos compiladores de C.
2
TABLA DE CONTENIDO
Pág.
INTRODUCCION_________________________________________________ 3
FASE1. ASSEMBLER_____________________________________________ 4
Introducción a la programación en ensamblador______________________ 5
3
Fase 1. Assembler
Realice un pequeño manual de cómo programar microcontroladores y
microprocesadores en Assembler. Describa los diferentes ensambladores y
macroensambladores.
El lenguaje ensamblador marca un buen punto de partida para el estudiante puesto que
representa un estudio profundo de cualquier microcontrolador tanto en su estructura
como en su juego de instrucciones, brindando las bases suficientes para adentrarse en
el mundo de la programación y desarrollo de aplicaciones con los microcontroladores.
Primero que todo debemos saber que el lenguaje ensamblador, o assembler (assembly
language en inglés), es un lenguaje de programación de bajo nivel para los
computadores, microprocesadores, microcontroladores y otros circuitos integrados
programables. Es un lenguaje de bajo nivel ya que es la representación más directa de
los códigos de instrucción mediante nemónicos, un nemónico es un vocablo que en
lenguaje ensamblador representa un código de instrucción binario, los nemónicos se
emplean para facilitar el aprendizaje, por parte del programador, de los diferentes
códigos que soporta un determinado dispositivo. Toda programación realizada en
lenguaje ensamblador debe ser compilada o traducida a código de máquina para que el
dispositivo pueda entenderla.
4
INTRODUCCIÓN A LA PROGRAMACIÓN EN ENSAMBLADOR
Desde que se concibe un programa hasta que se graba en la memoria del microcontrolador, suceden una serie de operaciones que se muestran en la Figura 1.
Figura 1. Organigrama de la secuencia a seguir para el grabado del microcontrolador.
5
El primer paso de un diseño basado en microcontrolador consiste en escribir el código
fuente del programa en el lenguaje seleccionado. Posteriormente, si el lenguaje usado
ha sido el ensamblador, se convierte a código ejecutable mediante el uso de un
programa de ensamblador como el de la empresa Microchip, que se llama MPASM.
La depuración y simulación se realizarán mediante el simulador software MPSIM
(entorno DOS), MPLAB (entorno Windows), o como es nuestro caso Code Warrior
Development Studio.
ESCRITURA DEL CÓDIGO FUENTE
El código fuente del lenguaje ensamblador está estructurado en columnas. Cualquier
texto que comience en la primera columna se considerará una etiqueta y será parte del
campo de etiquetas. Las siguientes tres columnas contienen el campo de instrucciones,
el campo de datos y el campo de comentarios. Los comentarios deben empezar con
punto y coma (;) y pueden ir también en la primera columna.
Campo de etiquetas
Las etiquetas son nombres de subrutinas o secciones de código fuente. Dando
nombres a partes del programa, se posibilita que las instrucciones puedan saltar o
hacer referencia a esas partes sin necesidad de recordar las direcciones físicas donde
están ubicadas. El ensamblador MPASM permite etiquetas de hasta 32 caracteres. Una
etiqueta puede ir seguida de dos puntos (:), espacios, tabuladores o RETURN. Deben
empezar por un carácter alfanumérico o de subrayado (_) y pueden contener cualquier
combinación de caracteres alfanuméricos.
Campo de instrucciones
La segunda columna corresponde al campo de instrucciones. Puede ser una
instrucción del microcontrolador o una instrucción para el ensamblador, llamada
directiva.
6
Campo de datos
Contiene datos u operandos para las instrucciones. En los PICs, los datos pueden ser
un registro, un bit de un registro, una etiqueta o un número constante (llamado literal).
Algunas instrucciones no llevan datos. Si una instrucción necesita múltiples datos,
deben separarse por comas (,).
La especificación de la base en la que se expresan los datos u operandos es opcional:
d’65’, b’01000001’,0x41, o’101’ y ‘A’ son el mismo dato. El sufijo d o D se emplea para
expresar un valor en decimal. El sufijo b o B expresa un valor en binario.
Para expresar un valor en hexadecimal se emplea el sufijo 0x ó 0X. Un número en base
octal se representa mediante el sufijo o ó O. Finalmente, un valor se puede expresar
mediante un carácter ASCII si se encierra entre comillas simples como ‘A’.
Campo de comentarios
El último campo es el del comentario, siempre que haya un punto y coma (;) como
primer carácter. Puede colocarse en cualquier lugar del código fuente.
Los comentarios en ensamblador son muy importantes. Los comentarios deben
describir las tareas que realizan las instrucciones y/o subrutinas. Sin comentarios, es
muy difícil descifrar, algunos días después, el código fuente que uno mismo ha creado.
El listado que se presenta a continuación en la Figura 2 presenta el aspecto del código
fuente del programa EJEMPLO1.ASM con los campos de etiquetas, instrucciones,
datos y comentarios recuadrados para su clara distinción.
7
Figura 2. Listado del programa EJEMPLO1.ASM.
Convenciones en la escritura del código fuente
Para hacer la tarea del programador más grata, se usan algunas convenciones. Con
ellas, se facilita la revisión y comprensión de un programa.
Algunas de las convenciones más utilizadas son:
Los ficheros de código fuente llevarán la extensión *.ASM o *.SRC
Los ficheros de listado llevarán la extensión *.LST
Los ficheros de código objeto llevarán la extensión *.OBJ
Los ficheros ejecutables llevarán la extensión *.HEX
Los ficheros de errores de ensamblado llevarán la extensión *.ERR
Los nemónicos escritos en mayúsculas hacen que el código escrito sea
más visible.
Comentarios explicando cada línea de código.
El espacio entre caracteres se escribe “_”. RB0_ES_1 es más fácil de
leer que RB0ES1
8
El primer programa: EJEMPLO1.ASM
Vamos a ir examinando las distintas partes del programa EJEMPLO1.ASM y
explicando cada una de ellas.
Directivas Una directiva es un comando escrito en el código fuente para realizar un
control directo o ahorrar tiempo a la hora de ensamblar. El resultado de incorporar
directivas se puede ver en el fichero *.LST después de ensamblar el programa.
En el programa EJEMPLO1.ASM aparecen las siguientes directivas:
LIST ® permite elegir, entre otras cosas, el tipo de microcontrolador a utilizar (P),
número de caracteres por línea (C), tamaño de los tabuladores (B), base de
numeración por defecto (R), niveles de mensajes de salida (W), etc.
EQU ® se utiliza para asignar valores a las etiquetas deseadas. Así, Resultado,
tiene asignado el valor 0x10, y puede referirse a un registro de la memoria de
datos del PIC.
ORG ® indica al ensamblador dónde debe comenzar a colocar las instrucciones
en la memoria de programa. Es decir, es el Origen para todo el código que
sigue. La dirección de comienzo (origen) es en la posición 0, debido a que la
familia de microcontroladores PIC de gama media después del encendido o
RESET siempre ejecutan la instrucción situada en la dirección0. Se denomina
Vector de Reset. La dirección 4 es el Vector de Interrupción. Si se genera una
interrupción el microcontrolador ejecuta la instrucción que se encuentre aquí. Es
una buena práctica dejar libre la dirección 4 por si más adelante deseamos
añadir capacidad de interrupción a nuestro programa. El programa salta por
encima del Vector de interrupción y comienza en la dirección 5.
INCLUDE ® permite añadir listados de programas al listado del programa actual.
END ® indica al ensamblador el final del código fuente, donde ha de finalizar el
proceso de ensamblado
9
Código del programa
Las tres instrucciones que siguen a la etiqueta Inicio realizan la suma de dos números
literales, 7 y 6, y guardan el resultado de la suma en la posición de memoria 0x10
etiquetada como Resultado.
Figura 3. Detalle del listado del programa EJEMPLO1.ASM.
Por último, nop es una instrucción que produce que el PIC no haga nada, significa no
operación.
Entorno de desarrollo MPLAB-IDE
Para editar, compilar y depurar los programas fuente de los microcontroladores PIC
utilizaremos el entorno de desarrollo MPLAB IDE 6.40, basado en ventanas y que se
puede bajar gratis a través de Internet. Además es gráfico, funcionando perfectamente
bajo Windows.
Desde MPLAB IDE es posible abrir un fichero en ensamblador (*.asm) (fichero fuente) y
ensamblarlo para poder obtener el fichero de entrada de un grabador (*.hex) (fichero
binario), pero también es posible el uso de proyectos que utilicen varios *.asm,
permitiendo así reutilizar código con mayor facilidad, al ser este más modular. También
es posible elegir el tipo de microcontrolador sobre el que simular y activar el modo de
simulación o depuración (debugger) denominado MPLAB SIM.
10
Entorno de desarrollo MPLAB-IDE
Creando un proyecto nuevo.
Para generar el código ejecutable de un microcontrolador, primero hay que generar el
fichero fuente (*.asm) donde se escribe el programa en lenguaje ensamblador; y luego
hay que ensamblarlo para obtener el fichero ejecutable o binario (*.hex) que será el
utilizado por el grabador para volcarlo sobre la memoria de programa del dispositivo.
Desde MPLAB-IDE es posible escribir el programa fuente (*.asm), ensamblarlo para
obtener el fichero ejecutable o binario (*.hex), grabarlo a un dispositivo, simular su
funcionamiento y depurar el código.
11
Creando el fichero fuente.
1. Seleccionad File>New .
Se abre una ventana en blanco sobre la que se escribe el código de nuestro programa:
Listado del programa EJEMPLO1.ASM.
Creando el fichero fuente
12
2. Después de copiar el código anterior, seleccionar File>Save y guardar el fichero en
un directorio determinado con el nombre ejemplo1.asm.
Creando un proyecto.
El siguiente paso para desarrollar una aplicación desde MPLAB-IDE es creando un
proyecto, la forma más sencilla es utilizar la herramienta MPLAB Project Wizard.
1. Abrir la herramienta MPLAB Project Wizard seleccionando Project>Project
Wizard.
2. Elegir el modelo de microcontrolador PIC16F84.
3. Confirmar la localización de Microchip Toolsuite, y seleccionad MPASM
Assembler.
4. Introducir un nombre para denominar el proyecto (Proyecto1) y seleccionar el
directorio donde se desea guardar.
5. Añadir el fichero fuente creado anteriormente (ejemplo1.asm) al proyecto.
6. Pulsar el botón de Finalizar para salir del asistente.
Ensamblando el proyecto.
Una vez generado el proyecto, hay que ensamblarlo, para ello, Seleccionar
Project>Build all.
Si el proyecto no se ensambla correctamente, comprobar los mensajes de error
obtenidos y volver a ensamblar.
Al ensamblar con éxito se genera el fichero ejecutable ejemplo1.hex.
13
Instrucciones
Estas son las todas las instrucciones que hay para poder programar el Pic 16c5x,
16c64, 16c71, 16c74, 16c84.
14
15
Las anteriores son algunas de las formas detalladas de las instrucciones.
16
TIPOS DE ENSAMBLADORES
Ensambladores cruzados: Se denominan así a los ensambladores que se utilizan en
una computadora que posee el procesador diferente al que tendrán las computadoras
donde se va a ejecutar el programa objeto producido. El empleo de este tipo permite
aprovechar el soporte de medios físicos y de programación que ofrecen las maquinas
potentes para desarrollar programas que luego los van a ejecutar sistemas muy
especializados en determinados tipos de tareas
Ensambladores residentes: Son aquellas que permanecen en la memoria principal de
la computadora y cargar para su ejecución al programa objeto producido. Este tipo de
ensamblador tiene la ventaja de que se puede comprobar inmediatamente el programa
sin necesidad de transportarlo de un lugar a otro, como se hacía en crossassembler, y
sin necesidad de programas simuladores. Sin embargo, puede presentar problemas de
espacio de memoria, ya que el traductor ocupa espacio que no puede ser utilizado por
el programador.
Microensambladores: Al programa que indica al intérprete de instrucciones de la CPU
como debe actuar se le denomina microprograma. El programa que ayuda a realizar
este microprograma se llama micro ensamblador. Existen procesadores que permiten
la modificación de sus microprogramas, para lo cual se utilizan Microensambladores.
Ensambladores de una fase: Leen una línea y la traducen directamente para producir
una instrucción de lenguaje maquina o la ejecuta si se trata de una pseudosinstrucción.
Se construye la tabla de símbolos a medida que aparecen las definiciones de variables,
etiquetas, etc. Debido a su forma de traducción estos ensambladores obligan a definir
los símbolos antes de ser empleados para que, cuando aparezca una referencia a un
determinado símbolo en una instrucción, se conozca la dirección de dicho símbolo y
se pueda traducir de forma correcta.
17
Ensambladores de dos fases: Realiza la traducción en dos etapas: 1° Fase leen el
programa fuente y construyen la tabla de símbolos, 2° Fase vuelve a leer el programa
fuente y pueden ir traduciendo totalmente pues reconocen la totalidad de los símbolos.
Estos ensambladores son más utilizados en la actualidad.
Macroensambladores: Son ensambladores que permiten el uso de
macroinstrucciones. Debido a su potencia, normalmente son programas robustos que
no permanecen en memoria una vez generado el programa objeto. Puede variar la
complejidad de los mismos, dependiendo de las posibilidades de definición y
manipulación de las macroinstrucciones, pero normalmente son programas bastante
complejos.
Existen varios ensambladores disponibles para ambiente MS-DOS: el IBM Macro
Assembler, el Turbo Assembler de Borland, el Turbo Editassm de Speedware, por citar
algunos. Una breve descripción de cada uno se proporciona a continuación:
Macro Ensamblador IBM: Está integrado por un ensamblador y un
macroensamblador. En gran medida su funcionamiento y forma de invocarlo es
sumamente similar al de Microsoft. Su forma de uso consiste en generar un archivo
fuente en código ASCII, se procede a generar un programa objeto que es ligado y se
genera un programa .EXE. Opcionalmente puede recurrirse a la utilería EXE2BIN de
MS-DOS para transformarlo a .COM. Es capaz de generar un listado con información
del proceso de ensamble y referencias cruzadas.
Macro Ensamblador de Microsoft: Dependiendo de la versión, este ensamblador es
capaz de soportar el juego de instrucciones de distintos tipos de microprocesadores
Intel de la serie 80xx/80x86. En su versión 4.0 este soporta desde el 8086 al 80286 y
los coprocesadores 8087 y 80287. Requiere 128KB de memoria y sistema operativo
MS-DOS v2.0 o superior. Trabaja con un archivo de código fuente creado a partir de un
editor y grabado en formato ASCII. Este archivo es usado para el proceso de ensamble
y generación de código objeto. Posteriormente, y con un ligador, es creado el código
ejecutable en formato .EXE.
18
Turbo Editassm: Este es desarrollado por Speddware, Inc., y consiste de un ambiente
integrado que incluye un editor y utilerías para el proceso de ensamble y depuración.
Es capaz de realizar el ensamble línea a línea, conforme se introducen los
mnemónicos, y permite revisar listas de referencias cruzadas y contenido de los
registros. Este ensamblador trabaja con tablas en memoria, por lo que la generación
del código ejecutable no implica la invocación explícita del ligador por parte del
programador. Adicionalmente permite la generación de listados de mensajes e
información de cada etapa del proceso y la capacidad de creación de archivos de
código objeto.
Turbo Assembler: De Borland Intl., es muy superior al Turbo Editassm. Trabaja de la
misma forma, pero proporciona una interfaz mucho más fácil de usar y un mayor
conjunto de utilerías y servicios.
Realmente la diferencia entre los ensambladores radica en la forma de generar el
código y en las directivas con que cuente, aunque estas diferencias son mínimas. El
código ensamblador no cambia puesto que los microprocesadores con los que se va a
trabajar son comunes. Así, todos los programas que se creen con un ensamblador en
particular podrán ser ensamblados en otro, cambiando las pseudo-operaciones no
reconocidas por el equivalente indicado en el manual de referencia del paquete
empleado.
Fase 2. Software CodeWarrior
Descargue e instale el software CodeWarrior y realice la práctica planteada en la
lección 10 de la unidad 2. Desarrollo de software para sistemas embebidos,
capítulo 5. Prácticas básicas y aplicaciones del módulo del curso el cual puede
descargar de http://datateca.unad.edu.co/contenidos/208006/208006.zip. Anexe
informe y capturas de pantalla del proceso realizado.
19
Después de abrir el software le damos en crear un nuevo proyecto, seleccionamos el
dispositivo MC68HC908JL3 y en connections seleccionamos Full Chip Simulation,
después click en siguiente.
20
Luego de guardar el proyecto y escoger el lenguaje de programación Absolute
assembly le damos finalizar y aparece la ventana principal del IDE Code Warrior,
vamos a la carpeta main.asm, a partir de la carpeta llamada mainLoop escribimos el
código utilizado para este ejemplo.
LOOP0 LDA #$FF ; A = $FFLOOP1 INCA ; A = A + 1
CMP #3 ; A = 3?BNE LOOP1 ; Salto a LOOP1 si A!=3.LDA #$FF ; A = $FF = 255LDHX #$1234 ; H:X = $1234LDHX #$4321 ; H:X = $4321LDHX #0 ; H:X = $0000LDX #$FF ; X = $FF
LOOP2 INCX ; X = X + 1CPX #4 ; X = 4?BNE LOOP2 ; Salto a LOOP1 si A!=4.JMP LOOP0 ; Salto a LOOP0 (Se Repite el Ciclo)
21
Compilamos y si no tiene errores le damos click en debug se abre una nueva ventana
llamada True-Time Simulator & Real-Time Debugger que será empleada para simular
la ejecución del programa compilado.
22
Ahora solo resta ejecutar las instrucciones durante la simulación, En la barra de ‘Debug’ se observan los iconos encargados del control de esta.
Correr la aplicación paso a paso
Correr una subrutina sin entrar en ella
23
Correr hasta salir de una subrutina en curso
Reiniciar
Para programar un dispositivo, de acuerdo a lo que nos indica la guía, solo debemos cambiar
el tipo de conexión dependiendo del tipo de POD de programación que se vaya a utilizar; para
24
el caso del circuito descrito anteriormente se selecciona la opción ‘MON08 Interface’ en la
ventana principal del ambiente de desarrollo.
Al ejecutar el Debug se abre una ventana de opciones en la que se configuran
parámetros como la tasa de transferencia, puerto de comunicación y otros parámetros
que deben ser configurados adecuadamente para la correcta comunicación entre el PC
y el MCU.
Fase 3. Programación en C
Realice un pequeño manual de cómo programar microcontroladores y
microprocesadores en C.
Durante el desarrollo de su trabajo comparta en el foro de la actividad sus juicios,
pensamientos con los cuales obtuvo la definición de pertinencia del curso en el
programa académico. Allí podrá enriquecer sus apreciaciones para la
construcción final del trabajo.
Lenguaje C
25
El lenguaje C dispone de todas las ventajas de un lenguaje de programación de alto
nivel (anteriormente descritas) y le permite realizar algunas operaciones tanto sobre los
bytes como sobre los bits (operaciones lógicas, desplazamiento etc.). Las
características de C pueden ser muy útiles al programar los microcontroladores.
Además, C está estandarizado (el estándar ANSI), es muy portable, así que el mismo
código se puede utilizar muchas veces en diferentes proyectos. Lo que lo hace
accesible para cualquiera que conozca este lenguaje sin reparar en el propósito de uso
del microcontrolador. C es un lenguaje compilado, lo que significa que los archivos
fuentes que contienen el código C se traducen a lenguaje máquina por el compilador.
Todas estas características hicieron al C uno de los lenguajes de programación más
populares.
La figura anterior es un ejemplo general de lo que sucede durante la compilación de
programa de un lenguaje de programación de alto nivel a bajo nivel.
Conceptos de programación embebida en C:
El lenguaje de programación C fue desarrollado por Denis Ritchie en la década de
1970, en los Laboratorios Bell AT&T en Murray Hill, Nueva Jersey. Los desarrolladores
de UNIX necesitaban un lenguaje pequeño y compacto para escribir su código UNIX.
Así, C fue escrito conjuntamente por Ken Thompson y Dennis Ritchie.
26
El desarrollo de C fue el resultado del deseo de los programadores de jugar con Space
Travel. Habían estado jugando en el mainframe de su compañía, pero debido a su poca
capacidad de proceso y al tener que soportar 100 usuarios, Thompson y Ritchie no
tenían suficiente control sobre la nave para evitar colisiones con los asteroides. Por ese
motivo decidieron portar el juego a un PDP-7 de la oficina que no se utilizaba; pero esa
máquina no tenía sistema operativo, así que decidieron escribir uno. Finalmente
decidieron portar el sistema operativo del PDP-11 que había en su oficina, pero era
muy costoso, pues todo el código estaba escrito en lenguaje ensamblador. Entonces
decidieron usar un lenguaje de alto nivel y portátil para que el sistema operativo se
pudiera portar fácilmente de un ordenador a otro. Consideraron usar B, pero carecía de
las funcionalidades necesarias para aprovechar algunas características avanzadas del
PDP-11. Entonces empezaron a crear un nuevo lenguaje, C.
La justificación para obtener el ordenador original que se usó para desarrollar Unix fue
crear un sistema que automatizase el archivo de patentes. La versión original de Unix
se desarrolló en lenguaje ensamblador. Más tarde, el lenguaje C se desarrolló para
poder reescribir el sistema operativo.
En 1973, el lenguaje C se había vuelto tan potente que la mayor parte del kernel Unix,
originalmente escrito en el lenguaje ensamblador PDP-11/20, fue reescrita en C. Éste
fue uno de los primeros núcleos de sistema operativo implementados en un lenguaje
distinto al ensamblador. (Algunos casos anteriores son el sistema Multics, escrito
en PL/I, y Master Control Program para el B5000 de Burroughs, escrito en ALGOL en
1961).
El C de Kernighan y Ritchie es el subconjunto más básico del lenguaje que un
compilador debe de soportar. Durante muchos años, incluso tras la introducción del
ANSI C, fue considerado "el mínimo común denominador" en el que los programadores
debían programar cuando deseaban que sus programas fueran transportables, pues no
todos los compiladores soportaban completamente ANSI, y el código razonablemente
bien escrito en K&R C es también código ANSI C válido.
27
En las primeras versiones del lenguaje, la definición de funciones se hacía mediante un
'prototipo de función' (function prototype), el cual indicaba al compilador el tipo de
retorno de la función. Aunque este método tiene una gran desventaja respecto al
nuevo, debido a que no comprueba el número ni el tipo en la lista de argumentos; en
otras palabras, es mucho más fácil cometer errores al hacer una llamada a una función
con argumentos incorrectos.
Ventajas:
Lenguaje muy eficiente puesto que es posible utilizar sus características de bajo nivel
para realizar implementaciones óptimas.
A pesar de su bajo nivel es el lenguaje más portado en existencia,
habiendo compiladores para casi todos los sistemas conocidos.
Proporciona facilidades para realizar programas modulares y/o utilizar código o
bibliotecas existentes.
Proceso de compilación:
La compilación de un programa C se realiza en varias fases que normalmente son
automatizadas y ocultadas por los entornos de desarrollo:
Preprocesado consistente en modificar el código fuente en C según una serie de
instrucciones (denominadas directivas de preprocesado) simplificando de esta forma el
trabajo del compilador. Por ejemplo, una de las acciones más importantes es la
modificación de las inclusiones ( #include ) por las declaraciones reales existentes en el
archivo indicado.
Compilación que genera el código objeto a partir del código ya preprocesado.
Enlazado que une los códigos objeto de los distintos módulos y bibliotecas externas
(como las bibliotecas del sistema) para generar el programa ejecutable final.
28
Compilador de funciones incorporadas
Algunos compiladores proporcionan incorporado en las versiones de muchas de las
funciones de la biblioteca estándar de C, es decir, las implementaciones de las
funciones que se escriben en el archivo objeto compilado, y el programa llama a la
función de las versiones en lugar de las funciones de la C biblioteca compartida fichero
objeto. Esto reduce la llamada a la función de arriba, sobre todo si las llamadas a
funciones son reemplazadas por las variantes en línea, y permite otras formas de
optimización, pero puede causar confusión en la depuración.
Sin embargo, las funciones integradas deben comportarse como funciones ordinarias,
de conformidad con la norma ISO C. La implicación principal es que el programa debe
ser capaz de crear un puntero a estas funciones mediante la adopción de su dirección,
e invocar a la función a través de ese puntero. Si dos punteros a la misma función se
derivan en dos unidades de traducción diferente en el programa, estos dos punteros
deben comparar igual, es decir, la dirección viene por la resolución del nombre de la
función, que tiene enlazado externo.
Herramientas de Programación:
Al programar en C, es habitual usar algunas herramientas de programación de uso muy
extendido, sobre todo en entorno de tipo unix:
make: Herramienta para automatizar el proceso de compilación, enlazado, etc.
lint: Herramienta utilizada para detectar código sospechoso, confuso o incompatible
entre distintas arquitecturas
valgrind: Herramienta utilizada para detectar posibles fugas de memoria.
gdb : Debugger de GNU utilizado para seguir la ejecución del programa.
dbx : Debugger que suele venir instalado con todos los UNIX.
ddd : Interfaz gráfico para el depurador gdb o dbx.
29
Biblioteca C:
Una biblioteca de C es una colección de funciones utilizadas en el lenguaje de
programación C. Las bibliotecas más comunes son la biblioteca estándar de C y la
biblioteca del estándar, la cual provee las especificaciones de los estándares que son
ampliamente compartidas entre bibliotecas. La biblioteca ANSI C estándar, incluye
funciones para la entrada y salida de archivos, alojamiento de memoria y operaciones con
datos comunes: funciones matemáticas, funciones de manejo de cadenas de texto y funciones
de hora y fecha.
Otras bibliotecas C son aquellas utilizadas para desarrollar sistemas Unix, las cuales proveen
interfaces hacia el núcleo. Estas funciones son detalladas en varios estándares tales
como POSIX y el Single UNIX Specification.
Ya que muchos programas han sido escritos en el lenguaje C existe una gran variedad de
bibliotecas disponibles. Muchas bibliotecas son escritas en C debido a que C genera
código rápido; los programadores luego generan interfaces a la biblioteca para que las rutinas
puedan ser utilizadas desde lenguajes de mayor nivel, tales como Java, Perl y Python
Funciones y sentencias de control:
En C, cualquier expresión finalizada en un punto y coma; forma una sentencia.
De todos los tipos, las estructuras (o sentencias) de control son las que controlan la
ejecución de las instrucciones de un programa.
La programación estructurada se basa en la utilización de un reducido número de
estructuras que permiten hacer que un programa sea suficientemente legible,
reduciendo considerablemente el número de errores, y facilitando enormemente la
detección y solución de estos.
La característica fundamental de la programación estructurada consiste en que todas
las estructuras tienen un único punto de entrada y un único punto de salida. Esto
permite descomponer fácilmente un problema en subproblemas, reduciendo la
complejidad y facilitando la programación.
30
En C diferenciamos tres tipos de sentencias de control:
Sentencias condicionales o selectivas.
Sentencias de iteración o repetitivas (bucles).
Sentencias de salto.
Sentencias condicionales;
Hay tres sentencias condicionales en C: if, else y switch
Sentencia if
La sentencia if nos permite elegir si se ejecuta o no un bloque de instrucciones. La
"expresión" del if es una expresión que debe ser evaluada: falsa si es cero y verdadera
si vale distinto de cero.
Sentencia else
Una sentencia if cuando incluye un else, permite ejecutar un bloque de código si se
cumple la condición y otro bloque diferente de código si la condición no se cumple.
Sentencia else colgante
Ejemplo:
#include<stdlib.h>
int main()
float nota:
printf ("Dame una nota: ")
scanf ("%f", ¬a)
if (nota>9){
printf("Sobresaliente");}
else if(nota >=7){
printf("Notable);}
else if(nota >=5){
31
printf("Aprobado");}
else{
printf ("Suspenso);}
return 0;
}
Sentencia switch
Permite seleccionar entre múltiples alternativas posibles. La expresión del switch es
una variable int o char, que puede tomar los valores, entre otros, dados por "opción 1",
"opcion 2", etc.
Sentencias de control Iteración:
Las instrucciones de iteración también llamados bucles, se ejecutan hasta que se
cumpla alguna condición predeterminada en el bucle en el caso del “for” o también en
los casos del “while” y “do-while”. Podemos destacar los antes mencionados bucles que
son los bucles for, while y do-while.
Bucles for:
Tienen una gran potencia y flexibilidad, y tienen un esquema muy sencillo y definido.
Este esquema es así:
for(inicialización del bucle; condición; incremento).
Ahora vamos a proceder a definir cada una de las partes del esquema básico,
inicialización (exp1): es una asignación que se utiliza para comenzar la variable del
bucle, esto es de la variable de la que parte el bucle. Condición (exp2): es una
expresión relacional que hace que el bucle concluya cuando no se cumpla. Por último
el incremento (exp3): es la parte que determina como cambia la variable hasta que el
bucle concluye. Es importante señalar que cada parte ha de ser separado por ; .Para
que deje de ejecutarse el bucle como antes hemos mencionado depende de la
condición, que deberá de ser falsa para que el bucle se detenga.
Debemos tener en cuenta que a diferencia de otros bucles este no llegará a ejecutarse
si la condición es falsa, ya que la condición se comprueba antes de entrar en el bucle.
32
Una de las utilidades del bucle for es en el bucle infinito, que pese a que puede hacerse
con todos los bucles es el for con el que se usa. Estos bucles infinitos son usados para
que el bucle no concluya nunca hasta que en el cuerpo se encuentre un break. Por otro
lado la construcción de este bucle for es muy sencilla, for (; ;).
Bucles while:
Tiene cierta semejanza con el bucle for, así es en el uso de una inicialización, una
condición y un incremento. Otra de sus similitudes es el momento en el que analizan la
condición que en ambos es antes de ejecutar el bucle. Sin embargo, en su esquema
básico aunque parezcan diferentes, son el mismo:
33
Algunas de las veces podremos saber antes de empezar el bucle cuantas veces se va a ejecutar.
Bucles do-while:
Este es el único bucle que al menos se va a ejecutar una vez puesto que este bucle examina la condición una vez se ha ejecutado el bucle, esto es, al final del mismoEste bucle es muy útil por ejemplo en menús dado que el menú debe de ejecutarse al menos una vez.
34
Sentencias de salto:
Hay cuatro sentencias de salto en C: break, return, goto y continúe.
Suelen estar condicionadas (que solo las ejecute el programa en un determinado caso).
Se desaconseja la utilización de este tipo de sentencia de control, sobre todo el goto,
ya que su uso implica un aumento de la probabilidad de cometer errores, dificulta la
legibilidad del código y es mucho más difícil corregir errores y cambiar secuencias de
código.
Sentencia break:
La instrucción de salto break se usa para interrumpir (romper) la ejecución normal de
un bucle, es decir, la instrucción break finaliza la ejecución de un bucle y, por tanto, el
control del programa se transfiere (salta) a la primera instrucción después del bucle.
Sentencia return
La instrucción de salto return es utilizada en lenguaje C para devolver el control de
ejecución desde la función que contiene el return a la rutina que la invocó y para indicar
el valor de retorno de una función.
Sentencia goto
La instrucción de salto goto se puede usar en un programa, para transferir
incondicionalmente el control del mismo a la primera instrucción después de una
etiqueta, o dicho de otra forma, al ejecutar una instrucción goto, el control del programa
se transfiere (salta) a la primera instrucción después de una etiqueta.
Sentencia continúe
La instrucción de salto continúe siempre se usa para interrumpir (romper) la ejecución
normal de un bucle. Sin embargo, el control del programa no se transfiere a la primera
instrucción después del bucle, como sí hace la instrucción break, es decir, el bucle no
finaliza, sino que, finaliza la iteración en curso, transfiriéndose el control del programa a
la condición de incremento de contadores y después a la condición de salida del bucle,
para decidir si se debe realizar una nueva iteración o no.
35
CONCLUSIONES
Se realizan investigaciones sobre distintos tipos de lenguajes para programar
microprocesadores y micro controladores, el lenguaje ensamblador o de máquina
considerada de bajo nivel es el sistema alfanumérico para escribir código máquina
mediante expresiones abreviadas (mnemotécnicos). En este la compilación es más
complicada porque incluye la conversión de operaciones matemáticas complejas,
comandos de lenguaje natural o tipos de comandos complejos. Cada ordenador tiene su
propio lenguaje ensamblador. Es usado principalmente porque hay aplicaciones o
programas que deben tratar directamente con los registros de la máquina, la memoria,
dispositivos de E/S, entre otros.
Se pudo realizar la parte práctica en línea a través del programa CodeWarrior, con el cual
tuvimos la oportunidad de adquirir conocimientos y experticia para la programación de
micros controladores; estas bases son fundamentales para realizar trabajos posteriores
relacionados con el diseño y montaje de circuitos electrónicos para sistemas embebidos
o para otras áreas del conocimiento.
Se realiza investigación correspondiente al lenguaje de programación en C, donde uno
de los objetivos de diseño del lenguaje C es que sólo sean necesarias unas pocas
instrucciones en lenguaje máquina para traducir cada elemento del lenguaje, sin que
haga falta un soporte intenso en tiempo de ejecución. Es muy posible escribir C a bajo
nivel de abstracción; de hecho, C se usó como intermediario entre diferentes lenguajes.
Dentro de las principales ventajas de programación en C están las siguientes:
Lenguaje muy eficiente puesto que es posible utilizar sus características de bajo nivel
para realizar implementaciones óptimas.
A pesar de su bajo nivel es el lenguaje más portado en existencia, habiendo
compiladores para casi todos los sistemas conocidos.
Proporciona facilidades para realizar programas modulares y/o utilizar código o
bibliotecas existentes.
36
BIBLIOGRAFÍA
Ignacio Angulo. Microcontroladores PIC la solución completa en un CHIP. Ed.
Paraninfo.
Taub Herbert. Circuitos digitales y Microprocesadores. Ed. Mc Graw Hill
Álvaro Pérez Roldán, Programación de un microprocesador con la ayuda de
lenguaje C, U. de A., 1997.
37
Microcontrolador PICI6F84, Desarrollo de proyectos. Enrique Palacios Municio,
Fernando Remiro Domínguez, Lucas J. López Pérez, Alfa omega. ISBN 84-
7897-600-0.
Tipos de ensambladores, extraído de:
http://informatica4194.webnode.mx/contactanos/tipos-de-ensambladores/
Hoja de Ruta - Aprendizaje Práctico Fase 3. Universidad Nacional Abierta y a
Distancia – UNAD escuela de ciencias básicas, tecnología e ingeniería curso:
28006 SISTEMAS EMBEBIDOS
Oscar Iván Valderrama Arias.
Software CodeWarrior, descargado desde: sicort.cloudapp.net/CodeWarrior.rar
http://programacion1-teoria.wikispaces.com/C.+Sentencias+de+Control
http://www.zator.com/Cpp/E4_10.htm
http://centrodeartigo.com/articulos-informativos/article_62548.html
http://es.wikipedia.org/wiki/C_(lenguaje_de_programaci%C3%B3n)
38