Sie sind auf Seite 1von 20

UNIVERSIDAD NACIONAL ABIERTA Y A DISTANCIA

SISTEMAS EMBEBIDOS



TRABAJO COLABORATIVO 2


DESARROLLO DE SOFTWARE PARA SISTEMAS EMBEBIDOS

LUIS CARLOS REMON COTES
NARCISO ORTIZ RUIZ
JHOAN BARRAZA BARRIOS
PEDRO ELIAS MUOS
GRUPO
208006_5

TUTOR
OSCAR IVAN VALDERRAMA

FECHA
06/11/2012


1. INTRODUCCION
Para 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 MICROCONTROLADOR
Diseo
En 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 Ensamblador

1-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 C
Tomaremos en cuenta este ejemplo, escrito para el compilador Hitech PICC.
#include <pic.h> // 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<60000; c++)
{ // Llave de apertura del bloque de for
/* este bloque est vaco, solo
cuenta c desde 0 hasta 59999 */
} // Llave de cierre del bloque de for
} // Llave de cierre del bloque de pausa

void main(void)
{ // Llave de apertura del bloque de main
TRISB0 = 0; // Configurar pin RB0 como salida
while(1) // Bucle infinito
{ // Llave de apertura del bloque de while
RB0 = 1; // Setear bit RB0
pausa(); // Llamar funcin pausa
RB0 = 0; // Limpiar bit RB0
pausa(); // Llamar funcin pausa
} // Llave de cierre del bloque de while
} // Llave de cierre del bloque de main
Los elementos ms notables de un programa en C son las sentencias, las
funciones, las directivas, los comentarios y los bloques. A continuacin, una breve
descripcin de ellos.
Los Comentarios
Los comentarios tienen el mismo propsito que en ensamblador: documentar y
adornar el cdigo. los comentarios sirven para mostrarnos dnde empieza y
termina cada bloque. Es todo texto que sigue a las barritas // y todo lo que est
entre los signos /* y */. Se identifican fcilmente porque suelen aparecer en color
verde.


Ejemplos.
// ste es un comentario simple

/*
sta es una forma de comentar varias lneas a la vez.
Sirve mucho para enmascarar bloques de cdigo.
*/


Las Sentencias
Un programa en C, en lugar de instrucciones, se ejecuta por sentencias.
Una sentencia es algo as como una mega instruccin, que hace lo que varias
instrucciones del ensamblador.
Salvo casos particulares, donde su uso es opcional, una sentencia debe finalizar
con un punto y coma (;). As que tambin podemos entender que los ; sirven para
separar las sentencias. Alguna vez le que el compilador C lee el cdigo como si lo
absorbiera con una caita, lnea por lnea, una a continuacin de otra (evadiendo
los comentarios por supuesto). Por ejemplo, la funcin main del programa de
arriba bien pudo escribirse del siguiente modo.
void main(void) { TRISB0=0; while(1) { RB0=1; pausa(); RB0=0; pausa(); } }
Podrs deducir que los espacios y las tabulaciones solo sirven para darle un
aspecto ordenado al cdigo. Es una buena prctica de programacin aprender a
acomodarlas.
Las sentencias se pueden clasificar en sentencias de asignacin, sentencias
selectivas, sentencias iterativas, de llamadas de funcin, etc.
Los Bloques
Un bloque establece y delimita el cuerpo de las funciones y algunas sentencias
mediante llaves ({}).
Como ves en el ejemplo de arriba, las funciones main y pausa tienen sus bloques,
as como los bucles while y for. Podrs ver cmo las tabulaciones ayudan a
distinguir unos bloques de otros. Afortunadamente, los editores de los buenos
compiladores C pueden resaltar cules son las llaves de inicio y de cierre de cada
bloque. Te ser fcil acostumbrarte a usarlas.



Las Directivas
Son conocidas en el lenguaje C como directivas de preprocesador, de
preprocesador porque son evaluadas antes de compilar el programa. Como
pasaba en el ensamblador, las directivas por s mismas no son cdigo ejecutable.
Suelen ser indicaciones sobre cmo se compilar el cdigo.
Entre las pocas directivas del C estndar que tambin son soportadas por los
compiladores C para PICs estn #include (para incluir archivos, parecido al
assembler), #define (mejor que el #define del ensamblador) y las #if, #elif, #endif y
similares. Fuera de ellas, cada compilador maneja sus propias directivas y sern
tratadas por separado.

Las Funciones
Si un programa en ensamblador se puede dividir en varias subrutinas para su
mejor estructuracin, un programa en C se puede componer de funciones. Por
supuesto que las funciones son muchsimo ms potentes y, por cierto, algo ms
complejas de aprender. Por eso ni siquiera el gran espacio que se les dedica ms
adelante es suficiente para abarcarlas. Pero, no te preocupes, aprenderemos de a
poco.
En un programa en C puede haber las funciones que sean posibles, pero la nunca
debe faltar la funcin principal, llamada main. Donde quiera que se encuentre, la
funcin main siempre ser la primera en ser ejecutada.

Variables y Tipos de Datos
En ensamblador todas nuestras variables de programa eran registros de la RAM
crudos, es decir, datos de 8 bits sin formato. En los lenguajes de alto nivel estos
registros son tratados de acuerdo con formatos que les permiten representar
nmeros de 8, 16 32 bits (a veces ms grandes), con signo o sin l, nmeros
enteros o decimales. Esos son los tipos de datos bsicos.
Las variables de los compiladores pueden incluso almacenar matrices de datos del
mismo tipo (llamadas arrays) o de tipos diferentes (llamadas estructuras). Estos
son los tipos de datos complejos.




Los siguientes son los principales tipos de datos bsicos del lenguaje C:
Tabla de variables y tipos de datos del lenguaje C
Tipo de dato Tamao Rango
char 8 0 a 255 -128 a 127
signed char 8 -128 a 127
unsigned char 8 0 a 255
(signed) int 16 -32,768 a 32,767
unsigned int 16 0 a 65,536
(signed) long 32 -2,147,483,648 a 2,147,483,647
unsigned long 32 0 a 4,294,967,295
float 32 +/- 1.18E38 a +/- 3.40E+38


























CONCLUSION

Das könnte Ihnen auch gefallen