UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA
SISTEMAS EMBEBIDOS
TRABAJO COLABORATIVO 2
DESARROLLO DE SOFTWARE PARA SISTEMAS EMBEBIDOS
LUIS CARLOS REMON COTESNARCISO ORTIZ RUIZJHOAN BARRAZA
BARRIOSPEDRO ELIAS MUOSGRUPO208006_5
TUTOROSCAR IVAN VALDERRAMA
FECHA06/11/20121. INTRODUCCIONPara el diseo, creacin e
implementacin de un programa se hacen necesario etapas que van
desde el Diseo del algoritmo, codificacin del mismo, su traduccin a
lenguaje mquina, la prueba del programa y finalmente su depuracin.
Durante la etapa de diseo se plantea el problema a resolver y se
analizan las posibles soluciones, valindonos de esquemas como
diagramas de flujo para finalmente tomar como alternativa la que ms
se ajuste a nuestros requerimientos. La codificacin del programa
consiste en traducir el diseo obtenido en la etapa anterior en algn
lenguaje de programacin, para el caso de nuestro modulo en curso
estudiaremos los lenguajes ensamblador y lenguaje C. La traduccin
al lenguaje mquina es realizada por el compilador con el que
trabajemos este se encarga de crear un programa objeto, esto es, el
programa escrito como una secuencia de ceros y unos para que pueda
ser interpretado por el procesador. La prueba del programa consiste
en verificar que el programa funcione sin adecuadamente y sin
errores. Y finalmente en la etapa de depuracin se deben eliminar
las diferentes fallas detectadas en el programa durante la fase de
prueba.Durante el desarrollo de la presente actividad realizaremos
una exploracin por los contenidos de la Unidad II del mdulo
SISTEMAS EMBEBIDOS, explorando como primera medida el concepto de
programacin de sistemas embebidos utilizando el lenguaje Assembler
para lo cual se elaborara un manual con las instrucciones bsicas de
programacin haciendo uso de un compilador que est incluido en todos
los sistemas operativos con Windows (Debugger), tambin se incluirn
en esta fase del trabajo los diferentes ensambladores y
macroensambladores utilizados en el desarrollo de sistemas
embebidos. En la segunda fase de este trabajo realizaremos una
prctica de desarrollo de software para sistemas embebidos haciendo
uso de la herramienta de la familia Freescale denominada:
CodeWarrior. Y para finalizar el desarrollo del presente trabajo en
la fase tres abordaremos el concepto de programacin de
microcontroladores y microprocesadores en lenguaje C para lo cual
igual que en la primera fase se elaborara un manual con las
instrucciones bsicas de programacin.
Fase 1. Assembler
Realice un pequeo manual de cmo programar microcontroladores y
microprocesadores en Assembler. Describa los diferentes
ensambladores y macroensambladores.MANUAL DE PROGRAMACION DE
MICROCONTROLADORDiseoEn la etapa de diseo se plantea el problema a
resolver y se propone la mejor solucin, creando diagramas
esquemticos utilizados para el mejor planteamiento de la
solucin.
Codificacin
La codificacin del programa consiste en escribir el programa en
algn lenguaje de programacin. (En este caso en ensamblador).
Traduccin
La traduccin al lenguaje mquina es la creacin del programa
objeto, esto es, el programa escrito como una secuencia de ceros y
unos que pueda ser interpretado por el procesador.
Prueba del programa
La prueba del programa consiste en verificar que el programa
funcione sin errores, o sea, que haga lo que tiene que hacer.
Depuracin
La ltima etapa es la eliminacin de las fallas detectadas en el
programa durante la fase de prueba. La correccin de una falla
normalmente requiere la repeticin de los pasos comenzando desde el
primero o el segundo.
MACROENSAMBLADORES
Son ensambladores que permiten el uso de macroinstrucciones
(macros). Debido a su potencia, normalmente son programas robustos
que no permanecen en memoria una vez generado el programa objeto.
Pseudoinstrucciones para definir segmentos:
SEGMENT: Define el inicio de un nuevo segmento. Su formato es:
nombre SEGMENT alineacin combinacin clase
ENDS: Define el final de un segmento. Su formato es: nombre
ENDS
Los parmetros del SEGMENT son informacin para el ligador:
Alineacin: Define la direccin a partir de donde puede colocarse
el segmento:
PARA: La direccin inicial del segmento es un mltiplo de 16
(10h).
PAGE: La direccin inicial del segmento es donde empieza una
pgina (mltiplo de 100h).
WORD: La direccin inicial del segmento es una direccin par.
BYTE: EL segmento inicia donde sea.
Combinacin: Define la forma en que el segmento puede combinarse
con otros segmentos para que se tenga el mismo nombre y clase.
OMITIRLA: Segmento privado, es decir, no puede combinarse.
STACK: Segmento para usarse con el stack.
PUBLIC: Este segmento puede unirse con todos los segmentos del
mismo y la misma clase para formar una sola.
COMMON: Todos los segmentos del mismo nombre y clase se colocan
a partir de la misma direccin.
Cuando se tienen dos segmentos con el mismo nombre y clase y son
pblicos, al ligar se unen en un solo segmento no importando que
estn en archivos distintos. Cuando se usa la psudoinstruccin COMMON
van a utilizar el mismo espacio de memoria, si son de diferente
tamao en memoria, se toma el tamao del mayor bloque.
Clase: Indica el tipo de datos que contiene el segmento, siempre
se ponen entre comillas y pueden definirse propios. DATA: Datos.
CODE: Cdigo. STACK: Pila.
Pseudoinstrucciones para reservar memoria y definir
constantes:
DB: Sirve para reservar un byte en la memoria con un valor
determinado. Su formato es: [nombre] DB val1 [, val2, ...,
valn]
DW: Reserva un dato de dos bytes (una palabra) con un valor
inicial. Su formato es: [nombre] DW val1 [, val2, ..., valn] DD:
Reserva un dato de cuatro bytes (doble palabra) con un valor
inicial. Su formato es: [nombre] DD val1 [, val2, ..., valn] DQ:
Reserva un dato de ocho bytes (cudruple palabra) con un valor
inical. Su formato es: [nombre] DQ val1 [, val2, ..., valn]
DT: Reserva un dato de diez bytes con un valor inicial. Su
formato es: [nombre] DT val1 [, val2, ..., valn] vali representa
una expresin formada por nmeros en cualquiera de las siguientes
bases: XXXXb Binaria XXXXo Octal XXXXd Decimal XXXX Decimal XXXXh
Hexadecimal Tambin se pueden tener expresiones de esos nmeros con
los operadores de: + Suma - Resta Negacin (C2) * Multiplicacin /
Divisin Tambin pueden ser etiquetas o expresiones aritmticas que
involucren etiquetas o bien cadenas de caracteres, entre
apstrofes.
EQU: Permite definir constantes. Su formato es: etiq EQU val
ORG: Define un desplazamiento inicial para ensamblar las siguientes
lneas. Su formato es: ORG val
Pseudoinstrucciones para definir procedimientos:
PROC: Define el inicio de una subrutina. Nombre PROC tipo
ENDP: Define el final de una subrutina. Nombre ENDP
El tipo de la subrutina puede ser:
NEAR: Cercano.
FAR: Lejano.
OMITIRLO: Se define por omisin de tipo NEAR:
Un ensamblador de archivo, revisa errores de sintaxis, es decir,
revisa que el programa est bien escrito, ms no que funcione.
Para poner comentarios dentro del programa se inician con un ; y
todo lo que este a la derecha ser un comentario sobre el mismo
rengln.
La estructura del archivo quedara:
Datos SEGMENT PARA DATA
; Definicin de variables y constantes Datos ENDS
Pila SEGMENT PARA STACK STACK DW 100 DUP (0) ; Indica que se
tiene que repetir la instruccin n-veces con el ; valor que aparece
en los parntesis
Pila ENDS Codigo SEGMENT PARA CODE ASSUME DS:Datos, CS:Codigo,
SS:Pila, ES:NOTHING
; Sirve para indicarle al macroensamblador cuales segmentos
Tipos De Ensambladores
Aunque todos los ensambladores realizan bsicamente las mismas
tareas, podemos clasificarlos de acuerdo a caractersticas. As
podemos clasificarlos en:Ensambladores Cruzados
(Cross-Assembler):
Se denominan as los ensambladores que se utilizan en una
computadora que posee un procesador diferente al que tendrn las
computadoras donde va a ejecutarse el programa objeto producido.El
empleo de este tipo de traductores permite aprovechar el soporte de
medios fsicos (discos, impresoras, pantallas, etc.), y de
programacin que ofrecen las mquinas potentes para desarrollar
programas que luego los van a ejecutar sistemas muy especializados
en determinados tipos de tareas.
Ensambladores Residentes:Son aquellos que permanecen en la
memoria principal de la computadora y cargan, para su ejecucin, 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 haca en
Cross-assembler, 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. Asimismo, tambin ocupar memoria el programa fuente y
el programa objeto. Esto obliga a tener un espacio de memoria
relativamente amplio. Es el indicado para desarrollos de pequeos
sistemas de control y sencillos automatismo empleando
microprocesadores.La ventaja de estos ensambladores es que permiten
ejecutar inmediatamente el programa; la desventaja es que deben
mantenerse en la memoria principal tanto el ensamblador como el
programa fuente y el programa objeto.
Macroensambladores:Son ensambladores que permiten el uso de
macroinstrucciones (macros). Debido a su potencia, normalmente son
programas robustos que no permanecen en memoria una vez generados
el programa objeto. Puede variar la complejidad de los mismos,
dependiendo de las posibilidades de definicin y manipulacin de las
macroinstrucciones, pero normalmente son programas bastantes
complejos, por lo que suelen ser ensambladores residentes.
Microensambladores:Generalmente, los procesadores utilizados en
las computadoras tienen un repertorio fijo de instrucciones, es
decir, que el intrprete de las mismas interpretaba de igual forma
un determinado cdigo de operacin.El programa que indica al
intrprete de instrucciones de la UCP cmo debe actuar se denomina
microprograma. El programa que ayuda a realizar este microprograma
se llama microensamblador. Existen procesadores que permiten la
modificacin de sus microprogramas, para lo cual se utilizan
microensambladores.
Ensambladores de una fase:Estos ensambladores leen una lnea del
programa fuente y la traducen directamente para producir una
instruccin en lenguaje mquina o la ejecuta si se trata de una
pseudo instruccin. Tambin va construyendo la tabla de smbolos a
medida que van apareciendo las definiciones de variables,
etiquetas, etc.Debido a su forma de traduccin, estos ensambladores
obligan a definir los smbolos antes de ser empleados para que,
cuando aparezca una referencia a un determinado smbolo en una
instruccin, se conozca la direccin de dicho smbolo y se pueda
traducir de forma correcta. Estos ensambladores son sencillos,
baratos y ocupan poco espacio, pero tiene el inconveniente
indicado.
Ensambladores de dos fases:Los ensambladores de dos fases se
denominan as debido a que realizan la traduccin en dos etapas. En
la primera fase, leen el programa fuente y construyen una tabla de
smbolos; de esta manera, en la segunda fase, vuelven a leer el
programa fuente y pueden ir traduciendo totalmente, puesto que
conocen la totalidad de los smbolos utilizados y las posiciones que
se les ha asignado. Estos ensambladores son los ms utilizados en la
actualidad.
Ensambladores de alto nivel:Los ms sofisticados ensambladores de
alto nivel proporcionan abstracciones del lenguaje tales como:
Estructuras de control avanzadas Declaraciones e invocaciones de
procedimientos/funciones de alto nivel Tipos de datos abstractos de
alto nivel, incluyendo las estructuras/records, uniones, clases, y
conjuntos Procesamiento de macros sofisticado (aunque est
disponible en los ensambladores ordinarios desde finales 1960 para
el IBM/360, entre otras mquinas) Caractersticas de programacin
orientada a objetos
Fase 2. Software CodeWarrior Descargue e instale el software
CodeWarrior y realice la prctica planteada en la leccin 10 de la
unidad 2. Desarrollo de software para sistemas embebidos, capitulo
5. Prcticas bsicas y aplicaciones. Anexe informe y capturas de
pantalla del proceso realizado.
SIMULACION N1
SIMUACION N2
SIMULACION N3
SIMULACION N4
SIMULACION N5
SIMULACION N6
SIMULACION N7
SIMULACION N8
Fase 3. Programacin en C Realice un pequeo manual de cmo
programar microcontroladores y microprocesadores en C.
Programacin en C para Microcontroladores y Microprocesadores
C es un lenguaje bastante conciso y en ocasiones desconcertante.
Considerado ampliamente como un lenguaje de alto nivel, posee
muchas caractersticas importantes, tales como: programacin
estructurada, un mtodo definido para llamada a funciones y para
paso de parmetros, potentes estructuras de control, etc.Sin embargo
gran parte de la potencia de C reside en su habilidad para combinar
comandos simples de bajo nivel, en complicadas funciones de alto
nivel, y en permitir el acceso a los bytes y words del procesador.
En cierto modo, C puede considerarse como una clase de lenguaje
ensamblador universal. La mayor parte de los programadores
familiarizados con C, lo han utilizado para programar grandes
mquinas que corren Unix, MS-DOS, e incluso Windows (programacin de
drivers). En estas mquinas el tamao del programa no es importante,
y el interface con el mundo real se realiza a travs de llamadas a
funciones o mediante interrupciones DOS. As el programador en C slo
debe preocuparse en la manipulacin de variables, cadenas, matrices,
etc.Con los modernos microcontroladores de 8 bits, la situacin es
algo distinta. Tomando como ejemplo el 8051, el tamao total del
programa debe ser inferior a los 4 u 8K (dependiendo del tamao de
la EEPROM), y debe usarse menos de 128 o 256 bytes de RAM.
Idealmente, los dispositivos reales y los registros de funciones
especiales deben ser direccionados desde C. Las interrupciones, que
requieren vectores en direcciones absolutas tambin deben ser
atendidas desde C. Adems, se debe tener un cuidado especial con las
rutinas de ubicacin de datos para evitar la sobre escritura de
datos existentes.Uno de los fundamentos de C es que los parmetros
(variables de entrada) se pasan a las funciones (subrutinas) en la
pila, y los resultados se devuelven tambin en la pila. As las
funciones pueden ser llamadas desde las interrupciones y desde el
programa principal sin temor a que las variables locales sean sobre
escritas.Una seria restriccin de la familia 8051 es la carencia de
una verdadera pila. En un procesador como el 8086, el apuntador de
la pila tiene al menos 16 bits. Adems del apuntador de pila, hay
otros registros que pueden actuar como apuntadores a datos en la
pila, tal como el BP (Base Pointer). En C, la habilidad para
acceder a los datos en la pila es crucial. Como ya ha sido
indicado, la familia 8051 est dotada de una pila que realmente slo
es capaz de manejar direcciones de retorno. Con 256 bytes
disponibles, como mximo, para la pila no se pueden pasar muchos
parmetros y realizar llamadas a muchas funciones.
Otras consideraciones dignas de destacar para el C en un
microcontrolador son: Control de los perifricos internos y externos
del chip. Servicio de las interrupciones. Hacer el mejor uso de los
limitados conjuntos de instrucciones. Soportar diferentes
configuraciones de ROM/RAM. Un alto nivel de optimizacin para
conservar el espacio de cdigo. Control de la conmutacin de
registros. Soporte para los derivados de la familia (87C751, 80C517
etc.). El compilador Keil C51 contiene todas las extensiones para
el uso del lenguaje C con microcontroladores. Este compilador C
utiliza todas las tcnicas apuntadas por Intel con su PLM51, pero
aade caractersticas propias tales como la aritmtica en coma
flotante, la entrada/salida (I/O) con formato, etc. Se trata de la
implementacin del estndar ANSI C especfico para los procesadores
8051.Ventajas del lenguaje C frente al Ensamblador1-Mayor facilidad
de programacin. El lenguaje C dispone de un conjunto de operadores,
datos y comandos que le confieren, al mismo tiempo, potencia y
facilidad de programacin, lo que permite un tiempo de desarrollo de
programas mucho menor que con el lenguaje Ensamblador.
2-Portabilidad entre sistemas. Con el lenguaje C se asegura la
portabilidad entre diferentes plataformas hardware o software, lo
que quiere decir, por ejemplo, que un algoritmo implementado en C
en una plataforma con Linux puede ser adaptado, prcticamente sin
modificaciones, a un PIC. Esto permite el aprovechamiento de
numerosos algoritmos que se encuentran ya disponibles para otras
plataformas diferentes a los PIC. El Ensamblador, por el contrario,
ya se ha indicado que es fuertemente dependiente del hardware, por
lo que no permite su adaptacin de una plataforma a otra
distinta.3-Desarrollo de programas estructurados. El lenguaje C
permite desarrollar programas estructurados en funciones, bloques o
procedimientos, lo que proporciona una compartimentacin del cdigo.
Por el contrario, el Ensamblador no es un lenguaje estructurado, lo
que lleva a que los programas desarrollados en ensamblador sean
lineales, con el inconveniente que esto implica en lo que se
refiere a claridad del cdigo escrito.4-Fcil mantenimiento de los
programas. Por ser un lenguaje de compresin relativamente fcil.
A pesar de todas las ventajas indicadas para el lenguaje C, no
se puede prescindir totalmente del Ensamblador. ste, al estar ms
cercano al nivel del hardware que se programa, permite generar
cdigo ms compacto (menor nmero de instrucciones para realizar una
misma tarea), lo que lleva a una mayor velocidad de ejecucin.
Aunque el desarrollo de programas para microcontroladores es
posible realizarlo totalmente en Ensamblador, la utilizacin del
lenguaje C supone una alternativa muy interesante por su rapidez,
facilidad, y portabilidad, sin que esto signifique que este nuevo
enfoque venga a sustituir definitivamente al Ensamblador, en casos
en los que se necesita crear partes de cdigo sujetas a determinadas
restricciones ( reducido nmero de instrucciones, alta velocidad de
ejecucin,) se puede implementar esa parte de cdigo directamente en
Ensamblador dentro de un programa en C, consiguiendo de este modo
un cdigo mucho ms eficiente. Esta ventaja no la tienen otros
compiladores de Basic Pascal.
Estructura de un programa en CTomaremos en cuenta este ejemplo,
escrito para el compilador Hitech PICC. #include // Incluir este
archivo
/* La siguiente directiva establece la Palabra de Configuracin
*/ __CONFIG ( PWRTEN & WDTDIS & XT & UNPROTECT );
void pausa(void) { // Llave de apertura del bloque de pausa
unsigned int c; // Declarar variable c (de 16 bits) for(c=0; c