Grupo_7_208006_SE

51
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 1

description

Desarrollo de software para sistemas embebidos, lenguaje assembler y aplicaciones

Transcript of Grupo_7_208006_SE

Page 1: 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

Page 2: Grupo_7_208006_SE

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

Page 3: Grupo_7_208006_SE

TABLA DE CONTENIDO

Pág.

INTRODUCCION_________________________________________________ 3

FASE1. ASSEMBLER_____________________________________________ 4

Introducción a la programación en ensamblador______________________ 5

3

Page 4: Grupo_7_208006_SE

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

Page 5: Grupo_7_208006_SE

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

Page 6: Grupo_7_208006_SE

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

Page 7: Grupo_7_208006_SE

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

Page 8: Grupo_7_208006_SE

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

Page 9: Grupo_7_208006_SE

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

Page 10: Grupo_7_208006_SE

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

Page 11: Grupo_7_208006_SE

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

Page 12: Grupo_7_208006_SE

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

Page 13: Grupo_7_208006_SE

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

Page 14: Grupo_7_208006_SE

Instrucciones

Estas son las todas las instrucciones que hay para poder programar el Pic 16c5x,

16c64, 16c71, 16c74, 16c84.

14

Page 15: Grupo_7_208006_SE

15

Page 16: Grupo_7_208006_SE

Las anteriores son algunas de las formas detalladas de las instrucciones.

16

Page 17: Grupo_7_208006_SE

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

Page 18: Grupo_7_208006_SE

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

Page 19: Grupo_7_208006_SE

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

Page 20: Grupo_7_208006_SE

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

Page 21: Grupo_7_208006_SE

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

Page 22: Grupo_7_208006_SE

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

Page 23: Grupo_7_208006_SE

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

Page 24: Grupo_7_208006_SE

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

Page 25: Grupo_7_208006_SE

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

Page 26: Grupo_7_208006_SE

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

Page 27: Grupo_7_208006_SE

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

Page 28: Grupo_7_208006_SE

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

Page 29: Grupo_7_208006_SE

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

Page 30: Grupo_7_208006_SE

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

Page 31: Grupo_7_208006_SE

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", &nota)

if (nota>9){

printf("Sobresaliente");}

else if(nota >=7){

printf("Notable);}

else if(nota >=5){

31

Page 32: Grupo_7_208006_SE

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

Page 33: Grupo_7_208006_SE

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

Page 34: Grupo_7_208006_SE

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

Page 35: Grupo_7_208006_SE

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

Page 36: Grupo_7_208006_SE

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

Page 37: Grupo_7_208006_SE

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

Page 38: Grupo_7_208006_SE

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